Zappa Drum Transcription Toolkit
The skills on this Mac that read a drum part, and everything already on disk about Frank Zappa's drum transcriptions, with Keep It Greasey pulled out in full.
Built 2026-09-08 · song locked: Keep It Greasey, s604777The short answer on Keep It Greasey. A large amount of work is already done. The stems are separated into fifteen parts and sitting in
/Users/Shared, three printed human transcriptions are on disk, the tempo has been measured against the recording, and a full validation pass ran on 2026-09-07 with zero repairs applied. Four specific defects are named and waiting.
1. The seven-stage skill stack
Each of these is a real skill with its own SKILL.md and scripts under ~/.claude/skills/. Invoke by name with the Skill tool rather than running the scripts by path.
/composite-stem-alignment
Builds one clean multitrack from several microphone captures of the same performance after each has been separated. Settles which mic owns which lane and applies one transform per mic.
"align the mics", "the offsets disagree", "which mic for the bass"
/multimic-stem-fix
Repairs a stem set where separation left phase cancellation or bleed between kit lanes. Runs before any onset detection, since a contaminated tom stem produces tom claims that are separator residue.
"the stems are bleeding", "kick and bass are cancelling"
/perfect-stem-read
The governing document. Enforces the order stem event, instrument identity, score timing, Guitar Pro lane last, so lane binning happens only at final encoding. Carries the recording-identity gate and the wrong-recording alignment controls.
"read the stems into notation", "which drum is that"
/drum-dynamics-from-audio
Fixes the velocity and articulation layer of a score that already has the right notes. This is the skill that turns quiet snare strokes into ghost notes by measuring the recording rather than by guessing.
"the dynamics are flat", "turn the quiet snares into ghost notes"
/stems-to-guitar-pro-drums
Turns drum stems into a Guitar Pro drum file ready for the Songsterr editor, recovering flams and ghost notes that a full-mix pass drops. This is the build step for a new tab.
"make a better drum tab from the stems", "turn the drum stem into Guitar Pro"
/audio-stems-to-midi
The cheaper first pass. Demucs plus crepe plus basic-pitch plus a librosa onset fallback for drums, with a theory JSON per song. Good for a rough map of where events sit.
"convert these stems to MIDI", "transcribe the stems"
/transcription-repair
Treats the best human transcription as the musical model and the stems as evidence testing single claims inside it. Carries the recording-identity gate, the alignment gate with wrong-recording controls, grid snapping, a two-hands playability check, and an append-only edit ledger.
"fix this drum tab against the stems", "the toms are in the wrong place"
/songsterr-drum-repair
Restores a drum staff on a community tab without damaging the rest of it. Written after the ghost sweep. Knows why accents come out as staccato and how to undo a bad revision.
"restore the ghost notes", "my revision broke someone's tab"
/notation-evidence-gate
Settles a notation-symbol dispute against the document that governs the symbol. Resolves ghost strokes, pedal hi-hat placement and X noteheads to the Weinberg drumset standard, then refuses any claim with no stated null model.
"what does this ghost flag mean", "did we prove that", "check the baseline"
/reference-class
Decides whether a number earned the right to ship. Six checks against a threshold cut from the population it filters, a density no musician would play, a filter that rejects nothing, and a missing chance baseline.
"is this number real", "the counts look high", "what is the null here"
/songsterr-upload
Puts a corrected Guitar Pro file onto Songsterr as a private tab synced to the real recording. Checks before import whether the file will lose tracks.
"upload this tab to Songsterr", "will this import lose tracks"
/songsterr-tab-guide
Builds a data-driven tab-guide page for a band's albums. This is the skill that produced the Zappa drum-transcription inventory covering three albums.
"which of Zappa's songs have no Songsterr tab", "are these tabs AI or hand-written"
2. Graders and gates that sit beside the line
| Skill | What it settles | When to reach for it |
|---|---|---|
/midi-drum-analysis | Reference library and analysis toolkit for MIDI drum tracks, including the rhythmic-event vocabulary the other skills borrow. | Before naming a fill or a groove type. |
/five-stem-song-analyst | Reads a five-stem song for what each part sets up and where the payoff lands. | Musical context ahead of a transcription pass. |
/stem-analyzer | Per-file measurement of a separated stem. | Checking whether a stem is clean enough to trust. |
/midi-to-tab | Converts a MIDI file to readable ASCII and .docx tablature. | Getting a printable page out of a finished MIDI. |
/album-tab-citation | Indexed library of twenty published tab books, Zappa included. | Finding a printed transcription to test a claim against. |
/impossible-guitar-parts | Grades a staff against what a human hand can do, and finds two players written onto one staff. | The pitched staves on the same file. |
/fraud-firewall | Runs the gate stack and returns one verdict before any done-claim. | Before any upload. |
3. The Zappa drum program, current state
This is not a fresh field. A repair program has been running since late August, and it has its own front door at zappa-program-scope.
The damage that started it
A sweep on 2026-08-29 and 30 read Songsterr's parenthesised noteheads as an error and submitted revisions removing them across twenty Zappa tabs. Sixteen of those strips are the current published revision. Norman Weinberg's 1994 Guidelines for Drumset Notation, page 20, plate Ex. 11, prescribes exactly that notehead for a ghost stroke, and its wording covers cymbals as well as drums, which settles the ride-lane question too. That page was read on 2026-09-06 by rendering the image-only scan at 400 dpi, because pdftotext returns 12 bytes on it: source PDF, 15.2 MB, 12 pages.
Where the ghosts actually sat
Of the 3,842 removed flags, 1,549 are snare and 2,293 sit on cymbals, hats, kick, toms and tambourine. The largest single entry, Watermelon In Easter Hay at 1,317, carries no snare ghost at all.
The source archive
Hand transcriptions by professional transcribers live under ~/Projects/_outputs/zappa-drum-sources/ with ARCHIVE-STATE.md as the manifest. Seven folders: DRUM Magazine notation PNGs, the Cruise Ship Drummer charts, the Pete Sweeney Vinnie Colaiuta PDF, the Drumnet.ru charts, the Kasper Sloots per-album analysis with its section-letter bar maps, two academic theses, and the Rondo Hatton Report editions.
4. Keep It Greasey, the full dossier
Joe's Garage, 1979. Drums by Vinnie Colaiuta.
4.1 The three Songsterr tabs
| Song id | Title | Author | Tracks | Drums? | Read |
|---|---|---|---|---|---|
s604777 |
Keep It Greasey | Ben Dibden1 | 9, all named by player | Yes. Part 8, "Vinnie Colaiuta" | The one that matters. Human, 248 bars, 4,948 drum events, 629 ghost flags, live revision r8852151. Length runs 8:18 against the album's 8:22, a delta of 0.7 percent. |
s2832032 |
Keep It Greasy | unnamed | 3, all unnamed | Yes, generic | AI transcription, 65 percent short of the album take. Not the album performance. |
s754950 |
Keep It Greasey (Live 1980) | unnamed | 1 | No, bass only | Different performance, no drum staff. |
4.2 The revision history, and the strip that never published
Read off the Songsterr revision panel for s604777 on 2026-09-08.
| Date | Author | State | What it did |
|---|---|---|---|
| 2025-07-15 r2463117, via Editor | Kevin Sheppard | approved | The baseline held on disk as the pre-sweep file. |
| 2026-08-29 r8768457, via GP | Brandon chavez | alternative | The ghost strip. Removed all 629 parenthesised noteheads from the Vinnie Colaiuta staff. Never became the published revision. |
| 2026-09-02 local 2026-09-03T01:08:51 UTC | Ben Dibden1 | approved | Section headers, rests removed from empty bars, tracks renamed to the template format, vocal instruments changed, bass tone set to finger in the intro, a keyboard lick finished. This is r8852151, the live revision. |
The strip's revision note is stale, and it should not be read as the current state. Its text describes what
r8768457 would have done. A signed-in read on 2026-09-08 gives s604777 38 revisions, latest r8852151, isOnModeration: false, and the copy s6862054 exactly one revision. Nothing newer exists on either tab, so the note is describing a superseded revision.
4.3 The audio on disk
Fifteen separated stems, 44.1 kHz stereo, each 501.84 seconds, at:
/Users/Shared/202 Keep It Greasey-D minor-142bpm-442hz/
The kit is already split into six lanes: kick, snare, hat, cymbals, toms, other_kit. The rest are backing_vocals, bass, lead, other, piano, rhythm, vocals, wind, and a metronome stem. The mixture sits beside them as a 320 kbps mp3.
142bpm is the same estimator talking, and it is one estimate rather than two.
4.4 The printed human transcriptions
| Source | Transcriber | Covers | On disk | Usable? |
|---|---|---|---|---|
| DRUM! Magazine, Groove Analysis | Ryan Brown | Verse 1 at 0:35 and Verse 2 at 1:16 | 02-drummagazine/Keep-It-Greasey.png, 1166×1130 | Yes. Fully legible at read size. |
| DRUM! Odd Meter Lesson 4 | DRUM! Magazine | The 19/16 verse groove, three pages | Odd-Meter-Lesson-4-Keep-It-Greasy-1..3.png | Yes. Page 1 draws the ghosts in brackets. |
| Pete Sweeney, Vinnie transcriptions | Pete Sweeney | Dong Work For Yuda and Keep It Greasy | 03-petesweeney/Vinnietranscriptions.pdf, 9 pages, 6.09 MB | Image scan, no text layer. Needs rendering to read. |
| On the Beaten Path: Progressive Rock, Alfred, page 64 | Rich Lackowski | The passage at 3:18 | Publisher sample PDF, md5 116b3ee7… | Yes at 600 dpi. Prints 19/16, quarter = 134. |
| Modern Drummer Rock Charts | Marc Atkinson | The complete song | 180 ppi third-party scan | No. Classified unusable at AUC 0.582 on a 13 px phone scan. |
4.5 What the DRUM! chart states, read directly off the image
Verse 2 at 1:16, meter 21/16, moving through a 9/16 bar into 4/4.
The Odd Meter Lesson page draws the same 19/16 groove with parenthesised noteheads on the snare line, which is a second published transcriber writing ghost strokes into this exact song.
Every digit above was read from a native-resolution crop, enlarged 4x and 6x with nearest-neighbour and no resampling, never off a page overview. The five readings that survived that check are
134, 19/16, 21/16, 9/16 and 4/4. The crops are filed beside the charts as EVIDENCE_KeepItGreasey_DRUMmag_timesigs_native-crops-4x.png and -6x.png.
4.6 The tempo, measured against the recording
| Quantity | Value |
|---|---|
| Measured quarter at the 3:18 passage | 136.7 BPM, drifting 135.7 to 137.9 |
| Printed by two publishers | 134 |
| R at 134 inside that window | 0.0167, below its own null of 0.0518 |
| Estimator error at matched difficulty | 0.04 BPM end to end |
| Speed-shift control | Audio sits 8 to 18 cents sharp of A440, about 1 percent. The 134 to 142 gap is 6 percent, so speed does not explain it. |
4.7 The validation pass of 2026-09-07
Every lane was tested in both directions at passage level. Two tests that need no alignment carried the result: a bimodal peak-dB histogram for a quiet population, and a sixteenth-grid lock against a phase-uniform baseline.
| Lane | Notated | Valley | Grid, notated set | Grid, surplus | Reading |
|---|---|---|---|---|---|
| kick | 1,311 | none | 1.889× | 1.646× | One population. The 32 surplus onsets are real and unnotated. |
| snare | 1,423 | -18.63 dB | 1.887× | 1.501× | Two dynamic populations, which is what a ghost layer looks like. |
| hat | 1,156 | -28.74 dB | 1.694× | 1.369× | One mode with a quiet tail. Surplus reads as separator residue. |
| cymbals | 543 | -40.17 dB | 1.782× | 1.223× | Same. Surplus does not clear the bar. |
| toms | 493 | -35.49 dB | 1.289× | 1.706× | Inverted. Loud detections are less grid-locked than quiet ones, which is a contaminated stem. No tom claim was made. |
5. The bundle, collected on disk 2026-09-08
Every transcription of this song now sits in one labelled folder, named by transcriber and by what each file actually contains.
~/Projects/_outputs/zappa-keep-it-greasey-transcriptions/
5.1 The Guitar Pro files, exported live from Songsterr
| File | Tracks | Bars | Drum events | Ghost flags |
|---|---|---|---|---|
s604777_…_ALBUM-TAKE_BenDibden1_r8852151_9trk_248bars_DRUMS-4948notes-629ghosts.gp | 9, each named by player | 248 | 4,948 | 629 |
s604777_…_PRESWEEP-BASELINE_2025-07-15_pre-ghost-strip.gp | 9 | 248 | baseline held before the sweep | — |
s2832032_…_AI-TAB_65pct-SHORT_3trk_123bars_DRUMS-1863notes-0ghosts.gp | 3, unnamed | 123 | 1,863 | 0 |
s754950_…_LIVE-1980_BASS-ONLY_1trk_121bars_406notes_NO-DRUMS.gp | 1 | 121 | 0 | 0 |
s6862054_…_BRANDON-EDIT-COPY_r8958071_UNMODIFIED_9trk_248bars_DRUMS-4948notes-629ghosts.gp | 9, named by player | 248 | 4,948 | 629 |
s6862054, titled "Keep It Greasey by Frank Zappa Brandon edit" and filed under the artist string Misc Covers, carries exactly one revision, r8958071, created via Copy, with no edit submitted to it. Exporting it gives 248 bars, 9 tracks, 14,444 note events and 629 ghost flags, drum track at 4,948 and 629, matching s604777 in every figure. The copy route the standing gate requires exists and is clean, so KIG-M001 has somewhere to land that never touches Ben Dibden1's original.
The public API cannot see it.
songsterr.com/api/meta/6862054 returns nulls without credentials, so it has to be read from the signed-in browser.
Notes are shared definitions, so counting <Note> elements returns 680 on a file carrying 14,444 events. Second, a ghost is a direct <AntiAccent>Normal</AntiAccent> child of Note, never a <Property name="AntiAccent">. Reading it as a Property returned zero ghosts on a file holding 629 of them, which is the same shape of error that let the original sweep proceed.
5.2 The printed charts, rendered and labelled
The Pete Sweeney PDF was rendered at 200 dpi for all nine pages and again at 400 dpi for the Keep It Greasy pages. Noteheads, X-heads and grace notes read clearly at that size.
| Pages | Song | Transcriber | Publication |
|---|---|---|---|
| 1 to 2 | All Blues | Jeff Wald | Drum Soloist. Vinnie, not Zappa. |
| 3 to 5 | Dong Work For Yuda | Chris Brady | Modern Drummer Rock Charts. Also Joe's Garage. |
| 6 to 9 | Keep It Greasy | Marc Atkinson | Modern Drummer Rock Charts. The complete song. |
zappa-drum-sources/ARCHIVE-STATE.md records this PDF as holding two charts, Dong Work For Yuda and Keep It Greasy. It holds three, and All Blues is the one it misses. The Marc Atkinson attribution used in the earlier validation work is now confirmed from the printed page itself, where it appears under the title on page 6.
5.3 The Songsterr part JSON
All nine parts of s604777 at revision r8852151, pulled from CloudFront on 2026-09-08. The drum staff is part8_DRUMS_VinnieColaiuta.json at 317 KB. The meta payload carries a control character, so it needs json.load(..., strict=False).
6. KIG-M001, applied and published 2026-09-08
s6862054 now sits at revision r8972975, createdVia GP, tracksCount 9, isOnModeration: false, published 2026-09-08. The original s604777 was never touched and still sits at r8852151 by Ben Dibden1.
6.1 What changed, and what it was
Bar 231, beat index 7, one sixteenth at mf. Songsterr's own part JSON is the field that renders, and it read {"fret": 65, "string": 4}. String 4 on that staff carries 1,311 kicks and nothing else, so a fret 65 there is an encoding slip rather than an instrument.
| Field | Before | After |
|---|---|---|
| Songsterr note | {"fret": 65, "string": 4} | {"fret": 35, "string": 4} |
| GPIF articulation | 41, Timbale high, staff line 9 | 7, Kick (hit), staff line 8 |
| GPIF Midi / Fret / String | 65 / 65 / 1 | 35 / 35 / 0 |
6.2 The gates that ran before the push
| Gate | Result |
|---|---|
gpif/diff_gpif_tracks.py with the target track named | exit 0. Only Vinnie Colaiuta changed. The other eight tracks are byte-identical. |
preflight_import.py | PASS. 9 tracks, no part loss, grid 1.30% inside the 2% tolerance, drum notation clean, stamped. |
| NAMEDROP | CLEAR. 9 of 9 track names CDATA-wrapped, which is the state measured to survive the importer. |
| Edit method | Surgical text replacement on the raw GPIF, never a reserialize, so all 149 CDATA blocks survived. |
6.3 The GPIF shared-element trap, measured rather than assumed
A peer session working Watermelon deleted 164 note instances across 85 bars it never targeted, inside a total loss of 179 across 90 bars, because it edited a shared Beat in place. That trap is real in this file too, and it did not reach this edit.
Figure corrected 2026-09-08 by the Watermelon audit session, from an instance-level census of the quarantined damaged file against its parent. The earlier "179 across 79 bars" was wrong twice: the span is 90 bars, and the 15 intended removals sit inside the 179, so the never-targeted collateral is 164.
| Link in the chain | Sharing on the KIG-M001 target | Worst sharing in the same file |
|---|---|---|
Bar to Voice 2214 | 1 bar | — |
Voice 2214 to Beat 1503 | 1 voice | one beat referenced by 739 voices |
Beat 1503 to Note 679 | 1 beat | one note referenced by 144 beats |
Note 679 in place could reach nothing else. The whole-track diff confirmed it from the other direction, and so did the post-publish read.
Element ids do not survive a Songsterr round trip. The published re-export renumbers with no content change: Beats went 1,527 to 1,556 and Notes 680 to 679, because the exporter re-deduplicates. Compare content tuples, never ids.
6.4 Verified after publish, uncredentialed
Read straight from CloudFront at 6862054/8972975/v0-3-2-VZtKXkSzlkLljDFV/8.json, http 200, with no session cookie.
| Measure | Before | After |
|---|---|---|
| fret 65 events | 1 | 0 |
| kick, fret 35 | 1,311 | 1,312 |
| ghost flags | 629 | 629 |
| measures | 248 | 248 |
| note events | 4,974 | 4,974 |
| track names | 9 named | 9 named |
All nine custom names survived the importer, which confirms the CDATA finding against the older blanket NAMEDROP rule. The published tab keeps its eight source videos and hasPlayer: true, so the audio sync came through the import.
6.5 The eye check, because a field read is still a detector
The row was settled from stored fields first. That is a detector result, so it was put to the eye: bar 231 of both files rendered with alphaTab headless at scale 4.0, then diffed pixel by pixel.
| Version | Where the notehead sits |
|---|---|
| BEFORE, fret 65 Timbale high | in the space below the bottom staff line |
| AFTER, fret 35 Kick | on the bottom staff line, with every other kick in the bar |
6.6 Ghost and dynamic are two different elements
A ghost-versus-dynamic comparison only means something when the two sides are different fields. Counted in the published file:
| Mark | Where it lives | Elements in the file |
|---|---|---|
| ghost | <AntiAccent> child of <Note> | 1 shared definition, referenced by 629 instances |
| dynamic | <Dynamic> child of <Beat> | 1,556 |
| staccato | <Staccato/> child of <Note> | 0 |
s35870 has no counterpart here.
Scope note that reconciles two published numbers. The 2026-09-07 validation page reports 794 unflagged against these 629. That figure is snare-lane only, and 629 plus 794 is 1,423, exactly the MIDI 38 count. Counting every lane gives 4,319 unflagged. Both are right at their own scope.
6.7 Threshold provenance
No figure produced in this pass came from a fitted threshold, so the author-calibration failure mode does not apply to any count above.
| Figure | Where it is read from |
|---|---|
| 4,948 drum events, 629 ghost flags | <AntiAccent> children and beat-to-note references in the GPIF |
| All 629 on MIDI 38, 152 of 248 bars | the Midi property on each referenced note |
| 1,311 to 1,312 kicks, fret 65 one to zero | Songsterr part JSON fret field |
| 19/16, 21/16, 9/16, 4/4, quarter 134 | native-resolution image crops at 4x and 6x |
The detector figures in section 4.7 belong to the 2026-09-06 and 09-07 sessions and are cited as theirs. Nothing was refitted here.
6.8 Id-histogram pre-flight on the two remaining edits
A peer session lost 164 note instances across 85 bars it never targeted, inside a total loss of 179 across 90 bars, by editing a shared Beat in place. The cheap check that catches it is printing the id histogram of an edit plan before writing. Run here on the published file, counting instances on both sides so the units match.
| Plan | Note id | In plan | Total file-wide | Verdict |
|---|---|---|---|---|
| KIG-M002, 21 hand claps (GM 39) | 667 | 21 | 21 | Exclusive. An in-place edit is safe. |
| KIG-M003, 114 ghost flags at mf | 659 | 114 | 629 | Shared, 515 instances outside the plan. Copy-on-write mandatory. |
A units error this check caught in its own first pass. The first run compared a plan's instance count against the note's beat-reference count, 21 against 5 and 114 against 37, and labelled both exclusive. Those are different units. Counting instances on both sides flips M003 to shared. Compare like with like, or the histogram lies in the safe direction.
7. What is still open on this song
| Id | Finding | Evidence needed | State |
|---|---|---|---|
KIG-M001 | GM 65 written on the kick staff line at bar 231, position 7 sixteenths. One event in 4,948, inside a repeating figure whose other string-4 events are all GM 35. | None. This is score-internal and exact. | APPLIED, published as r8972975 |
KIG-M002 | 21 GM 39 hand claps drawn at the snare position across bars 22 to 32, 42 to 44, 65 and 82. | Placement is certain. Intent is not recoverable. | unresolved |
KIG-M003 | 114 ghost flags whose resolved dynamic is mf, which is the unflagged population's own mark. The two encodings disagree. | Nothing on hand says which is meant. | unresolved |
KIG-M004 | 32 kick onsets the score omits. They sit 7.66 dB below the notated median and land on the sixteenth grid at 1.646× baseline. | Bar positions unknown. Listed by audio time only. | unresolved |
q-2026-08-31-227358 | Kick lane convention. House convention is GM lane 36, used alone by 13 of 20 songs. Keep It Greasey uses lane 35 alone, along with Catholic Girls and Fembot. | Decide whether to normalize or leave it. | in progress |
s6862054 is an unmodified copy titled "Brandon edit", verified this pass to match the original in every figure. Any repair goes there.
8. The order to run them in
- Nothing needs separating. The fifteen stems exist and the kit is already in six lanes. Skip stages 1 and 2 of the acquisition work.
- Read the Marc Atkinson chart. It is now rendered at 400 dpi across four pages and it is the only complete-song printed source. Bar-by-bar it is the strongest test available for the notated drum part.
- Run
/perfect-stem-readon the six kit stems, holding the identity-before-lane order. - Run
/notation-evidence-gateon any symbol dispute the read produces, ahead of writing a claim down. - Run
/reference-classon every count before it enters a deliverable. KIG-M001is done, published ons6862054asr8972975. The other three findings have no evidence that closes them.