The Zappa ghost note debacle

A sweep across Frank Zappa drum tabs on Songsterr read genuine ghost notes as a notation defect and stripped them. This is the verified record of what was changed, what moderators caught, and what is still live.

Audited 2026-08-30 · moderation, track names and revision state re-read uncredentialed 2026-09-07 against api/meta/<songId> and api/meta/<songId>/revisions

Read this before acting on anything below. Status notice, 2026-09-07.

The moderation queue emptied on 2026-09-07 between 14:36 and 17:52 UTC. Ten of the sixteen restores are now the published revision. Six still sit on moderation, and the seventeenth song's repair sits there with them. Keep It Greasey stays blocked. Every state on this page was re-read from api/meta/<songId>/revisions without credentials on 2026-09-07.

The root cause analysis, the field-name failures and the accent bitfield work below all still stand. The operational board is Zappa Program Scope.

1. The moderation wave2. The restore emptied the credits3. Repaired behind us4. The seventeenth tab5. Defects the restore introduced6. The upload path changed7. The work that is not ghosts8. The seventh instance9. What happened10. The original ledger11. Root cause12. Which lane13. Charts14. Accents

10
restores now published
7
still on moderation
28
authored credits lost live
53
more names at risk
17
tabs affected in total

1. The moderation wave, 2026-09-07

Sixteen restores went up on 2026-09-05 and sat unread for two days. Moderators cleared them in a single afternoon. Every row below was read from api/meta/<songId>/revisions uncredentialed on 2026-09-07.

SongSong idOur restoreStatePublished revision nowNamed tracks
Watermelon In Easter Hays35881r8908034published, reviewed fair by Evgeny 14:49Zr89080340 / 9
Muffin Mans35886r8906880published 14:36Z, then supersededr89446380 / 5
Drowning Witchs620961r8908109published 15:02Z, then supersededr89451410 / 16
Montanas35870r8907028published 15:38Z, then supersededr894585111 / 18
The Black Pages1105085r8907247published, reviewed fair by Kirill 15:39Zr89072472 / 4
Nanook Suites35878r8907360published, reviewed fair by Kirill 17:51Zr89073608 / 11
Nanook Rubs Its35865r8907423published, reviewed fair by Kirill 17:52Zr89074237 / 9
What's New In Baltimore?s35887r8908276published 15:55Z, then supersededr89461696 / 7
Catholic Girlss749523r8907778published 15:45Z, then supersededr89459774 / 9
Zomby Woof (AI)s5820647r8932311published, name repair appliedr89323115 / 5
Inca Roadss412178r8907511on moderationr876902612 / 12
Carolina Hard-Core Ecstasys68248r8908182on moderationr87690586 / 9
Oh Nos35884r8908239on moderationr87690894 / 6
Alien Orifices68246r8907689on moderationr87691188 / 10
Fembot In A Wet T-Shirts748459r8907601on moderationr87691656 / 9
Uncle Meats20690r8907952on moderation, 3 of ours queuedr878875711 / 11
Trouble Every Day (Live)s412170r8932027on moderationr88150006 / 6
Keep It Greaseys604777r8768457blocked by Kirill527, cannot publishr88521519 / 9

Uncle Meat carries three of our revisions on moderation at once, r8907892, r8907952 and r8909627. Songsterr offers no withdraw control, so the stack stands until a moderator picks one.

2. The restore emptied the credits

The repair for the ghost notes introduced a different loss on the same tabs. Eight restores published with their track names blank, taking authored musician credits off public pages.

The mechanism

GPIF stores a track name inside a <![CDATA[...]]> block. Python's ElementTree drops the CDATA wrapper when it writes the file back out. Songsterr's converter then finds no name and falls back to a generic label, so any restore serialized through ElementTree arrives with its names gone. Files built by direct download or by lxml with XMLParser(strip_cdata=False) keep them.

Four measurements across two songs isolate the variable:

RevisionHow it was builtCDATA blocksNames present
s35881 r8768414our own .gp upload1367 of 9
s35881 r8908034ElementTree00 of 9
s5820647 r8906157ElementTree00 of 5
s5820647 r8932311CDATA-carrying rebuildpresent5 of 5

The same upload path served all four, so the build tool is the variable and the platform is not.

Which restores dropped names, measured revision by revision

SongRevision before oursNamedOur restoreNamedVerdict
Watermelon In Easter Hayr87684147 / 9r89080340 / 9dropped 7, still live
Drowning Witchr876856612 / 16r89081090 / 16dropped 12, still live
Montanar878710618 / 18r89070280 / 18dropped 18, 11 put back
What's New In Baltimore?r87691416 / 7r89082760 / 7dropped 6, all 6 put back
Catholic Girlsr87888015 / 9r89077780 / 9dropped 5, 4 put back
Muffin Manr87685174 / 5r89068800 / 5dropped 4, still live
Zomby Woof (AI)r87661783 / 5r89061570 / 5dropped 3, repaired to 5 of 5
Zomby Woofr89054110 / 10r89054910 / 10dropped, Nikita restored 9
The Black Pager87686132 / 4r89072472 / 4clean, names preserved
Nanook Suiter87690018 / 11r89073608 / 11clean, names preserved
Nanook Rubs Itr87689677 / 9r89074237 / 9clean, names preserved

The three clean rows were built from direct downloads rather than through ElementTree, which is the same split the CDATA measurement predicts.

What is missing from public tabs right now

SongNames lostCauseWhat is gone
Drowning Witch12our restore r8908109Vocals, Clean Guitar ×2, E. Piano / Synth II, Synth III / Clavinet left and right, Saxophone, Glockenspiel, Kazoo / Harmonica / Vibraphone, Chimes / Woodblocks / Timpani, Synthesizer left and right
Watermelon In Easter Hay7our restore r8908034Frank Zappa, Warren Cuccurullo ×2, Arthur Barrow, Ed Mann, Wurlitzer (Peter Wolf), Vinnie Colaiuta
Muffin Man4our restore r8906880Frank Zappa, Tom Fowler, George Duke, Terry Bozio
Carolina Hard-Core Ecstasy3our strip r8769058, 2026-08-30Bass, Drums, Trombone
Montana1our restore r8907028, partly repairedRuth Underwood on track 12, plus 6 placeholder labels
Catholic Girls1our restore r8907778, partly repairedVocals

