Commit Graph
51 Commits
Author SHA1 Message Date
Lucas WintherandClaude Opus 5.5 48ae9780a6 fix(pipeline): repeat-vote review fixes
- Return an unchanged copy for a non-finite/zero grid (NaN downbeat used to
  delete every guitar note).
- Skip an added note when a same-pitch note (bar, neighbouring bars or already
  added) lies within tol; avoids near-duplicates across bar lines.
- bench run/real: --no-repeat-vote passes { repeatVote: false } to the pipeline.
- Tests: notes before a late downbeat, bpm 0 / NaN / Infinity, trailing partial
  bar, half-tempo grid, neighbour-bar duplicate, pipeline-level on/off.

Eval unchanged: synthetic t1a 0.885 t1b 0.840 t1c 0.752 t1d 0.737, lnoe 0.507.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-30 21:21:00 +01:00
Lucas WintherandClaude Opus 5.5 79130c0aca docs: accuracy experiment log E5 (repetition voting)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-30 21:14:35 +01:00
Lucas WintherandClaude Opus 5.5 132659a99c feat(pipeline): vote guitar notes across repeated bars (E5)
Bars whose transcriptions are similar (16th-slot occupancy cosine >= 0.6,
diagonal-smoothed, and exact pitch/onset match >= 0.3) are treated as repeats.
Notes recurring in < 15% of a bar's repeats are dropped; notes in >= 25% and
>= 3 repeats but missing from the bar are added. Default on for guitar.

Synthetic median guitar F1 t1a 0.866->0.885, t1b 0.814->0.840,
t1c 0.734->0.752, t1d 0.721->0.737; lnoe 0.403->0.507.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-30 21:14:17 +01:00
Lucas WintherandClaude Opus 5.5 19ac52c93a docs: accuracy experiment log E1-E4
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-30 21:00:45 +01:00
Lucas WintherandClaude Opus 5.5 c3e751b9e7 chore: benchmark results after guitar+piano+other change (t1a passes)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-30 21:00:31 +01:00
Lucas WintherandClaude Opus 5.5 0f14fbc574 feat(pipeline): transcribe guitar from guitar+piano+other stems
Demucs-6s scatters guitar energy across its guitar, piano and other stems.
Synthetic t1 median guitar F1 rises from 0.39-0.60 to 0.72-0.87; the real
'Last Night on Earth' reference goes 0.390 -> 0.403.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-30 20:46:31 +01:00
Lucas WintherandClaude Opus 5.5 c24c7c979f chore: regenerate real-song results with calibrated fit and guarded aligner
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-30 19:56:59 +01:00
Lucas WintherandClaude Opus 5.5 3db87c0317 fix(align): calibrated fit (precision, lift, beat-shift check, baseline) and aligner guards (A7, A8)
Fit flags on precision (<0.6) and chance-corrected lift (<0.25), null with <8
recording onsets; old match rate kept as audibleRate (info). Symbolic-chroma
beat/bar-shift check per window. Constant-offset baseline (-2..+2 s) replaces
DTW without manual anchors unless DTW precision is better by >=0.02. Stretch
warning counts in the fit summary. DTW: slope-limited steps, open begin/end
options; per-bar outlier rejection (1/4 beat, Theil-Sen-transported +-3 bar
median); no anchor in the final partial bar. bench real: saved/computed
source, baseline + method, corrupt alignment.json skipped. Parabolic onset
interpolation; warp extrapolation documented; spec amended.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-30 19:50:48 +01:00
Lucas WintherandClaude Sonnet 5.5 3b002059e9 docs+bench: README aligning section; first real-song benchmark (auto alignments)
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-30 16:03:50 +01:00
Lucas WintherandClaude Sonnet 5.5 d623026f6d feat(bench): real-song benchmark
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-30 15:00:55 +01:00
Lucas WintherandClaude Opus 5.5 f0249995cf fix(align): review round 1 for the alignment page
- server: collapse leading slashes so //host/x is never proxied off-host
  or redirected cross-origin; 1 MB body limit; max 10k anchors; a corrupt
  alignment.json no longer 500s /api/songs (song falls back to auto with
  a warning); comments on cookie scope and the loopback inner server
- warp (ruling A6): adding/moving a manual anchor removes autos only
  within 10 s (MIDI) of the new/old position, never past a manual, plus
  any auto that would break audio monotonicity
