Every measure that needs the index-24 treatment, measured off the live head
r8968524 with the /transcription-repair skill. Built 2026-09-08.
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.
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.
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.
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.
| index | chart | meter | toms | drums used | cym | cym rests | collisions | colliding 16ths | sub-16th | 3 hands |
|---|---|---|---|---|---|---|---|---|---|---|
| 13 | 5 | 4/4 | 4 | HighFloor | 15 | 0 | 3 | 4.0, 5.0, 6.0 | 3 | 1 |
| 14 | 6 | 5/4 | 6 | HighFloor, High | 20 | 0 | 4 | 16.0, 17.0, 18.0, 19.0 | 4 | 0 |
| 20 | 12 | 5/4 | 4 | HiMid, High | 20 | 0 | 3 | 16.0, 18.0, 19.0 | 3 | 0 |
| 28 | 20 | 5/4 | 6 | HighFloor, HiMid | 20 | 0 | 5 | 12.0, 14.0, 16.0, 18.0, 19.0 | 3 | 1 |
| 32 | 24 | 5/4 | 5 | HiMid | 20 | 0 | 3 | 16.0, 17.0, 18.0 | 4 | 0 |
| 40 | 32 | 5/4 | 6 | HighFloor | 20 | 0 | 6 | 12.0, 13.0, 14.0, 16.0, 17.0, 18.0 | 0 | 1 |
| 42 | 34 | 5/4 | 5 | HiMid | 20 | 0 | 4 | 16.0, 17.0, 18.0, 19.0 | 4 | 0 |
| 44 | 36 | 5/4 | 6 | HiMid, High | 20 | 0 | 6 | 6.0, 9.0, 12.0, 13.0, 14.0, 16.0 | 0 | 1 |
| 48 | 40 | 5/4 | 6 | HiMid, High | 20 | 0 | 6 | 10.0, 12.0, 16.0, 17.0, 18.0, 19.0 | 0 | 1 |
| 54 | 46 | 5/4 | 7 | HiMid, High | 17 | 0 | 5 | 4.0, 13.0, 14.0, 16.0, 17.0 | 0 | 1 |
| 56 | 48 | 5/4 | 11 | HighFloor, HiMid | 20 | 0 | 11 | 4.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 19.0 | 0 | 2 |
| 60 | 52 | 5/4 | 6 | HiMid, High | 20 | 0 | 5 | 11.0, 14.0, 15.0, 17.0, 18.0 | 1 | 1 |
| 62 | 54 | 5/4 | 3 | HiMid, High | 20 | 0 | 3 | 15.0, 17.0, 18.0 | 0 | 0 |
| 64 | 56 | 5/4 | 6 | HighFloor, HiMid, High | 20 | 0 | 5 | 11.0, 14.0, 15.0, 16.0, 17.0 | 5 | 0 |
| 72 | 64 | 5/4 | 3 | HighFloor | 20 | 0 | 3 | 8.0, 9.0, 10.0 | 0 | 0 |
| 78 | 70 | 5/4 | 3 | HighFloor | 20 | 0 | 2 | 10.0, 12.0 | 2 | 1 |
| 80 | 72 | 5/4 | 6 | HighFloor | 20 | 0 | 6 | 3.0, 4.0, 7.0, 8.0, 9.0, 10.0 | 1 | 0 |
| 82 | 74 | 5/4 | 8 | HiMid, High | 20 | 0 | 5 | 3.0, 4.0, 6.0, 7.0, 8.0 | 8 | 1 |
| 84 | 76 | 5/4 | 6 | HighFloor, HiMid | 20 | 0 | 6 | 1.0, 2.0, 4.0, 6.0, 7.0, 8.0 | 0 | 1 |
| 88 | 80 | 5/4 | 6 | HighFloor | 20 | 0 | 4 | 2.0, 3.0, 4.0, 18.0 | 3 | 1 |
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.
Positions are sixteenths from the downbeat, zero-based.
| index | toms at | collisions at | sub-16th beats |
|---|---|---|---|
| 13 | 4.25:HighFloor 4.75:HighFloor 5.0:HighFloor 5.5:HighFloor | 4.0, 5.0, 6.0 | 4.25(len 0.5) 4.75(len 0.25) 5.0(len 0.5) |
| 14 | 15.75:HighFloor 16.5:HighFloor 16.75:HighFloor 17.75:High 18.75:High 19.0:High | 16.0, 17.0, 18.0, 19.0 | 15.75(len 0.25) 16.5(len 0.25) 18.75(len 0.25) 19.0(len 0.75) |
| 20 | 16.0:High 18.0:HiMid 18.75:HiMid 19.25:HiMid | 16.0, 18.0, 19.0 | 18.0(len 0.75) 18.75(len 0.5) 19.25(len 0.75) |
| 28 | 12.0:HiMid 14.0:HiMid 16.0:HiMid 18.0:HighFloor 18.75:HighFloor 19.25:HighFloor | 12.0, 14.0, 16.0, 18.0, 19.0 | 18.0(len 0.75) 18.75(len 0.5) 19.25(len 0.75) |
| 32 | 16.0:HiMid 16.25:HiMid 17.0:HiMid 17.5:HiMid 18.0:HiMid | 16.0, 17.0, 18.0 | 16.0(len 0.25) 16.25(len 0.75) 17.0(len 0.5) 17.5(len 0.5) |
| 40 | 12.0:HighFloor 13.0:HighFloor 14.0:HighFloor 16.0:HighFloor 17.0:HighFloor 18.0:HighFloor | 12.0, 13.0, 14.0, 16.0, 17.0, 18.0 | none |
| 42 | 16.0:HiMid 16.75:HiMid 17.25:HiMid 18.0:HiMid 19.25:HiMid | 16.0, 17.0, 18.0, 19.0 | 16.0(len 0.75) 16.75(len 0.5) 17.25(len 0.75) 19.25(len 0.75) |
| 44 | 6.0:HiMid 9.0:High 12.0:HiMid 13.0:HiMid 14.0:HiMid 16.0:HiMid | 6.0, 9.0, 12.0, 13.0, 14.0, 16.0 | none |
| 48 | 10.0:High 12.0:HiMid 16.0:HiMid 17.0:HiMid 18.0:HiMid 19.0:HiMid | 10.0, 12.0, 16.0, 17.0, 18.0, 19.0 | none |
| 54 | 4.0:HiMid 13.0:HiMid 14.0:HiMid 16.0:High 17.0:High 18.0:High 19.0:High | 4.0, 13.0, 14.0, 16.0, 17.0 | none |
| 56 | 4.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:HighFloor | 4.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 19.0 | none |
| 60 | 10.75:HiMid 11.25:HiMid 14.25:High 15.25:High 17.25:High 18.25:High | 11.0, 14.0, 15.0, 17.0, 18.0 | 10.75(len 0.5) |
| 62 | 15.0:High 17.0:HiMid 18.0:HiMid | 15.0, 17.0, 18.0 | none |
| 64 | 11.25:High 14.0:HiMid 14.5:HighFloor 15.25:HighFloor 16.5:HighFloor 17.0:HighFloor | 11.0, 14.0, 15.0, 16.0, 17.0 | 11.25(len 0.25) 14.0(len 0.5) 14.5(len 0.75) 16.5(len 0.5) 17.0(len 0.75) |
| 72 | 8.0:HighFloor 9.0:HighFloor 10.0:HighFloor | 8.0, 9.0, 10.0 | none |
| 78 | 10.0:HighFloor 10.5:HighFloor 11.5:HighFloor | 10.0, 12.0 | 10.0(len 0.5) 11.5(len 0.5) |
| 80 | 3.0:HighFloor 3.5:HighFloor 7.0:HighFloor 8.0:HighFloor 9.0:HighFloor 10.0:HighFloor | 3.0, 4.0, 7.0, 8.0, 9.0, 10.0 | 3.0(len 0.5) |
| 82 | 3.0:HiMid 3.75:HiMid 5.5:HiMid 6.0:High 6.25:High 6.75:High 7.25:High 7.75:High | 3.0, 4.0, 6.0, 7.0, 8.0 | 3.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) |
| 84 | 1.0:HiMid 2.0:HighFloor 4.0:HighFloor 6.0:HighFloor 7.0:HighFloor 8.0:HighFloor | 1.0, 2.0, 4.0, 6.0, 7.0, 8.0 | none |
| 88 | 2.0:HighFloor 3.0:HighFloor 3.5:HighFloor 4.0:HighFloor 4.5:HighFloor 18.5:HighFloor | 2.0, 3.0, 4.0, 18.0 | 3.0(len 0.5) 3.5(len 0.5) 4.0(len 0.5) |
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.
| measure | v11 | v13 | verdict |
|---|---|---|---|
| hands_gate ok | False | True | confirmed |
| three-hand instants | 23 over 19 bars | 0 | confirmed |
| ride (midi 51) | 1525 | 1501 | 24 removed, confirmed |
| kick / snare / pedal | 505 / 340 / 245 | 505 / 340 / 245 | untouched, confirmed |
| toms | 183 | 191 | 8 MORE, not reported |
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 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.