28 authored names are missing across six live tabs. Six further blanks on Montana were placeholder labels reading AI, 1, 2 and 3, and they are counted separately because they carry no credit.

53 more names sit behind the moderation queue. The seven held restores were built the same way, and the tabs under them carry 12, 6, 4, 8, 6, 11 and 6 named tracks. Approval publishes the same defect on each. Waiting is not a neutral option here.

The fix is proven on two songs

Export the live revision, rebuild it with lxml using etree.CDATA under XMLParser(strip_cdata=False), verify zero note, dynamic and event changes, then submit. r8932311 did exactly that on Zomby Woof (AI) and restored 5 of 5 names, which is two better than the 3 the tab carried before the sweep touched it. RESTORED-s35881-TEXTSAFE-v2.gp carries 137 CDATA blocks and is the ship candidate for Watermelon.

3. Someone is repairing behind us

Within about an hour of each restore clearing, an Editor-built revision appeared on five of the songs. Three of them put names back.

SongOur restoreNamed after oursFollowing revisionNamed after thatOutcome
What's New In Baltimore?r89082760 / 7r89461696 / 7fully repaired
Montanar89070280 / 18r894585111 / 18credits back, 1 still missing
Catholic Girlsr89077780 / 9r89459774 / 94 back, 1 still missing
Muffin Manr89068800 / 5r89446380 / 5not repaired
Drowning Witchr89081090 / 16r89451410 / 16not repaired
Zomby Woofr89054910 / 10r89186019 / 10Nikita reverted our frame

Those repairs were made by hand in the Songsterr editor by people who did not cause the loss. Two tabs are still waiting for someone to notice.

4. Trouble Every Day, the seventeenth tab

This page recorded s412170 as superseded and safe. It was neither.

Our strip r8766285 removed 9 ghosts from the Chad Wakerman Percussion staff. Kirill's r8815000, which went live on 2026-09-01, put back 3. Six were still missing, all fret 49 crash at bar 67 beats 4 to 9, and all six notes still existed, so only the ghost flag was needed. Six wrong beat velocities were also still live: bar 1 beats 4, 5 and 6, bar 67 beats 4 and 6, and bar 69 beat 10. Twelve corrections in total.

RESTORED-s412170.gp was built and verified against the live base rather than the author, so Kirill's post-strip edits survive: 6 ghosts flipped false to true, 0 ghosts lost, 0 other note changes anywhere, 0 changes on other tracks, and the effective dynamic matches the author on all 807 slots. It went up as r8932027 on 2026-09-06 and is on moderation.

A separate grid defect on the same tab was inherited, not caused by us. The tab notates 134.0s against its 141.0s synced video, 4.96% off against a 2% tolerance. It is present on Kirill's live revision and on every revision before it. The preflight gate refuses the repair on that basis, and the unmodified live base fails the identical gate with identical numbers. The ghost restore deliberately left the grid untouched, so this needs its own pass over the single 165 BPM automation across 92 bars.

5. Two defects the restore itself introduced

The ride definitions were merged, so a naive flag would ghost everything

GPIF stores note properties in shared definitions. On Watermelon the post-sweep r8768414 merged ride definition 431, the ghosted one, and definition 432, the plain one, into a single id 418 covering all 1,724 occurrences. Writing <AntiAccent> onto 418 would have ghosted all 1,724, including the 408 that were never ghosted. The repair has to split 418 by occurrence position against the pre-sweep revision, copy-on-write, and log definition-level and occurrence-level changes separately.

A chord symbol has two halves and only one came back

GPIF stores a chord in two places, an <Item> defining the diagram and a <Chord> reference on the beat that displays it. The paren sweep dropped both halves of E7Msus2 at bar 3. The first restore put the Item back alone, so the definition sat orphaned and no bar printed the symbol.

Three checks passed on that broken file:

Beat id 2 is shared by seven voices covering track 0 bars 3 to 9, so the repair clones it copy-on-write and repoints the bar 3 voice alone. This is the same shape as the ghost loss itself: three checks agreed, and none of them measured the thing that was gone.

6. The upload path changed

Hard gate set by Brandon on 2026-09-07. We do not submit revisions to an original tab, and undoing our own damage is included.

Open the original, click Create a copy to edit, rename the copy with Brandon edit on the end, import the corrected file there, and submit the revision on the copy. The earlier carve-out that allowed a revision on the original when the damage was ours is retired.

For Watermelon that makes the action concrete: open s35881, create a copy, rename it to Watermelon In Easter Hay Brandon edit, import RESTORED-s35881-TEXTSAFE-v2.gp, and submit on the copy. The original tab and r8908034 stay untouched.

The preflight NAMEDROP rule is too absolute

The rule in preflight_import.py states that the uploaded file cannot prevent a name loss, on the grounds that one upload's Tracks section was byte-identical to Songsterr's own export and the names still went. The four measurements in section 2 refute it. A Tracks section compared after parsing is byte-identical whether or not the source carried CDATA, because the parser has already discarded the wrapper. The comparison could not see the variable it needed to see.

Zomby Woof preflight also refuses on GRID for a build that is provably timing-neutral, so two of the gate's refusals now have documented false-positive conditions.

7. The work that is not about ghosts

The ghost sweep is one thread. These ran alongside it and are recorded here so the board is complete.

Watermelon In Easter Hay, two repairs waiting on the queue

The foot-pedal hi-hat is missing. The isolated hat stem gives a periodic subsequence at 1.0800 s, equal to the GP quarter at the snare-anchored tempo of 1.0842 s, with 178 of 505 grid slots carrying a hat onset at 35% against a 26% chance baseline. Brandon's representative chicks at 181.93, 183.03, 184.10 and 185.19 appear in the detection at 181.92, 183.00, 184.09 and 185.17. The tab notates six Pedal Hi-Hat events, so roughly 172 are missing.

