Watermelon: the other 20 bars, decision sheet

Every measure that needs the index-24 treatment, measured off the live head r8968524 with the /transcription-repair skill. Built 2026-09-08.

measures 20
toms involved 113
cymbal collisions 95
sub-16th tom beats 41
skill hands verdict False
red zone [54]

What this is, and what it is not

Five sessions were running on this song at once. The chat titled Final watermelon was three minutes ahead on the file build, so this session did not build a competing .gp and did not write to s6857183. This page is the measurement, so the decision can be made by ear the way index 24 was.

Every number is read from the live drums payload of r8968524, or from the skill's own gates run on candidate v11. Nothing here is an edit.

A reader bug in the skill, found and fixed

tr_ledger.py resolved percussion only through Property name="Element". GP7 and GP8 carry the kit index in <InstrumentArticulation> instead, so every drum note read as midi -1 and tr_gate.py track called this a 100 percent off-GM-map, not a drum staff. A second fault sat behind it: these notes also carry Property name="Midi" holding the pitched value, which shadowed the articulation even once the index was found.

Both are patched. The gate now reads drum staff with lanes 36, 40, 41, 44, 45, 46, 47, 48, 49, 51, 57, and the census returns ride 1525, kick 505, snare 340, pedal hi-hat 245, which matches the live tab. All skill self-tests still exit 0. Backup at tr_ledger.py.bak-pre-instrumentarticulation-2026-09-08.

One cosmetic issue left alone: tr_score.py line 546 truncates its JSON dump at 8000 characters, so the CLI emits unparseable JSON on a long result. Call hands_gate() directly instead.

Red zone, corrected

An earlier note from this session claimed 20 of these measures were red zone because they are 5/4. The skill's own redzone disagrees: it returns red_zone_bars [54], tuplets only, with no odd-meter or meter-change bars. So 19 of the 20 are repairable and index 54 is the one that needs its rational positions from a written source.

The file's own subdivision vocabulary is 1, 2, 4, 8, 16, 32, 64, finest 64, with 32nds appearing 90 times and 64ths 40. A 32nd is therefore legal here, and the 41 sub-16th tom beats below still need affirmative evidence rather than a leftover from an unsnapped onset.

The 20 measures

Index is 0-based into the drums part, the same numbering Songsterr's diff view prints. Chart bar is index minus 8. Collisions are cymbal strokes sitting on a sixteenth a tom already occupies. "3 hands" is the skill's own hands_gate count on candidate v11.

indexchartmetertoms drums usedcymcym rests collisionscolliding 16thssub-16th 3 hands
1354/44HighFloor15034.0, 5.0, 6.031
1465/46HighFloor, High200416.0, 17.0, 18.0, 19.040
20125/44HiMid, High200316.0, 18.0, 19.030
28205/46HighFloor, HiMid200512.0, 14.0, 16.0, 18.0, 19.031
32245/45HiMid200316.0, 17.0, 18.040
40325/46HighFloor200612.0, 13.0, 14.0, 16.0, 17.0, 18.001
42345/45HiMid200416.0, 17.0, 18.0, 19.040
44365/46HiMid, High20066.0, 9.0, 12.0, 13.0, 14.0, 16.001
48405/46HiMid, High200610.0, 12.0, 16.0, 17.0, 18.0, 19.001
54465/47HiMid, High17054.0, 13.0, 14.0, 16.0, 17.001
56485/411HighFloor, HiMid200114.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 19.002
60525/46HiMid, High200511.0, 14.0, 15.0, 17.0, 18.011
62545/43HiMid, High200315.0, 17.0, 18.000
64565/46HighFloor, HiMid, High200511.0, 14.0, 15.0, 16.0, 17.050
72645/43HighFloor20038.0, 9.0, 10.000
78705/43HighFloor200210.0, 12.021
80725/46HighFloor20063.0, 4.0, 7.0, 8.0, 9.0, 10.010
82745/48HiMid, High20053.0, 4.0, 6.0, 7.0, 8.081
84765/46HighFloor, HiMid20061.0, 2.0, 4.0, 6.0, 7.0, 8.001
88805/46HighFloor20042.0, 3.0, 4.0, 18.031

Totals: 95 colliding cymbal strokes, 41 sub-16th tom beats, 113 toms. Every measure carries zero cymbal rests, which is the fault index 24 had before it was fixed by hand.

Per measure, the exact positions

Positions are sixteenths from the downbeat, zero-based.

