v0.13.0
What's Changed
The bass release: the keylock profile's low band now plays in key. Available on crates.io.
The keylock low band is pitch-corrected (ROADMAP Stage 21)
Since Stage 2 the sub-120 Hz band deliberately pitch-followed tempo — a scope line set by a blind listen that rejected a vocoder bass. Once v0.12.0's splice-cadence work removed the granulation that masked it, the detuned bass surfaced blind at ±8% ("bass out of key", ±1.3 semitones against the corrected highs). A time-domain corrector was the never-run falsifier, and it won the blind re-match in all four ±8% conditions — the detuned bass read as the artifact ("bassline hum, bad"), the corrected bass read "good, clean".
What ships (BassSola, the low-band analog of the high-band SOLA corrector with every constant re-derived from bass periods):
- Period-aligned splicing — drift is repaid in whole bass-period jumps (NCC-aligned, ~34–176 Hz search range) under 8.7 ms raised-cosine fades, with one lockstep decision across channels.
- Onset protection — fades never overlap a sub-bass/low-flux onset window (kick splices read as flams); splices prefer quiet moments and the masked window after a hit. Directional due-thresholds splice early on the tight side of the corridor so protection is never bypassed by forced splices.
- Engagement ramp — below ~±1% tempo deviation the bass pitch-follows exactly (crossover seam rigid, detune ≤ ~17 cents at sub frequencies); full correction by ±2%. Mild beatmatching nudges behave exactly as before.
- RT-budgeted — the period estimator is an incremental NCC sweep (8 lags/block, ~24 ms refresh); the WCET gate is unchanged. Latency contract unchanged at 12.7 ms.
An independent adversarial review caught three interlocking HIGH findings before the exit listen (a quiet-detector envelope tracking the bass waveform's own ripple, an engagement-ramp dead zone, and a splice corridor riding up to a full period above nominal) — fixed as one unit, each pinned by a regression test. The blind exit listen (8 conditions, ±8/±4%) passed: the detune vocabulary is gone everywhere.
QA
scripts/ab.sh --env-arm label:VAR=val: extra blind arms rendered from the current tree under env settings — the harness both kill experiments ran on.- Stage 20 (bounded stereo width) was falsified blind and closed without shipping: mid-derived side injection level-matched to the historically preferred arms (+5 dB / +16 dB side) reads "underwater, smearing" — side level is not width character — and the width preference itself did not reproduce against the current wide head. Faithful stereo stays shipped; evidence archived in LEARNINGS.
Full Changelog: v0.12.0...v0.13.0