Skip to content

v0.13.0

Choose a tag to compare

@robmorgan robmorgan released this 20 Aug 02:09
· 20 commits to main since this release

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