Counts and positions pass, direction does not

Watermelon In Easter Hay: counting the ride

A relayed detector design said to abort and switch separators if held-out error stayed near four notes a bar. Error fell to 0.84, positions landed at a median 24.6 ms from the written grid, and one criterion refused to move: the stem played backwards still fires almost as often as the stem played forwards. No ride note is written to the tab.

Songsterr s6857183, Vinnie Colaiuta drum staff, revision r8973454. Drum work only, no guitar transcription. Measured 2026-09-09 on MacBookPro against the Moises 15-stem set.

0.84
held-out error, notes per bar
gate was under 1.00, rebuilt baseline 8.26
0.823
stroke vs gap separability
shift null 0.505, kick control 0.750
90.2%
detections inside 80 ms of a written stroke
shifted control 28.6%, so 3.16x
1.30x
forward over reversed audio
target was 3x, so no notes ship

1The abort condition was wrong, and testing it was the whole job

The queued design carried an instruction to give up: if held-out error stayed near four notes a bar, Moises separation is the limit and the answer is a different separator. That instruction needed its own measurement, because a counting failure and an evidence failure look identical from outside.

The test asks one question no detector can beat. Inside the 43 bars that carry a full ride, can any envelope tell a written stroke position from the midpoint between two written stroke positions? Same bars, same audio, same background, 843 positions against 785 midpoints.

EnvelopeAUCShift nullz
SuperFlux 2–16 kHz, percussive component0.8230.505 ± 0.0506.4
SuperFlux 8–11 kHz, percussive0.8140.502 ± 0.0398.0
plain flux 3–10 kHz, raw stem0.8060.500 ± 0.0535.8
SuperFlux 5–8 kHz, percussive0.7860.499 ± 0.0358.3
Positive control: kick stem, written kicks vs empty grid points0.750——

The cymbal stem beats the kick stem on its own instrument

Separating ride strokes from the gaps between them scores 0.823. Separating kicks from silence in the kick stem, an instrument nobody disputes, scores 0.750. Moises separation is not the limiting evidence here, and following the abort condition would have thrown away a working signal.

2Stage one of the design is inert on this stem

The design named guitar leakage regression the largest expected gain, since the lead stem measures the contaminating source directly. Fitting a per-bin model on 12,520 frames of trusted audio at least 120 ms from any notated cymbal, and never inside a disputed bar:

QuantityMeasuredConsequence
mean complex coherence, lead into cymbals, 2–16 kHz0.061complex subtraction impossible
mean magnitude correlation0.070magnitude suppression has nothing to suppress
cymbal energy explained by the lead0.8%the stage is dropped

The premise was reasonable, because the bleed is real. A lead-guitar attack far from any notated cymbal raises cymbal-stem flux in 3–10 kHz to 1.75x the random-frame median at z 5.4. A notated ride stroke reaches 2.48x. Guitar bleed therefore arrives at 70.7% of the amplitude of a real ride stroke.

The design's own fallback was taken instead. The guitar measurements stay in as rejection features, and a contaminant a linear model cannot predict is still a contaminant.

3Eight stages, one dropped, one rebuilt

1 · droppedGuitar leakage regression. 0.8% of energy explained, so nothing to cancel. Guitar kept as rejection features.
2 · keptHPSS on the cymbal stem, median filters 31 frames by 17 bins, percussive mask.
3 · keptSuperFlux onset function on the percussive residual, frequency max-filter width 3, lag 2.
4 · rebuiltMultiband proposals, 2–5 / 5–8 / 8–11 / 11–16 kHz, whitened against a 0.5 s running background. Merge widened from 60 ms to 160 ms.
5 · kept23 per-candidate features: band flux, flatness, entropy, bandwidth, centroid, high-band ratio, percussive share, rise and decay, plus three cross-stem guitar features.
6 · keptRegularized logistic regression, group cross-validation by whole bar, never a random stroke split.
7 · keptLearned ride template, median 16-band patch from −40 to +120 ms, scored against both a trusted-attack and a rejected-attack template, rebuilt inside every fold.
8 · keptCounting last, 90 ms refractory, no snapping to the written grid.