The snare rebound ghosts are missing. The tab carries 193 snare events with zero ghost flags. Brandon measured 202 principal snare attacks, of which 196 carry a substantially quieter follow-up within 250 ms and 178 carry two, the first at a median near 92 ms and the second near 156 ms. An independent run agreed on the lags at 70 ms and 134 ms and over-detected principals at 411 against 202, so his counts govern. These belong on the snare lane, not on Ride (middle), and whether the rebounds are stick bounce or room is not settled by a separated stem.

Bar 54 is the only tuplet bar in the tab, a 1/6 quarter-note duration inside 5/4, and its quintuplet fill needs checking against the Drumnet chart before anything is written.

The ride question, where it actually stands

Settled: the 193 post-snare Ride (middle) ghosts are not misplaced snare rebounds. The tab places them at a rigid 271 ms after the snare, one GP sixteenth, with the 10th and 90th percentiles both at 271 ms, while the measured rebounds land at 70 to 92 ms and 134 to 156 ms.

Unsettled: the other 1,123 ride ghosts. The cymbals stem gives a 41% chance baseline that swallows the signal, ghosts sit at 47% and plain at 55%, and the neither-detected rate is 50.3% for ghosts against 46.8% for plain. Those are close enough that the detector is missing real strokes. A second machine-readable transcription cannot arbitrate either, because it runs 230 bars of 4/4 plus 48 of 2/4 against the tab's 53 of 4/4 and 52 of 5/4, which makes a bar-keyed diff meaningless. No deletion revision may ship against these.

Carolina Hard-Core Ecstasy, two findings separate from the ghosts

About 16.5 bars are unnotated. The tab totals 313.45s across 102 bars, with tempo automations of 79 BPM from bar 0, 71 at bar 98, 66 at bar 100 and 45 at bar 101, against a 360.0s record. The shortfall of 46.55s is 12.93%. Filling 360s at the tab's own 79 BPM needs 118.5 bars against the 102 present. Raising the tempo to Sloots's 86.4 widens the gap by 30.12s, so this is missing material and not a tempo error.

The opening is written straight where a professional transcription writes triplets. Sloots marks triplet brackets in both staves of the opening. The tab carries 23 tuplet events in the whole 102-bar file, 6 in Drums at bar 42 and 17 in Trombone at bar 68, and bars 1 to 8 hold 505 events across all nine tracks with zero tuplets. Aligning his boxed rehearsal numbers to tab bars assumes a shared downbeat origin, so that has to be landmark-anchored against the recording before any rhythm changes.

Keep It Greasey, the tempo and anchor work

Printed sources give quarter = 134. A local sixteenth-grid sweep over the 3:18 to 3:58 solo window peaks at 143.5 with 71.1% against a 45.4% chance floor, with 135.0 at 69.7%. The grid lock is established and the exact tempo is not, so 134 must not be quoted as confirmed by audio.

Tempo-map drift is small and measured at 11 ms per bar, 0.55%. Where measure 102 begins in the audio is the binding limit, with anchor uncertainty at 1,928 ms, which is 0.91 of a 19/16 bar, across three independent families: drums at +1.176s, bass at +0.410s and keys at -0.752s.

Two corrections came from a second reader. The denominator was wrong: four sources were evaluated and three sparse parts were skipped, and counting the skipped three as failures turned missing estimates into negative observations. The second-separator result also needs a masking control, because the comparison stem is whole-kit drums, so a genuine quiet stroke masked by a louder kit event in the same 30 ms window scores as uncorroborated and is indistinguishable from an artifact.

Nine printed charts are still unapplied

Across seven songs, ranked and archived: Dong Work for Yuda s768189 (Sweeney), Apostrophe' s35873 (Bishop on Jim Gordon), Watermelon s35881 (Drumnet), Central Scrutinizer s3554079 (Bishop), Don't Eat the Yellow Snow s35866 (Bishop), Andy s21495 (Ryan Brown), and Keep It Greasey s604777 with three sources for verification only. Apostrophe' holds four tracks all on instrumentId 29, so a drum staff has to be added before a drum chart can be applied at all.

8. The seventh instance, committed while writing this update

This page documents six occasions where a check enumerated what it expected and read absence as evidence. Building this update produced a seventh.

To measure the name loss I read api/meta/<songId> and counted tracks whose title was empty. Every one of twenty tabs returned 100% empty, including Apostrophe', which this work has never touched, and Keep It Greasey, whose strip was blocked before it could publish.

A result that says every tab on the platform lost every name is a result about the instrument. The track object has no title key at all. The field is name. The real schema is difficulty, hash, instrument, instrumentId, isEmpty, isVocalTrack, name, tuning, views.

What the wrong field reported

179 names lost across 20 tabs, including tabs never edited by this work.

What the right field reports

28 authored names lost across 6 tabs, each one traced to a specific revision.

The tell was the control. Apostrophe' and Keep It Greasey were in the sweep as untouched comparisons, and both scored identical to the damaged tabs. Had the query covered only the tabs under suspicion, the number would have looked plausible and would have been published.

This is the same failure as grepping <Ghost> in GPIF, as reading a missing fret as a rest, as reading a missing dynamic key as an absent marking, and as the hardcoded allowlist in noteloss_audit.py. Assume a field name, find nothing, and report nothing as a finding.

9. What happened

Songsterr draws a ghost note as a notehead inside round brackets. That is the platform's own ghost notation and it carries real musical information, the quiet stroke a drummer plays between the loud ones. A sweep run on 2026-08-29 and 2026-08-30 read those brackets as a defect and removed them across twenty Zappa tabs.

Sixteen of those revisions are the current public revision today. 3,842 ghost note flags are missing from tabs the public reads right now. Two more were rejected by Songsterr moderators before they could publish, and two were overtaken by other people's later revisions.

10. The original ledger: 16 tabs, 3,842 ghost notes

Each revision below was confirmed as the current public revision by reading api/meta/<songId> on 2026-09-05.

