Conversation
…e tab) The v1 objective reads every note's position as the fretting hand's position. Tapping breaks that: a tapped note is played by the picking hand while the fretting hand stays put. On the whole corpus, no line with tapped notes had its human path in the model's optimum set (against 27% of lines without taps), so tapping is a sharp failure slice of the model — not of the players. Oracle stage only: technique labels come from the tab. Pins: - TabLine::tapped — one NoteMark::Tap flag per note; - technique::tap_aware_cost — v1 unary costs and string changes between neighbours, fretting-hand travel from the previous untapped note (the anchor carries across taps), picking-hand travel at tap_shift from the previous tapped note; equal to v1_cost without taps; hand-computed on the 5 → 8 → tap 12 → 8 → 5 figure (14 tap-blind, 6 tap-aware); - technique::tap_aware_chain — the same objective as a ties::Chain whose states pair a note's candidate with the other hand's last candidate: brute force over position assignments gives the same optimum and optimal-assignment count for every tap mask, every admissible state path scores its assignment exactly, and without taps it is the v1 chain (optimum, count, production path); - LabError::LabelLength for labels that do not cover the line; Chain::from_parts for objectives built outside `ties`. tapped is all-false and the technique functions are todo!() here (7 red). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
tab_lines records NoteMark::Tap per note alongside the hand anchor. tap_aware_cost walks the line with one travel anchor per hand: untapped notes pay position_shift from the last untapped note, tapped notes pay tap_shift from the last tapped note, and string changes are charged between neighbours as in v1. tap_aware_chain builds the same objective as a ties::Chain: a note's states pair its candidate with the other hand's last candidate (or none yet); a transition keeps that carried candidate when the hand repeats and takes over note i − 1 when the hand switches, and anything else costs an inadmissible sentinel. State paths and position assignments correspond one to one, so optimum_set and lexicographic_path apply unchanged; with no taps the chain is the v1 chain. Suite green (6 technique + 31 fingering + 17 ties + 49 spike/optir); clippy clean. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
fingering_gap taps selects the lines with tapped notes and, for v1-fit and production v1 weights, compares the tap-blind objective with the tap-aware one (tap_shift = position_shift, so costs share units, and tap_shift = 0) on the whole corpus and on holdout songs: lines whose human path lies in the model's optimum set, human excess (per line and per note), unique optima, production-order agreement overall / on tapped / on fretted notes, and the ceiling. An untapped baseline reweighted to the tapped slice's line lengths gives the fair reference, and a control asserts the two objectives agree on every untapped line (0 of 8,890 differ). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Records the tap-attribution experiment (aggregates only, whole corpus; the 15-line holdout slice is reported but not interpreted): with tap labels from the tab and unchanged weights, the tapped slice reaches the length-matched untapped baseline on excess per note (2.94 -> 1.27 vs 1.26), agreement (39.4% -> 44.3% vs 44.9%) and ceiling (45.7% -> 52.9% vs 54.1%), but its human paths almost never land in the optimum set (1.3% vs 21.0%). 75% of the residual is fretting-hand travel spent keeping tapping figures on one string, and open strings used as pull-off targets make up another 12.5%; legato continuity is the missing term, ahead of any hidden technique inference. Uses "human path in the model's optimum set" rather than "human optimal" throughout. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
Important Review skippedAuto reviews are disabled on base/target branches other than the default branch. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Advanced Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
The audit read "75% of the residual is fretting-hand travel" as if it located the problem. It is a decomposition under the current objective: adding a continuity cost would move the optimum and redistribute the residual across the travel and open-string terms. The section now says so, states string continuity (H1) and conditional open strings (H2) as hypotheses for the next oracle stage, and the conclusion and decision record follow suit. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Measured while preparing the legato stage: the guitarpro 0.4.2 GPIF import never reads the Tapped note property (the beat's tap effect stays a placeholder), so no GP6/GP7 tapping reaches griff, although 31 of the corpus's 145 GPIF files contain it (1,006 Tapped note definitions, 45 LeftHandTapped). The audit now states that the 155-line tap slice is GP3-5 material only and that GP6/7 tapping sits unlabelled inside the "untapped" lines and the length-matched baseline. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
#201 imports GP6/7 tapping. Rerun on this PR's lab code merged locally with main: the slice grows from 155 to 242 lines, and the length-matched baseline had contained that unlabelled tapping (1.26 -> 1.17 excess per note for the original lines). Hand attribution closes most, not all, of the slice's excess (94% on the original lines against the corrected pool, 66% on the added GP6/7 lines against their format, 78% overall); exactness stays out of reach in both formats. The remaining excess concentrates in one-string tapping figures with open-string pull-offs. Stage 2 starts from this re-measured baseline, per format and with a per-song concentration check. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…ue-aware Brings in the tie-break branch, which now contains main at e871a44 (#201, #202, #203, #204) and the post-#202 re-measurements of #197 and #199. Merged without conflicts. The decision log ends with main's entries, then the tie-break entry, then this branch's tap-attribution entry. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This branch now contains #202, so the tap-attribution audit gains a "Re-measurement after #202" section and a pointer in its header. The numbers are from `fingering_gap taps`, rerun on this branch merged with main at e871a44, with the same weights. - Slice: 242 → 226 lines, 25,571 notes (5,260 tapped). - Untapped pool: 8,803 → 8,740 lines. Control: 0 of 8,740 differ. - `v1-fit`, whole corpus, format (human path in optimum set / excess per note / agreement): - tap-blind: 0.0% / 3.20 / 38.5%; - tap-aware: 0.9% / 1.63 / 43.1%; - length-matched baseline: 20.0% / 1.16 / 44.9%. - Share of the excess gap closed: 78% → 77%. The subset split, the format-matched baselines, the concentration check and the residual decomposition came from a local dump keyed to the pre-#202 lines. They were not re-run and are marked as such. The decision-log entry still read "parity" from before #201. It now carries the revised reading: most of the excess gap is closed, not all, and exactness stays out of reach. The slice numbers reproduce the impact sweep recorded before the legato census, figure for figure. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
PhysShell
pushed a commit
that referenced
this pull request
Sep 17, 2026
…inuity Brings in the tap-attribution branch, which now contains main at e871a44 (#203, #204 are new here) and the post-#202 re-measurements of #197, #199 and #200. Those re-measurements reproduce this stage's "Baselines after #202" impact sweep figure for figure. The only conflict was docs/decisions.log.md. This branch has no decision-log entry of its own, so the file is taken from the tap-attribution branch. That version includes the amended #197, #199 and #200 entries. No stage-2 content changes. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Question
Does correct hand attribution explain the tapping failure slice? On the whole corpus, no line with tapped notes had its human path in the
v1-fitoptimum set. That does not mean the players play badly; it means the model reads every note as the fretting hand's position, and tapping breaks exactly that.This is the oracle stage: tap labels come from the tab (
NoteMark::Tap); no technique inference yet.Research tooling only (
lab/); no production code changes.Built (red → green)
TabLine::tapped— one tap flag per note.technique::tap_aware_cost—v1per-note costs and string changes, fretting-hand travel from the previous untapped note (the anchor carries across taps), picking-hand travel from the previous tapped note attap_shift. Equal tov1_costwithout taps.technique::tap_aware_chain— the same objective as aties::Chain(state = note candidate × the other hand's last candidate), so lab: fingering tie-break — exact optimum sets and a learned lexicographic secondary #199's exact optimum-set DPs apply. Brute-force-checked over position assignments for every tap mask.fingering_gap taps— tap-blind vs tap-aware under the same weights (so costs share units), plus an untapped baseline reweighted to the same line lengths.Re-measured after #201 (GPIF tapping import)
Rerun of this PR's lab code on a local, unpushed merge of
main(full numbers in the audit's "Re-measurement after #201" section). Whole corpus: the slice grows to 242 lines (+87 GP6/7 lines from 30 files; the original 155 lines are unchanged line by line). The old length-matched baseline had contained that unlabelled GP6/7 tapping.v1-fit, whole corpustap_shift = 0is wrong; residual still 75% fretting-hand travel under the current decomposition.Re-measured after #202 (tuplet durations)
This branch now includes #199's head, which includes
mainate871a44(#201–#204).fingering_gap tapswas rerun on this head with the same weights. The slice is 226 lines: fewer but longer, because lines no longer break where neighbouring bars used to interleave. They hold 25,571 notes, 5,260 of them tapped. The untapped pool is 8,740 lines, and the control still finds 0 mismatches.v1-fit, whole corpusv1: excess per note 8.10 tap-blind, 5.41 tap-aware, 4.91 baseline.Stage 2's baseline is this measurement.
Original results, as first run (whole corpus: 155 lines, 14,480 notes, 3,132 tapped; holdout slice has only 15 lines and is not interpreted)
v1-fitweights:tap_shift= 1)v1weights agree), yet human paths land in the optimum set in 1.3% of tapped lines against 21.0%. 153 of 155 lines keep a positive residual.v1-fit, the model scatters the figure to save fret travel.tap_shift = 0is wrong: a free picking hand flattens the objective (no unique optima) and worsens tapped-note choices (23.1%).Next: legato continuity (hammer-on / pull-off / tap binding notes to one string, from GP
TechniqueSpans) before any hidden technique inference.Full write-up:
docs/audit/2026-09-fingering-tap-attribution.md.Checks
cd lab && cargo test: 103 tests green (6 technique, 31 fingering, 17 ties, 13 optir, 24 oracle spike, 12 propagate).cargo fmt --checkclean; clippy clean at the crate's deny level.🤖 Generated with Claude Code