- page: first anchor clamped at >= 0 s; ruler scrubbing seeks on release;
  wording for the new auto-removal rule; removed-count excludes the
  dragged anchor; shows server warnings
- manifest: unique tmp name for alignment.json; clear error for a
  corrupt file
- resample test: speed asserted as a ratio to the direct path

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-30 14:48:32 +01:00
Lucas WintherandClaude Opus 5.5 894fd9b9ef feat(align): alignment web page
Token-protected Bun.serve server (bun run align [--host] [--port]
[--url-host] [--root]) with the layout-A page: recording and warped-MIDI
lanes on one zoomable timeline, draggable anchors (recording end / MIDI
end), stretch tempo labels with warnings, fit-flagged windows, Web Audio
playback with mix choice, auto-align, save, reset, undo. API per the task
brief; transcode/peaks cache under reference/<id>/. Adds bun run align
auto <id>, writeSmf (tests), encodeWav, recordingOnsets/fitFromOnsets,
fitSummary and stretch tempo helpers.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-30 14:38:36 +01:00
Lucas WintherandClaude Opus 5.5 e5773e0c33 perf(dsp): cache the resample kernel when outputs land on input samples
2:1 decimation (44.1k -> 22.05k, used to render the warped MIDI for the
alignment page) recomputed 65 windowed-sinc taps per output sample: ~17 s
for a 4.7 min stereo render. Outputs at integer input positions now reuse
one tap table; arithmetic is identical, so results are bit-identical.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-30 14:38:36 +01:00
Lucas WintherandClaude Opus 5.5 99a1076547 fix(align): densify coarse fallback path; per-segment offset pooling; no degenerate first stretch
The coarse-path fallback now expands each 10 Hz step to five 50 Hz steps so its
diagonals still yield bar anchors; fine band widths are injectable to test it.
Offset pooling is clipped to the current segment, and auto anchors need
audioSec > 0 unless midiSec is 0. Tests: forced fallback, wrong manual anchor,
p90 bound; debug output gated behind ALIGN_DEBUG.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-30 06:57:47 +01:00
Lucas WintherandClaude Opus 5.5 8cad85e103 feat(align): automatic alignment and fit quality
Coarse (10 Hz) DTW per stretch between manual anchors, refined at 50 Hz in a
band that widens 0.5 -> 1 -> 2 s on unreachable end cells (coarse path as last
resort); one auto anchor per bar from median offsets of diagonal path steps.
Fit quality from raw-audio onset peaks vs warped scored-role MIDI onsets
(+-70 ms, 30 s windows, flagged on rate < 0.5 or median > 60 ms).
trackKeys moves to src/align/roles.ts (pure) and is re-exported by manifest.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-30 06:52:10 +01:00
Lucas WintherandClaude Sonnet 5.5 41e38cb03f feat(align): features and DTW
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-30 06:42:42 +01:00
Lucas WintherandClaude Sonnet 5.5 b614244e4d fix(align): render at 44.1k and resample; finite guard; pre-zero tests
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-30 06:38:31 +01:00
Lucas WintherandClaude Sonnet 5.5 63b32a488d feat(align): warped MIDI rendering and peaks
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-30 06:34:15 +01:00
Lucas WintherandClaude Haiku 5.5 ca5942956a fix(align): remove whole auto run between manual anchors on edit
Co-Authored-By: Claude Haiku 5.5 <[email protected]>
2026-10-30 06:30:48 +01:00
Lucas WintherandClaude Haiku 5.5 1ff29f94cd feat(align): warp model
Co-Authored-By: Claude Haiku 5.5 <[email protected]>
2026-10-30 06:29:58 +01:00
Lucas WintherandClaude Opus 5.5 85bd6a2e29 docs: exempt align CLI from purity rule
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-30 06:28:13 +01:00
Lucas WintherandClaude Sonnet 5.5 e910036e67 feat(align): SMF parser, role guess, reference manifest
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-30 06:27:08 +01:00
Lucas WintherandClaude Opus 5.5 67168e6103 docs: reference alignment plan
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-30 06:23:42 +01:00
Lucas WintherandClaude Opus 5.5 9756fc6faf docs: reference alignment design
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-30 06:21:53 +01:00
Lucas WintherandClaude Opus 5.5 4662dbc357 chore: regenerate baseline results after final-review fixes
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-30 06:08:57 +01:00
Lucas WintherandClaude Opus 5.5 7619cf6c17 chore: untrack SDD workspace report
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-30 05:55:19 +01:00
Lucas WintherandClaude Sonnet 5.5 b631bd2c7e fix: final-review findings (median pass tick, R11 secondary metrics, R12 chord duration, render version, dsp resample)
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-30 05:55:04 +01:00
Lucas WintherandClaude Sonnet 5.5 2b7d5ffbeb chore: baseline benchmark results
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-30 05:43:50 +01:00
Lucas WintherandClaude Sonnet 5.5 d9fd5d8c9f fix: report renders empty-truth roles as n/a with spurious count
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-30 05:17:14 +01:00
Lucas WintherandClaude Sonnet 5.5 42d88a2401 feat: benchmark runner and report
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-30 05:14:41 +01:00
Lucas WintherandClaude Sonnet 5.5 4c89f0d664 fix: pipeline fingering uses quantiser snap; more run tests
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-30 05:11:19 +01:00
Lucas WintherandClaude Sonnet 5.5 604d1a67af feat: pipeline runner with oracle modes
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-30 05:04:06 +01:00
Lucas WintherandClaude Sonnet 5.5 bf93a4a32e feat: quantisation and tab assignment
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-30 05:00:20 +01:00
Lucas WintherandClaude Sonnet 5.5 eab70b24f6 fix: drum transcriber noise gate, kick+snare, test floors
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-30 04:55:06 +01:00
Lucas WintherandClaude Sonnet 5.5 9bad6490eb feat: heuristic drum transcription
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-30 04:50:28 +01:00
Lucas WintherandClaude Sonnet 5.5 1d490f6897 fix: tempo octave choice, start-of-music anchoring, mean-normalised combs, pure toMono
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-30 04:46:09 +01:00
Lucas WintherandClaude Sonnet 5.5 4ab92d4a86 feat: tempo grid estimation
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-30 03:35:13 +01:00
Lucas WintherandClaude Sonnet 5.5 1239e5e0ac feat: basic pitch transcription
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-30 03:22:14 +01:00
Lucas WintherandClaude Opus 5.5 b5e6f63881 test: tighten demucs separation assertions (ruling R7)
Bass absolute SDR floor, guitar/piano order pinned by stem energy,
finite + non-silent checks on the mono and 3 s slice paths, and the
test.failing comment cites ruling R7.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-30 03:19:40 +01:00
Lucas WintherandClaude Opus 5.5 86416f7637 feat: demucs 6-stem separation
Radix-2 FFT and torch-compatible stft/istft (hann, center, reflect,
normalized). HTDemucs-6s ONNX separator mirroring demucs apply_model:
whole-mix normalisation, 343980-sample centred segments, 25% overlap
with triangular weights, _spec/_ispec around the graph, spectral +
time branch sum. Brief's guitar/bass > 3 dB criterion is unmet by the
model on t1b/1 and is kept as test.failing pending a ruling.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-30 03:14:51 +01:00
Lucas WintherandClaude Sonnet 5.5 6bd8ab9cee feat: evaluation metrics
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-30 02:57:38 +01:00
Lucas WintherandClaude Sonnet 5.5 32d96cadcc fix: dataset layout data/<tier>/<seed>, mix tests, cli hardening
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-30 02:52:50 +01:00
Lucas WintherandClaude Sonnet 5.5 ca9f3bbb83 feat: dataset builder
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-30 02:51:33 +01:00
Lucas WintherandClaude Sonnet 5.5 a1e9ce86a0 feat: stem rendering, fx and mixing
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-30 02:48:59 +01:00
Lucas WintherandClaude Sonnet 5.5 cd82e05d85 feat: tier-1 song generator
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-30 02:45:32 +01:00
Lucas WintherandClaude Sonnet 5.5 470e089f92 fix: drum single hit, dedupe notes, validate role
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-30 02:42:35 +01:00
Lucas WintherandClaude Sonnet 5.5 ec7cb0e568 feat: alphaTex writer and GP round trip
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-30 02:40:46 +01:00
Lucas WintherandClaude Haiku 5.5 bac4fbeb1d feat: core types, time, rng, model fetch
Co-Authored-By: Claude Haiku 5.5 <[email protected]>
2026-10-30 02:38:02 +01:00
Lucas WintherandClaude Opus 5.5 0a6ec1dc40 chore: ignore superpowers workspace
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-30 02:37:03 +01:00
Lucas WintherandClaude Opus 5.5 62cab141bd chore: bun init, implementation plan, model manifest
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-30 02:36:37 +01:00