Song IDTitleGhostsOur revisionState
1s35881Watermelon In Easter Hay1,317r8768414is the current public revision
2s35886Muffin Man578r8768517is the current public revision
3s620961Drowning Witch419r8768566is the current public revision
4s35870Montana317r8787106is the current public revision
5s1105085The Black Page173r8768613is the current public revision
6s35878Nanook Suite168r8769001is the current public revision
7s35865Nanook Rubs It168r8768967is the current public revision
8s412178Inca Roads165r8769026is the current public revision
9s68248Carolina Hard-Core Ecstasy144r8769058is the current public revision
10s35884Oh No141r8769089is the current public revision
11s68246Alien Orifice86r8769118is the current public revision
12s35887What&#x27;s New In Baltimore?59r8769141is the current public revision
13s748459Fembot In A Wet T-Shirt57r8769165is the current public revision
14s20690Uncle Meat (YCDTOSA Vol. 2)24r8788757is the current public revision
15s749523Catholic Girls16r8788801is the current public revision
16s5820647Frank Zappa, The Mothers of Invention - Zomby Woof10r8766178is the current public revision

Rejected by moderators: 2 tabs, 682 ghost notes

An earlier draft of this page called these "still at risk". That was wrong. Reading isBlocked and reviewed off each revision record shows both were rejected by a human moderator and are blocked from publishing as of the recorded decision dates below. Whether either was at risk during the window before review is a separate question this page does not answer. No action is needed on either tab now, and the corrected Zoot Allures file that was built on 2026-09-05 should not be sent.

Song IDTitleGhostsOur revisionModerator decisionPublic now
1s604777Keep It Greasey629r8768457rejected by Kirill527 on 2026-09-01, blockedr8852151
2s35883Zoot Allures53r8769199rejected by Darr on 2026-09-01, blockedr7179991

Superseded: 2 tabs, 41 ghost notes

Reviewed and not blocked, and another author's revision became public first. The stripping never reached a reader.

Song IDTitleGhostsOur revisionOutcomePublic now
1s412162Zomby Woof32r8766102reviewed fair, never became publicr8814965
2s412170Trouble Every Day (Live)9r8766285WRONG, corrected 2026-09-06. Kirill restored 3 of 9. 6 ghosts and 6 velocity changes stayed. Repaired as r8932027, on moderation.r8815000

Flagged, never submitted: 4 tabs, 19 ghost notes

Song IDTitleGhostsState
1s35889Peaches En Regalia14flagged by the sweep, no revision was ever sent
2s35875Packard Goose3flagged by the sweep, no revision was ever sent
3s21495Andy1flagged by the sweep, no revision was ever sent
4s59089Black Napkins1flagged by the sweep, no revision was ever sent

Root cause, three layers

  1. A house rule applied outside its scope. The staccato-dot-at-velocity-31 rule comes from stems-to-guitar-pro-drums, which builds a tab from an isolated drum stem. The sweep carried it onto community tabs written by other people.
  2. The wrong element name hid the evidence. GPIF spells a ghost <AntiAccent>Normal</AntiAccent>. A search for <Ghost> returns zero in every file, and that zero was read as proof the ghosts were absent.
  3. The audit measured note counts and missed the loss. The preservation check compared pitch, rhythm and position across 120,579 beat events and found zero differences. Articulation sat outside what it measured.

The rule itself was withdrawn on 2026-09-05, in the pipeline as well as here. It had survived as advice while this page described its damage. Measured on Songsterr that day: a GPIF ghost arrives as its own ghost field and draws as a parenthesised notehead, and a GPIF <Accent> arrives as staccato and draws as a dot. So the parentheses are the platform's ghost notation, and the dot is a duration mark standing in for a dynamic one. sd_writegp.py now writes the native ghost flag, and sd_verify.py now fails any file that writes a ghost as a dot. Brandon's dislike of parentheses stands as a display preference for his own files.

Which lane each flag actually sat on

The count above says 3,842 ghost notes. Counting them by MIDI lane in each tab's pre-sweep revision says something narrower. A ghost note is a quiet snare stroke between the loud ones. A ghost flag on a ride cymbal is a different thing and needs a different decision.

1,549
on snare, unambiguous ghosts
2,293
on cymbals, hats, kick, toms, tambourine
16
tabs measured lane by lane
Song IDTitleRemovedOf those, snareTop lanesWhose revision we overwrote
1s35881Watermelon In Easter Hay1,3170ride 1316, crash 1Ben Dibden1
2s35886Muffin Man578504snare 481, snare 23, open hat 13, crash 12, kick 10Ben Dibden1
3s620961Drowning Witch419111ride 128, snare 101, closed hat 61, kick 41, low tom 33Khashoggi
4s35870Montana317174snare 95, tambourine 83, snare 79, kick 24, MIDI 87 22Brandon chavez
5s1105085The Black Page173170snare 170, pedal hat 3Achille
6s35878Nanook Suite168168snare 168Kirill
7s35865Nanook Rubs It168168snare 168Taburet
8s412178Inca Roads165134snare 134, crash 14, kick 7, crash 6, closed hat 3Darr
9s68248Carolina Hard-Core Ecstasy1440tambourine 144Darr
10s35884Oh No1410closed hat 141Ben Dibden1
11s68246Alien Orifice8633snare 33, crash 33, crash 14, ride 3, pedal hat 2Ben Dibden1
12s35887What&#x27;s New In Baltimore?594ride 48, snare 4, crash 4, crash 3e
13s748459Fembot In A Wet T-Shirt5753snare 53, pedal hat 4Kevin Sheppard
14s20690Uncle Meat (YCDTOSA Vol. 2)244mid tom 6, snare 4, high tom 4, low tom 4, ride bell 4Leonard
15s749523Catholic Girls1616snare 16Kevin Sheppard
16s5820647Frank Zappa, The Mothers of Invention - Zomby Woof1010snare 10CoolDude

The largest single entry is the weakest case for restoration. Watermelon In Easter Hay's 1,317 are 1,316 ride and 1 crash, with no snare at all. The stripping revision claimed exactly that, and the claim holds. Carolina Hard-Core Ecstasy's 144 are all tambourine and Oh No's 141 are all closed hat. Restoration should run snare first, where the meaning is not in question.