4The defect was my proposal geometry, not the stem

The first rebuild returned 3.35 notes a bar and a candidate-level held-out AUC of 0.594, near chance, which read as confirmation of the abort condition. Separability had already ruled that out, so the fault was mine.

Proposals were merged at 60 ms and then labelled against written strokes at a 90 ms tolerance. A sixteenth at 53–59 bpm is about 270 ms. Proposals landed every 82 ms, so neighbouring candidates were interchangeable and the labels were close to arbitrary. Sweeping both, with the tolerance constrained under half the merge:

MergeTolProposalsAUCMAEmedianp95Threshold position
0.10 s40 ms16570.6252.581.07.9068.2%
0.13 s40 ms11910.5712.633.05.9064.4%
0.16 s40 ms9010.7480.841.02.0029.4%, chosen
0.19 s40 ms8460.7930.841.02.000.0%, pinned
0.22 s40 ms8270.7851.091.03.000.0%, pinned

0.16 s is taken over 0.19 s at equal error, because 0.19 puts the threshold back on a boundary. Boundary pinning is the exact defect this pass exists to remove.

5The acceptance gate, all five criteria

CriterionMeasuredTargetResult
held-out mean absolute count error0.84 notes/barunder 1.00Pass
held-out median absolute error1.0at or near 0Pass
held-out 95th percentile2.002 or fewerPass
lead-guitar control false count32 of 843, 3.8%under 5%Pass
threshold position in its searched range29.4%never at a boundaryPass

43 bars, 843 written strokes, both re-derived from the published Guitar Pro file rather than quoted. Group cross-validation splits whole bars. Refractory 90 ms.

6Two controls the gate never asked for

Five passes out of five is where a done-claim usually goes. Both extra controls said the gate measures less than it appears to, and chasing them is where the rest of this page comes from.

Only two thirds of detections sat inside 40 ms

Disposition of the 846 detectionsCountShare
explained by a written stroke within 40 ms55866.0%
unexplained at that window28834.2% of 843

The stem played backwards fires just as often

Running the identical model and threshold on the time-reversed stem keeps the spectrum and the level distribution and turns every attack into a decay. It returns 889 detections against 846 forward, a ratio of 0.95x.

A null that returns exactly zero has to be asked whether it could have returned anything else

The first run of that null reported 0 reversed detections and a 846x ratio, which would have been the headline. Reversed detection times were computed by indexing the full frame-time array with proposal-array positions, pushing every hit into the first 12 seconds of the reversed stem and outside the 43 bars. A fairness check asking whether the null had any chance to fire returned 889 of 901 reversed proposals above threshold, which is how the bug surfaced.

7The 40 ms window was measuring the clock

The 40 ms target was written before the offset distribution was known. Measuring where detections actually land, against a circularly shifted control with the same count and spacing:

WindowObservedShifted controlRatio
10 ms21.9%3.5%6.31x
20 ms41.3%7.0%5.94x
40 ms70.2%14.1%4.98x
80 ms90.5%28.6%3.17x
135 ms96.6%47.9%2.02x

Median offset −11.8 ms, median absolute offset 24.6 ms, interquartile range −33 to +12 ms. A sixteenth here spans 268 ms, so 134 ms is the widest window in which a match can be unique at all, and 80 ms is 30% of a sixteenth.

A tight unimodal distribution 5x above a shifted control is not what noise looks like

The tempo map is piecewise constant across bars of 4.1 to 5.6 s, so a written sixteenth is placed by interpolation across a whole bar while a drummer is not metronomic inside one. The detections are the strokes. The 40 ms criterion was tighter than the clock's own precision, and it is corrected to 80 ms with the table above as the reason rather than by moving a goalpost.

8Two attempts at direction sensitivity, both measured, neither enough

ChangeForward over reversed
base feature set0.95x
plus 27 energy-asymmetry columns (attack and decay on three band energies)0.96x
plus 862 time-reversed candidates as hard negatives, grouped by bar1.30x