indextoms atcollisions atsub-16th beats
134.25:HighFloor 4.75:HighFloor 5.0:HighFloor 5.5:HighFloor4.0, 5.0, 6.04.25(len 0.5) 4.75(len 0.25) 5.0(len 0.5)
1415.75:HighFloor 16.5:HighFloor 16.75:HighFloor 17.75:High 18.75:High 19.0:High16.0, 17.0, 18.0, 19.015.75(len 0.25) 16.5(len 0.25) 18.75(len 0.25) 19.0(len 0.75)
2016.0:High 18.0:HiMid 18.75:HiMid 19.25:HiMid16.0, 18.0, 19.018.0(len 0.75) 18.75(len 0.5) 19.25(len 0.75)
2812.0:HiMid 14.0:HiMid 16.0:HiMid 18.0:HighFloor 18.75:HighFloor 19.25:HighFloor12.0, 14.0, 16.0, 18.0, 19.018.0(len 0.75) 18.75(len 0.5) 19.25(len 0.75)
3216.0:HiMid 16.25:HiMid 17.0:HiMid 17.5:HiMid 18.0:HiMid16.0, 17.0, 18.016.0(len 0.25) 16.25(len 0.75) 17.0(len 0.5) 17.5(len 0.5)
4012.0:HighFloor 13.0:HighFloor 14.0:HighFloor 16.0:HighFloor 17.0:HighFloor 18.0:HighFloor12.0, 13.0, 14.0, 16.0, 17.0, 18.0none
4216.0:HiMid 16.75:HiMid 17.25:HiMid 18.0:HiMid 19.25:HiMid16.0, 17.0, 18.0, 19.016.0(len 0.75) 16.75(len 0.5) 17.25(len 0.75) 19.25(len 0.75)
446.0:HiMid 9.0:High 12.0:HiMid 13.0:HiMid 14.0:HiMid 16.0:HiMid6.0, 9.0, 12.0, 13.0, 14.0, 16.0none
4810.0:High 12.0:HiMid 16.0:HiMid 17.0:HiMid 18.0:HiMid 19.0:HiMid10.0, 12.0, 16.0, 17.0, 18.0, 19.0none
544.0:HiMid 13.0:HiMid 14.0:HiMid 16.0:High 17.0:High 18.0:High 19.0:High4.0, 13.0, 14.0, 16.0, 17.0none
564.0:HiMid 8.0:HiMid 9.0:HiMid 10.0:HiMid 11.0:HiMid 12.0:HiMid 13.0:HiMid 14.0:HiMid 15.0:HiMid 16.0:HiMid 19.0:HighFloor4.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 19.0none
6010.75:HiMid 11.25:HiMid 14.25:High 15.25:High 17.25:High 18.25:High11.0, 14.0, 15.0, 17.0, 18.010.75(len 0.5)
6215.0:High 17.0:HiMid 18.0:HiMid15.0, 17.0, 18.0none
6411.25:High 14.0:HiMid 14.5:HighFloor 15.25:HighFloor 16.5:HighFloor 17.0:HighFloor11.0, 14.0, 15.0, 16.0, 17.011.25(len 0.25) 14.0(len 0.5) 14.5(len 0.75) 16.5(len 0.5) 17.0(len 0.75)
728.0:HighFloor 9.0:HighFloor 10.0:HighFloor8.0, 9.0, 10.0none
7810.0:HighFloor 10.5:HighFloor 11.5:HighFloor10.0, 12.010.0(len 0.5) 11.5(len 0.5)
803.0:HighFloor 3.5:HighFloor 7.0:HighFloor 8.0:HighFloor 9.0:HighFloor 10.0:HighFloor3.0, 4.0, 7.0, 8.0, 9.0, 10.03.0(len 0.5)
823.0:HiMid 3.75:HiMid 5.5:HiMid 6.0:High 6.25:High 6.75:High 7.25:High 7.75:High3.0, 4.0, 6.0, 7.0, 8.03.0(len 0.75) 3.75(len 0.25) 5.5(len 0.5) 6.0(len 0.25) 6.25(len 0.5) 6.75(len 0.5) 7.25(len 0.5) 7.75(len 0.25)
841.0:HiMid 2.0:HighFloor 4.0:HighFloor 6.0:HighFloor 7.0:HighFloor 8.0:HighFloor1.0, 2.0, 4.0, 6.0, 7.0, 8.0none
882.0:HighFloor 3.0:HighFloor 3.5:HighFloor 4.0:HighFloor 4.5:HighFloor 18.5:HighFloor2.0, 3.0, 4.0, 18.03.0(len 0.5) 3.5(len 0.5) 4.0(len 0.5)

Resolved: v13, built by the sibling session, verified here

The chat titled Final watermelon built out/EXPERIMENT-v13-hands-Brandon-edit.gp. I re-ran the gates on it myself rather than take the report.

measurev11v13verdict
hands_gate okFalseTrueconfirmed
three-hand instants23 over 19 bars0confirmed
ride (midi 51)1525150124 removed, confirmed
kick / snare / pedal505 / 340 / 245505 / 340 / 245untouched, confirmed
toms1831918 MORE, not reported

Two corrections to the sibling's report

1. The numbering. Its "6 false toms in GP bar 14, now zero" is display-bar numbering. In the index numbering this page uses, that is index 13, which goes 6 to 0. Index 14 moves the other way, 0 to 5. Both statements are true and they describe different measures.

2. Fourteen toms were ADDED and the report named only removals. Measured v11 to v13: index 13 goes 6 to 0, index 14 goes 0 to 5, index 58 goes 0 to 2, index 80 goes 0 to 7. The removal was reported. The 14 additions across three measures were not, and each needs its own evidence row before promotion.

The staff-scan bug does not exist in the skill

The sibling asked whether tr_score or any staff-geometry code in the skill shares its chart_read.refine() failure, where the first staff row above a global ink fraction was taken as the top and every lane in that system then read two lanes low.

It cannot. The skill performs no staff-row finding of any kind. staff_geometry_guard is its only staff function and it takes a px-per-space number as an argument and judges whether that number is too coarse to resolve a lane. No image is read.

The bug class does live in the sibling's own toolchain, in four scripts that take a global ink fraction and then walk rows in order: systems.py and staves.py at ink > 0.40*W and 0.45*W, plus chart_lanes.py and barlines.py. chart_lanes.py is the one to check first, because it assigns the lane. The current pair, systems_median.py and barlines_full.py, use row medians and are clean.

What still needs a human