Superseded 2026-09-06: the ride reading was withdrawn after audio testing. See the status notice at the top.

Montana already carries the wrong repair. Ben Dibden1's r7294223 held 317 ghost flags. My r8764165 wiped them, and my r8787106, live today, converted all 317 into staccato dots. That is the substitution measured wrong on the same day: a dot is a duration mark and a ghost is a dynamic. Montana needs the ghost flag back and the dot removed, and 174 of its 317 are on snare.

Checked against the printed charts

The Zomby Woof repair was re-checked against the four transcriptions held on disk. Every figure below was measured off the scan rather than read by eye.

The marks below Ryan Brown's staff are pedal hi-hat

Brown's DRUM Magazine page carries small crosses one full space below the bottom staff line. Staff lines were detected at a 12px spacing, then every mark sitting under the bottom line was measured.

SystemMarks below the staffGlyph
13w=13 ink=33
20none
33w=13 ink=33
42w=13 ink=33

Eight marks, pixel-identical, across three of the four systems. A five-line drum staff puts the pedal hi-hat in exactly that position. Drumnet's bar 1 carries the same three marks at the same height, drawn in its own dialect with o and + above the staff for the hands. Two professional charts agree.

Brown's bar 1, glyph by glyph

Connected components with the staff lines erased, measured across x = 105 to 436.

xStaff positionWhat it is
132bottom spacekick
170third spacesnare
199bottom spacekick, open hi-hat at 201, accent at 199
228spanningsixteenth rest
258third spacesnare, pedal hi-hat at 260
287bottom spacekick, open hi-hat at 289, accent at 287
325third spacesnare, pedal hi-hat at 327
358bottom spacekick, open hi-hat at 358, accent at 358
397third spacesnare, pedal hi-hat at 398

The three accents land within 2px of the three open hi-hats. The three pedal hi-hats land within 2px of the three snares. The rest is the alignment anchor, since the tab also rests at slot 4 and then runs snare, hat, snare, hat, snare across slots 5 to 9.

A claim of mine was wrong. I reported that the tab holds no pedal hi-hat events anywhere. The tab holds 23 of them, across bars 6, 7, 8, 9, 15, 17, 18, 41, 42, 43, 44, 99, 100 and 102. Bar 1 is the single omission. The lane already belongs to the tab's own vocabulary, which makes the bar 1 addition a gap fill.

Bar 5 accents sit on notes one and three, and Songsterr cannot draw them

Brown beams bar 5 as five quintuplet groups of five. The measured accent glyphs, width 18 and ink 65, sit above notes one and three of every group. The tab marks note two and nothing else.

What the tab marks

slots 1, 6, 11, 16, 21

five marks, each on note two of its group

What Brown prints

slots 0, 2, 5, 7, 10, 12, 15, 17, 20, 22

ten accents, notes one and three of every group

I shipped that change and then took it back out. Revision r8905411 moved the marks to Brown's positions and doubled them to ten. Reading the revision back from Songsterr's own JSON showed why that was wrong: a Guitar Pro <Accent> arrives in Songsterr as staccato. The note schema for this part holds only fret, string, staccato, rest, ghost and tie. There is no accent field. Zooming the rendered bar confirms it: ten small round dots, no wedges. A staccato dot says short, and Brown's wedge says loud, so the edit swapped one articulation for another. Revision r8905491 puts bars 5 and 16 back to exactly what the tab held.

What was tested, and what stays unconfirmed. One import path was measured: a Guitar Pro 7 .gp pushed through the editor's importRevisionInput on tab s412162, read back as revision r8905411, part 9. In that file, on that path, a GPIF <Accent> arrived as staccato and the note schema carried no accent field. Whether some other import format, another instrument set, or Songsterr's own editor can express a drum accent is unconfirmed, and nothing here tested it. Loudness lives on the beat instead, as ff, pp, mf and mp, and bar 5 already carries an alternating pp and ff shape the transcriber put there. For this tab and this path, accent work has to go through beat dynamics, and that is a larger change than this pass covers.

The barring source count was wrong too. Kasper Sloots' single 10/16 belongs to a passage he transcribed from 1:39 to 2:10, framed by 7/8 and 5/4 and repeated three times against two keyboards. Brown's page is headed @ 0:00. The two describe separate music, so Zappa Analysis never voted on the opening bar at all. For the opening the split is Brown and Bedard on 5/16 plus 5/16 against Drumnet and the tab as published on 10/16. Brown's interior barline is solid and full height, and he beams the two groups apart. Drumnet beams the passage unbroken and numbers its next system from bar 4. Both readings are structural, so this is a source based editorial adjudication, not an objective correction, and the page labels it that way.

What the shipped build changed, and what it left alone

CheckResult
Master bars115 to 115
Time signaturesidentical across all 115
Rhythm and tuplet censusidentical, so the polyrhythms hold
Cells with changed note contentmasterbar 1, track 9 only
Master bars touched at all1
Submitted asr8905491, 10 tracks
Pedal hi-hat on the live revision26 total, 3 of them in bar 1
Staccato on the live revision32, the tab's own count
Intra-beat string collisionsnone
Ghost renderings8, bars 6 to 9, unchanged
Let-ring0, unchanged
Tracks10, every name intact

Evidence, and how to reproduce each claim

Two statements on an earlier version of this page ran ahead of what had actually been measured. Both were re-run properly, and both held.

ClaimWhat was originally shownWhat settles itResult
The eight marks under Brown's staff are one glyphequal width and equal ink count, which is consistent with identity without establishing itbitwise compare of a 14×17 window centred on each mark, all 28 pairs0 differing pixels within those windows
Rhythmic placement was preserveda matching tuplet census, which cannot see a moved onsetper onset: duration, the full set of notes sounding together, grace notes, dynamics and tuplet ratio, plus meters, key signatures, repeat structure and tempo automations8,431 onsets, 3 changed, each one the added pedal hi-hat; 6 tempo automations identical
Only the drum track movednote counts per trackgpif/diff_gpif_tracks.py A B "Ralph Humphrey", which exits 1 on any other track9 tracks identical
The corrected pipeline rule actually holdsan edited source file, which proves nothing until it runsgenerated a 48-hit fixture, wrote it with sd_writegp.py, ran sd_verify.py, then reverted the file to the old encoding and re-ran20 passed / 0 failed, then 2 failed and exit 1
The revisions are where the page saysa description of the stateapi/meta/<songId>/revisions, fields isBlocked, isOnModeration, reviewed20 of 20 read