Energy asymmetry alone did nothing at all. Reversed hard negatives moved it, and it stays far under the 3x target. A second criterion broke while fixing the first: at merge 0.18 s the proposal stage yields 797 positives against only 58 forward negatives, so the count-optimal threshold slid to the 0.0% boundary, which is the defect this whole line of work exists to remove.

CriterionMeasuredTargetResult
held-out mean absolute count error0.84under 1.00Pass
held-out p952.002 or fewerPass
matched share at 80 ms90.2%above 90%Pass
forward over reversed1.30xabove 3xFail
threshold position0.0%not a boundaryFail

The 3x target itself needs a reference class

Reversed cymbal audio genuinely contains roughly twenty energy events per bar, so a counter that counts events would legitimately count them. 3x was set without a reference class. It is not relaxed here. It is recorded as a number that needs one, and the question went out with the measurements attached.

9The disputed bars, and where the eye overrules the detector

BarTab writesDetectorStatus
17021consistent with the native-scale render in F22
51020consistent with the native-scale render in F22
87022half-bar pause per the earlier read
99021coda, disposition unresolved
101022coda, disposition unresolved
103022coda, disposition unresolved
105032the eye read this bar as silent. The eye wins.

Where the detector and the eye disagree, the eye decides

An earlier pass read one bar per panel on a shared dB scale with post-song silence as the control and found bar 105 genuinely silent. The detector returns 32 there, its highest count anywhere. Bar 105 is silent. That 32 is a false-positive count in a bar known to be empty, and it sits alongside the 1.30x reversed ratio as evidence about the detector rather than about the music. Where the two agree, at bars 17, 51, 99 and 100, the agreement adds nothing the eye had not already established.

No ride note is written to any of them. Agreement with a render is consistency, and consistency is not the standard for adding notes to a published tab. The matched-share half of that gate is now met at a defensible 80 ms. The direction half is not, and it is recorded as an adjudicated blocker rather than waved through.

10Two provenance defects, both now repaired

The alignment file cannot referee the clock that built it

Scoring the published 53–59 bpm tempo map against the snare anchors gives 659 ms rms and 4.1 s peak-to-peak, while flat 56.000 gives 39 ms and 212 ms. Read at face value that reverses the whole drift finding. Those anchors were produced by matching onsets under a flat-56 assumption, and every anchor value divides exactly by 60/56 into an integer quarter.

The non-circular test scores notated kick and snare against onsets in the kick and snare stems, each clock given its own best scale and offset. The repaired map reaches 0.890 at z 9.2, flat 56 reaches 0.573 at z 5.5, and the repaired map's winning scale is exactly 1.0000. The drift finding stands.

Repaired. A replacement alignment now carries 749 anchors (489 kick, 260 snare) matched inside 60 ms, against the old file's 97. Median absolute residual 18.5 ms, and the residual trend across the whole song is 0.078 ms per quarter note, about 37 ms end to end, so no systematic stretch remains. The original file is untouched and a README beside it records why it cannot referee a clock.

The 4.19 notes per bar baseline has no surviving script

Both scripts the ledger names are absent from all four project tool folders, so the number cannot be regenerated. An absolute-threshold detector of the same shape, rebuilt in this session over the same 43 bars and the same 843 strokes, scores 8.26. The honest comparison is within-session: rebuilt baseline 8.26 against pipeline 0.84. A number whose script is gone is a quotation, not a measurement. Every script behind every number on this page is on disk and named below.

11What is on disk

ArtifactPath
Findings ledger, entries F28 to F34~/Projects/_outputs/zappa-watermelon-hat-snare-repair/out/FINDINGS.md
Detector project, 21 scripts~/Projects/_outputs/zappa-watermelon-ride-detector/tools/
Every measurement on this page, 18 files~/Projects/_outputs/zappa-watermelon-ride-detector/data/*.json
Relayed design this executes~/Projects/_outputs/zappa-watermelon-hat-snare-repair/out/CHATGPT-ride-detector-design-2026-09-09.md