Skip to content

v0.12.0

Latest

Choose a tag to compare

@robmorgan robmorgan released this 18 Aug 04:12

What's Changed

The quality-closure release: every open stage from the 2026-08-05 quality review (Stages 10, 12–19) is closed with a recorded blind-listening verdict, and the final owner exit listen passed across the corpus. Available on crates.io.

Breaking Changes

  • EngineProfile::WideKeylock is rebuilt around a direct-ratio phase-vocoder head (WidePvHead, ROADMAP Stage 19). The PV now owns the tempo axis directly instead of correcting a varispeed stream, which fixed the "roboty" liveness verdict that failed the Stage 14 exit listen. Its latency contract changed from a 48.6 ms pipeline delay to 0 ms β€” the analysis window is source-side lookahead, so like tape the first delivered frame is source frame 0. Hosts that externally compensated the old wide delay must drop that offset; position queries were and remain self-compensating. Retarget landing in the wide profile is hop-quantized (β‰ˆ5.8 ms); emission counts stay frame-exact, and instant ratio steps are click-free with constant pitch.
  • Cached analysis artifacts regenerate: PREANALYSIS_VERSION is now 12 with MIN_COMPATIBLE_VERSION 12 (from 7/4 at v0.11.0) β€” beat grids and tempo estimates changed materially across this span (phase hygiene, rigid-grid adoption, metrical-level second pass), so pre-v12 .tsa sidecars re-analyze on load.

Engine quality (blind-verdict gated)

  • Steady-rate cadence stretch for SOLA splices (Stage 18): at sustained slowdowns the keylock corrector splices at twice the steady cadence with a tapered stretch budget, removing the audible splice-rate artifact; gated off during tempo ramps after an A/B matrix caught a 5.65-cent ride-cymbal regression (bound: 1.5 cents).
  • Mid/side stereo in the wide profile (Stage 14 measurement): per-channel processing manufactured ~16 dB of side energy by decorrelation; M/S is source-faithful.
  • Phase-vocoder phase hygiene (Stage 13) and mild-motion bounded recenter (Stage 15): batch-path phase artifacts and the SOLA seam under sustained rides.

Analysis

  • Metrical-level second pass (Stage 10): when the 3/2 tempo candidate's salience clears a measured threshold (0.70, from a measured 0.60/0.76 gap), tracking re-runs with the prior at that level β€” drum & bass now detects its true tempo (both corpus rows EXACT at 174.00/170.00 where the QM reference tracker also fails). DJ hint range widened to 100–182 BPM.
  • Rigid-grid corroboration on syncopated material, and estimator disagreement caps stored confidence at 0.5 so hosts can flag uncertain grids.

Honest contracts

  • EngineController::retargets_degraded() (#45, reported by @PeteHaughie): scheduling more than MAX_PENDING_RETARGETS (8, now public) timestamped retargets silently degraded the overflow to immediate latest-wins β€” invisible to dropped_events(). The degradation is now counted, documented on set_tempo_rate_at with the ≀8-in-flight scheduling pattern, and gated at 0 in the soak harness.

QA

  • Blind A/B harness: scripts/ab.sh renders level-matched, blinded, sealed-key arm sets (current tree, any git ref, rubberband reference); tools/ab-tui is a two-pane listening TUI writing machine-readable verdicts.
  • Non-EDM corpus: hip-hop/rock/funk local rows plus two CC-licensed drum & bass public rows; CI enforces β‰₯90% tempo-accuracy floors on the public corpus.
  • Soak hardening (Stage 12): position-drift gate (2048 frames), no-panic audit, weekly re-seeded fuzz campaign.

Full Changelog: v0.11.0...v0.12.0