Source scans are in ~/Projects/_outputs/zappa-drum-sources/, one folder per publisher, each with a SOURCE.md giving the URL, pixel size, byte count and decode check. The measurement crops are in s412162/audit/. Revision hashes come from the image field of each revision record, which is what addresses that revision's part JSON on CloudFront.

Status, in three separate kinds

An earlier version of this page said Zomby Woof "is repaired". That collapsed three states into one. They are kept apart here.

Kind of statusZomby Woof s412162What it does and does not prove
Locally verified buildr8905491-Zomby-Woof-PEDAL-rev4.gpThe file on disk passes every gate. It proves nothing about Songsterr.
Submitted revisionr8905491, queued, isOnModeration=trueSongsterr holds it and its part JSON reads back correct. A moderator has not reviewed it.
Confirmed public revisionstill r8814965 by KirillThis is what a reader sees today. The eight ghost notes are still missing from it.

So Zomby Woof is not repaired in public. Six revisions from this work sit in the queue on that tab: 8902998, 8903141, 8903886, 8904052, 8905411 and 8905491. Only the last is meant to be taken. Songsterr offers no withdraw control, so the earlier five stay in the queue and the revision description asks the moderator to take the newest.

What is left

Update, 2026-09-05 18:20 UTC

Re-queried every tab after the first pass. Two findings change the work list, and the biggest restore now has a settled answer.

15
still damaged and live
3,832
ghost flags still stripped
4
need no action
1
repaired and live

Zoot Allures needs no fix, and neither does Keep It Greasey. A moderator blocked both stripping revisions. isBlocked=true on r8769199 and r8768457, and it is false on every other revision tested, including other authors' revisions on the same songs. A blocked revision cannot be promoted, so the live Zoot Allures keeps all 53 ghosts and Keep It Greasey keeps all 629. Submitting anything to either tab would add queue noise to work that is already correct.

Need no action

#Song IDTitleGhostsLive revWhy it is safe
1s604777Keep It Greasey629r8852151r8768457 blocked by moderator
2s35883Zoot Allures53r7179991r8769199 blocked by moderator
3s412162Zomby Woof32r8814965repaired r8904052; live rev is Kirill's
4s412170Trouble Every Day (Live)9r8815000WRONG, corrected 2026-09-06. Kirill restored only 3 of 9 ghosts. Repaired as r8932027, on moderation.

Still damaged and live

#Song IDTitleGhostsLive revState
1s35881Watermelon In Easter Hay1,317r8768414stripping revision is current
2s35886Muffin Man578r8768517stripping revision is current
3s620961Drowning Witch419r8768566stripping revision is current
4s35870Montana317r8787106stripping revision is current
5s1105085The Black Page173r8768613stripping revision is current
6s35878Nanook Suite168r8769001stripping revision is current
7s35865Nanook Rubs It168r8768967stripping revision is current
8s412178Inca Roads165r8769026stripping revision is current
9s68248Carolina Hard-Core Ecstasy144r8769058stripping revision is current
10s35884Oh No141r8769089stripping revision is current
11s68246Alien Orifice86r8769118stripping revision is current
12s35887What's New In Baltimore?59r8769141stripping revision is current
13s748459Fembot In A Wet T-Shirt57r8769165stripping revision is current
14s20690Uncle Meat (YCDTOSA Vol. 2)24r8788757stripping revision is current
15s749523Catholic Girls16r8788801stripping revision is current

Watermelon In Easter Hay, verdict

WITHDRAWN 2026-09-06. Do not cite this verdict.

The placement argument below is real and it is not sufficient. An audio test on the isolated cymbal stem returned a 41% chance baseline, with ghosted rides at 47% and plain rides at 55%. That spread does not clear chance, so the claim that the 1,316 ride flags are proven intentional was withdrawn. 1,123 ride ghosts remain unexplained. A lower-chance-baseline onset method is required before any verdict. Ship no deletion revision against them. Current adjudication: Program Scope, queue q-2026-09-06-1492ba.

This was the one tab held back by a caveat. Its stripping revision claimed the 1,317 marks were ride and crash at forte, so not ghost notes. Both halves of that reasoning fail against the data.

What r8768414 claimed

"They are all on ride and crash at forte, so they are not ghost notes and no dynamic was changed."

What the pre-sweep data holds

1,316 sit on ride (MIDI 51) and 1 on crash (MIDI 49), so the lane half is right. The staff holds 1,785 beats and exactly one written dynamic. That single forte is bar 1, and it sits on the one ghosted crash, a tremolo swell marked velocity f with gradualVelocity crescendo. The other 1,784 beats carry no written dynamic, so 1,316 ride ghosts stand on no dynamic at all.

The placement is a perfect accent grid

The ride runs as a continuous sixteenth ostinato. Counting every ride note by its sixteenth slot in the bar:

16th slot in barPlain noteheadGhost notehead
0, 4, 8, 12 (the quarter pulse)4072
every other sixteenth11,314

The ride is struck plainly on each quarter and ghosted on every sixteenth between. A ghosted ride note is alone in its beat 99.4% of the time; a plain one shares its beat with kick or snare 60.8% of the time. That is the notation telling a drummer to keep the ride quiet except where it lines up with the backbeat.

Verdict: all 1,317 are genuine and must be restored. The caveat is cleared.

Correction, and it cuts against my own earlier figure. I first reported the Frank Zappa staff going 1,056 notes to 1,061 across that edit. That was a measuring artifact. The reading tool called any entry without a fret key a rest, and a dead-string note also has no fret. Five dead notes on that staff carry no fret in the pre-sweep revision and carry fret 0 in the live one, so the tool scored them as rests in one and as notes in the other.

