Watermelon In Easter Hay: the cymbal notation does not track the cymbal stem

A two-direction audio check of tab s35881, run against a circular-shift null, three positive controls and a five-stem negative control.

Built 2026-09-07 15:00 CDT · anchor clock: 97 snare anchors, piecewise linear, span 59.3s to 506.1s · tolerance 45 ms

The finding

What it does NOT license

Direction A and B across five detection thresholds

Measured Direction A asks whether every written cymbal event has audible support. Direction B asks whether every clearly audible cymbal onset has notation. Null is 200 circular shifts of the whole notated set inside the scored span.

flux pctonsets founddensity A written→audibleA nullA ratio B audible→writtenB nullB ratio
802,4785.55/s0.4760.4441.07x0.3820.3181.20x
901,5333.43/s0.3110.2821.10x0.3910.3211.22x
959292.08/s0.1930.1741.11x0.4020.3221.25x
97.55761.29/s0.1320.1091.21x0.4220.3211.32x
993070.69/s0.0700.0621.13x0.4140.3211.29x

Every cell in both ratio columns falls below 1.5x. The answer does not depend on where the detection threshold is set.

Positive controls: does the method work at all

Measured Same clock, same tolerance, same null, each notation lane against its own stem at the 95th percentile.

notation lanestemnotatedonsetsA ratioB ratio
snare (midi 38,40)snare1934665.90x5.23x
kick (midi 35,36)kick1076523.00x3.28x
toms (midi 41-50)toms65693.67x3.45x
cymbal (midi 49,51)cymbals1,7789291.16x1.26x

Kick is the load-bearing control. Its anchors are not the snare anchors that built the clock, its band is 30 to 180 Hz rather than 2 to 12 kHz, and it still reaches 3.00x. The clock is sound and the method discriminates.

Negative control: each lane against stems it should not match

Measured If the cymbal lane scored no better against cymbals than against bass, it is at chance. It does not, and the row that stands out is not the one expected.

notation lanevs stemA ratioB ratio
cymbalcymbals1.14x1.27xits own stem
cymbalsnare2.14x1.07x
cymbalkick1.12x1.26x
cymbalbass0.87x0.98x
cymbalpiano1.03x1.08x
snarecymbals2.32x2.32x
snaresnare5.74x5.28xits own stem
snarekick0.32x0.37x
snarebass1.28x1.31x
snarepiano1.08x1.16x

Snare notation behaves correctly: 5.74x on its own stem, 2.32x on cymbals through bleed, 0.32x against kick because snare and kick alternate. Cymbal notation does not: its best score, 2.14x, lands on the snare stem.

The submission artifact, settled from the files

Measured Chord elements and CDATA blocks counted in each candidate's score.gpif.

fileCDATAChord elementsverdict
PRESWEEP-r7715683.gp (saved original)1378the reference
RESTORED-s35881-TEXTSAFE-v2.gp1378exact parity with the original, ship this
RESTORED-s35881-TEXTSAFE.gp1367one CDATA and one chord short
r8768414-LIVE-EXPORT.gp (the live tab)1366two chords lost on the live tab
RESTORED-s35881-v3-with-chord.gp07quarantined, wipes all 9 names

The chord question, answered

The chord did not vanish through a new transcription decision. The saved original carries 8 chord elements and the live tab carries 6, so two were lost on the tab. TEXTSAFE-v2 already restores both, and its chord-definition ids and beat-level chord references show an empty symmetric difference against the saved original. The separate chord patch is redundant and poisoned: 7 chords rather than 8, and zero CDATA.

What the upload changes, against the live tab

positions added        0
positions removed      0
dynamic marks added    0
dynamic marks removed  0
dynamics changed       0
anti-accent added      1,317
note events    4,855 -> 4,855

The upload does exactly one thing. It restores the author's 1,317 ghost flags and repairs the 9 empty track names as a consequence of preserving CDATA. Nothing moves.

The one remaining step

Method

onset function   spectral flux, 1024-pt Hann, 256 hop, 44.1 kHz
                 cymbals/snare 2-12 kHz, kick 30-180 Hz, toms 80 Hz-3 kHz
peak picking     local maxima above the Nth flux percentile, 60 ms min separation
clock            piecewise linear through 97 accepted snare anchors (np.interp)
                 scoring restricted to the anchor span, 59.33 s to 506.08 s
tolerance        45 ms half-window
null             200 circular shifts of the entire notated set inside the span
tools            tools/cymbal_two_way.py, tools/lane_control.py, tools/cross_stem.py
data             data/cymbal_two_way.json, data/lane_control.json, data/cross_stem.json

What this did not test