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.
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.
| Envelope | AUC | Shift null | z |
|---|---|---|---|
| SuperFlux 2–16 kHz, percussive component | 0.823 | 0.505 ± 0.050 | 6.4 |
| SuperFlux 8–11 kHz, percussive | 0.814 | 0.502 ± 0.039 | 8.0 |
| plain flux 3–10 kHz, raw stem | 0.806 | 0.500 ± 0.053 | 5.8 |
| SuperFlux 5–8 kHz, percussive | 0.786 | 0.499 ± 0.035 | 8.3 |
| Positive control: kick stem, written kicks vs empty grid points | 0.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:
| Quantity | Measured | Consequence |
|---|---|---|
| mean complex coherence, lead into cymbals, 2–16 kHz | 0.061 | complex subtraction impossible |
| mean magnitude correlation | 0.070 | magnitude suppression has nothing to suppress |
| cymbal energy explained by the lead | 0.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
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:
| Merge | Tol | Proposals | AUC | MAE | median | p95 | Threshold position |
|---|---|---|---|---|---|---|---|
| 0.10 s | 40 ms | 1657 | 0.625 | 2.58 | 1.0 | 7.90 | 68.2% |
| 0.13 s | 40 ms | 1191 | 0.571 | 2.63 | 3.0 | 5.90 | 64.4% |
| 0.16 s | 40 ms | 901 | 0.748 | 0.84 | 1.0 | 2.00 | 29.4%, chosen |
| 0.19 s | 40 ms | 846 | 0.793 | 0.84 | 1.0 | 2.00 | 0.0%, pinned |
| 0.22 s | 40 ms | 827 | 0.785 | 1.09 | 1.0 | 3.00 | 0.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
| Criterion | Measured | Target | Result |
|---|---|---|---|
| held-out mean absolute count error | 0.84 notes/bar | under 1.00 | Pass |
| held-out median absolute error | 1.0 | at or near 0 | Pass |
| held-out 95th percentile | 2.00 | 2 or fewer | Pass |
| lead-guitar control false count | 32 of 843, 3.8% | under 5% | Pass |
| threshold position in its searched range | 29.4% | never at a boundary | Pass |
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 detections | Count | Share |
|---|---|---|
| explained by a written stroke within 40 ms | 558 | 66.0% |
| unexplained at that window | 288 | 34.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:
| Window | Observed | Shifted control | Ratio |
|---|---|---|---|
| 10 ms | 21.9% | 3.5% | 6.31x |
| 20 ms | 41.3% | 7.0% | 5.94x |
| 40 ms | 70.2% | 14.1% | 4.98x |
| 80 ms | 90.5% | 28.6% | 3.17x |
| 135 ms | 96.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
| Change | Forward over reversed |
|---|---|
| base feature set | 0.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 bar | 1.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.
| Criterion | Measured | Target | Result |
|---|---|---|---|
| held-out mean absolute count error | 0.84 | under 1.00 | Pass |
| held-out p95 | 2.00 | 2 or fewer | Pass |
| matched share at 80 ms | 90.2% | above 90% | Pass |
| forward over reversed | 1.30x | above 3x | Fail |
| threshold position | 0.0% | not a boundary | Fail |
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
| Bar | Tab writes | Detector | Status |
|---|---|---|---|
| 17 | 0 | 21 | consistent with the native-scale render in F22 |
| 51 | 0 | 20 | consistent with the native-scale render in F22 |
| 87 | 0 | 22 | half-bar pause per the earlier read |
| 99 | 0 | 21 | coda, disposition unresolved |
| 101 | 0 | 22 | coda, disposition unresolved |
| 103 | 0 | 22 | coda, disposition unresolved |
| 105 | 0 | 32 | the 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
| Artifact | Path |
|---|---|
| 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 |