Measured on the rest field the data actually carries: 1,061 sounding notes before and 1,061 after, a delta of zero. The staff gained 4 quarter rests at bars 3, 5, 7 and 9. Tool patched, backup at songsterr_live_read.py.bak-pre-restfix-2026-09-05.

A parallel session ran the same trail and found what the round trip actually cost: one chord symbol, E7Msus2 at bar 3. Everything else is encoding, 91 bend points gaining a precisePosition, 136 vibrato flags re-encoded, and 21 apparent fret differences that are the same notes in a different array order. The description was inaccurate; the practical loss is one chord label.

Independent verification of the Watermelon restore file

A parallel session built RESTORED-s35881-v2.gp on the current live export. Checked here against both the pre-sweep revision and the live one, at render level rather than by element count, since GPIF Notes are shared objects and a raw count hides position errors.

CheckResult
Drum-staff note slots, pre-sweep vs restored2,091 vs 2,091, sets identical
Ghost positions, pre-sweep vs restoredidentical set, 0 missing, 0 extra
Lanes restored1,316 ride (51), 1 crash (49)
Other eight stavesnote and ghost counts unchanged
letRing on the drum staff0 (the 25 in the file sit on two guitar staves)
Bars and tracks105 and 9, unchanged

The file is correct and ready to submit. Its 1,332 AntiAccent elements are 15 pre-existing plus 1,317 written copy-on-write, which is why an element count reads higher than the rendered 1,317.

The Watermelon accent grid, every slot

Every ride note on the Vinnie Colaiuta staff, counted by its sixteenth-note position within the bar. The quarter pulse is plain, everything between it is ghosted, and the split is close to absolute.

16th slotPositionPlainGhosted
0quarter pulse1030
10102
21151
30150
4quarter pulse1011
50101
60102
70101
8quarter pulse1020
90101
100102
110101
12quarter pulse1011
130101
140101
150101
quarter pulse (0,4,8,12)4072
every other sixteenth11,314

Slots 2 and 3 carry more notes than their neighbours because some bars subdivide further. The pattern holds regardless: a ride note on the pulse is written plain 407 times against 2 exceptions, and a ride note off the pulse is written ghosted 1,314 times against 1.

All sixteen restores are submitted

A parallel session uploaded every damaged tab. Watermelon went up as r8908034 and reads back from CloudFront with 1,317 ghosts, 1,316 on ride and 1 on crash, matching the pre-sweep revision exactly.

TabRestore revisionGhosts
Watermelon In Easter Hayr89080341,317
Muffin Manr8906880578
Drowning Witchr8908109419
Montanar8907028317
The Black Pager8907247173
Nanook Suiter8907360168
Nanook Rubs Itr8907423168
Inca Roadsr8907511165
Carolina Hard-Core Ecstasyr8908182144
Oh Nor8908239141
Alien Orificer890768986
What's New In Baltimore?r890827659
Fembot In A Wet T-Shirtr890760157
Uncle Meatr890795224
Catholic Girlsr890777816
Zomby Woof (AI)r8906157 (live)10

Who blocked the two dead revisions. Keep It Greasey r8768457 was rejected by Kirill527 and Zoot Allures r8769199 by Darr, both on 2026-09-01. Live Zoot Allures keeps all 53 ghosts: 18 snare, 13 crash, 12 closed hat, 8 pedal hat, 1 kick, 1 low tom, letRing 0.

Montana is counted across two drum staves, 212 on track 15 and 105 on track 17. A single-part read returns 212 and undercounts the tab.

Correction, my second field-name error in the same audit

I first wrote that every note on that staff carries dynamic: null, so no forte existed anywhere. Wrong, and wrong the same way the rest bug was. Songsterr names that field velocity, not dynamic. The key dynamic appears zero times in the schema, so reading it returned null for all 1,785 beats and I mistook an absent key for an absent marking.

Measured on velocity: one beat carries f, 1,784 carry nothing. A parallel session caught this. It leaves the verdict standing, since one forte in 1,785 beats cannot support "they are all at forte", and it stops the page overshooting in the other direction.

The beat is worth seeing on its own terms. It is the only crash ghost on the staff and it reads {fret 49, ghost true, velocity f, gradualVelocity crescendo, tremolo [1,32]}: a cymbal swell, not a quiet stroke. That one ghost means something different from the 1,316 on the ride. Velocity is identical in both revisions, so the sweep did not change any dynamic, which its description got right.

Both errors share a root: I searched for a field name I assumed and read its absence as evidence. Same as grepping <Ghost> in GPIF and concluding the file had no ghosts.

A challenge to these numbers, resolved

Another session queued a finding that this page's per-song counts disagree with the local ORIGINAL files, reporting a total of 5,322 rendered ghosts across 22 files against the 3,832 counted here. Measured properly, every number on this page holds. The gap is scope.

SongThis pageFile, all stavesDrum stavesOther staves
Watermelon In Easter Hay1,3171,3331,31716
Muffin Man57861357835
Drowning Witch41949641977
Montana317574317257
Zoot Allures5353530

The drum-staff column matches this page on every row. The larger file totals count ghost noteheads on vocal, guitar, keyboard and mallet staves, which the sweep never touched and correctly left alone. Montana's 257 non-drum ghosts break down as Vocal 1/2/3 102, Frank Zappa Lead 112, George Duke 23, Ruth Underwood Bridge 14 and Tom Fowler 6, matching the 2026-08-30 audit record exactly.

Zoot Allures looked like the one row that agreed for a reason worth stating. It carries zero non-drum ghosts, so its two totals coincide. That coincidence is what made the other four look wrong.

Why the sweep passed its own audit

The 2026-08-31 handoff records that no notes were lost, measured across 20 folders and 120,579 beat events with zero pitch, rhythm or position differences. That statement is true. It was also produced by an instrument that could not see the thing being destroyed.

One hardcoded line

noteloss_audit.py built its per-note fingerprint from a fixed list of effect tags:

Line 80, as written
for tag in ("Tie", "Accent", "Vibrato", "LetRing", "Trill"):

AntiAccent is not on that list, and AntiAccent is how GPIF spells a ghost note. So a ghosted note and a plain note fingerprinted identically, and removing every ghost in a tab produced no difference at all.

NoteFingerprint under the old rule
plain rideart=0;Midi=51
ghosted rideart=0;Midi=51 (identical)
accented rideart=0;Midi=51;Accent=1 (visible, it is on the list)

Run both versions against the real Watermelon pair

ToolDiffering events foundAntiAccent mentions
as it ran during the sweep150
enumerating effects structurally1,33275

The 1,332 accounts exactly: 1,317 ghost losses plus the same 15 encoding differences the old version already reported. The audit was not merely incomplete. On the one question that mattered it returned a clean result with full confidence.

Fixed. The fingerprint now enumerates every child element of a note except the two structural ones, so a marking nobody anticipated still shows up. Verified: ghost, accent, letRing and tie now each produce a distinct fingerprint. Backup at noteloss_audit.py.bak-pre-antiaccent-blindness-2026-09-05.

This is the fourth instance of one root cause in this audit, and the most costly. <Ghost> returning zero started the sweep. An articulation-table search concluded the flags were not in the file. A missing fret read as a rest invented five notes. A missing dynamic key read as an absent marking. Here a hardcoded allowlist made a real loss invisible. Every one of them enumerated what was expected and treated what was absent as evidence.

The sixth instance, caught by Brandon

Two sessions agreed that Songsterr's drum note schema has no accent field, so a drummer's accents could not be notated. Brandon opened the editor and said he could see the accent option. He was right, and both of us had made the same error this page spends its length documenting.

The field is accentuated

The original claim came from a key inventory of one part of one tab that happened to contain no accents. Scanning 106 parts across 11 tabs gives the schema actually in use:

string, fret, rest, tie, staccato, dead, hp, slide, ghost, bend, leftHandVibrato, accentuated, harmonic, harmonicFret, trill, tremolo

accentuated: 1 is an accent, accentuated: 2 is a marcato, and they appear on drum staves. Keep It Greasey s604777 carries 60 at marcato on the Vinnie Colaiuta staff; Drowning Witch s620961 carries 7 accents and 2 marcatos on its drum staff.

Why an accent kept arriving as a staccato dot

GPIF <Accent> is a bitfield, not an enum. This page first published the bit meanings from an assumed specification. That was wrong and it is corrected below from measurement.

GPIF valueServed asMarkingHow this is known
1staccatostaccato dotmeasured, bars 300/302/304
4accentuated 2marcato ^measured, glyph seen at bar 3
8accentuated 1accent >closed 2026-09-06, reference implementation
9accentuated 1 + staccatoaccent plus dot8 | 1

The correspondence is measured in both directions. On Drowning Witch's drum staff, GPIF Accent=4 renders twice, at bars 3 and 101, and the served JSON carries exactly two accentuated: 2 notes at bars 3 and 101. Accent=8 renders seven times at bars 128 and 173, and the JSON carries exactly seven accentuated: 1 notes at bars 128 and 173. Counts and bars agree both ways.

The glyph pins one end. Rendering bar 3 at 6x shows a caret above the accented tom, an inverted V with a clean apex. That is a marcato, so Accent=4 is the heavy accent and accentuated: 2 is marcato.

CLOSED 2026-09-06 from the reference implementation, no longer an inference. alphaTab is the open-source library that reads and writes the GP7 .gp container, and its GPIF code states the mapping outright in three independent places.

Three routes, one answer

RouteFileWhat it says
Readersrc/importer/GpifParser.tsaccentFlags & 0x04 sets AccentuationType.Heavy; & 0x08 sets AccentuationType.Normal; & 0x01 sets staccato; & 0x10 sets Tenuto
Writersrc/exporter/GpifWriter.tsNormal emits 0x08, Heavy emits 0x04, Tenuto emits 0x10. The round trip closes.
Glyphrendering/glyphs/AccentuationGlyph.tsNormal draws ArticAccentAbove, the accent wedge. Heavy draws ArticMarcatoAbove, the caret.

So <Accent>4</Accent> is Heavy, drawn as a marcato caret, and <Accent>8</Accent> is Normal, drawn as an accent wedge. That is the same table the measurement produced, now backed by the code that implements the format. alphaTab's own rendered notation legend shows the three markings in order: staccato dots, then carets, then wedges.

The bar-128 render, closed visually on 2026-09-07

The original attempt failed because Songsterr's notation is virtualised and never painted at that scroll depth. The fix was to stop asking that viewer. The file on disk was rendered directly with alphaTab 1.6.0 in headless Chrome, one bar per page at scale 4, drums track 15 only, then cropped at native resolution.

Bar 101 renders a marcato caret for Accent=4. Bar 128 renders an accent wedge for Accent=8.

Bar 128 draws a wedge. The mark above the final notehead is a horizontal > with its apex to the right, which is ArticAccentAbove. Bar 101 draws a caret. The mark above the first notehead is an inverted V with a clean apex, which is ArticMarcatoAbove. That is a second marcato sighting independent of bar 3.

Structure was resolved by walking MasterBar to Bars to Voices to Beats to Notes, which reproduces the earlier census exactly: Accent=4 renders twice on drums at bars 3 and 101, Accent=8 renders seven times at bars 128 and 173. So the mapping now holds on four routes: reader, writer, glyph enum, and a picture of the real file.

So writing <Accent>8</Accent> gives an accent, and 4 gives a marcato. An earlier version of this page had those two swapped. Acting on it would have printed marcatos where accents belong, on someone else's transcription, which is the parentheses mistake in a new costume.

This is the sixth instance of the same root cause, and it happened inside the work documenting that root cause. Absence in a sample is not absence from a schema. Inventorying one file and generalising is the same move as grepping <Ghost> once. The rule needs its scaled-up form: sweep many files before declaring a field does not exist, and a checker must enumerate what is present rather than a list of what you expect.