What's Changed
This release reworks the streaming engine architecture: the legacy hybrid re-render path is gone, a multi-resolution filterbank engine joins the real-time path, and the keylock control path is inverted so tempo response is instant (Stage 15). Published on crates.io as timestretch 0.6.0.
Breaking Changes
StreamingEngine::LegacyHybridRerenderandStreamProcessor::set_hybrid_moderemoved —StreamingEngine::Deterministic(persistent per-channel PVs + transient scheduler) is the streaming path; the offline hybrid stretcher behindstretch_buffer/batch APIs is unaffectedStreamProcessor::set_streaming_enginenow returnsResult<(), StretchError>(engine selection can fail)
Multi-Resolution Streaming Engine (New)
StreamingEngine::MultiResolution: the three-band Linkwitz-Riley filterbank (MultiResolutionStretcher) in the real-time path — incremental LR8 crossover split, per-band streaming PVs, zero allocations in steady state- Per-profile band FFT sizing: Club 8192/2048/512, Quality 16384/4096/1024; the Live profile rejects multi-res with an explicit error rather than a silent 4x latency surprise
- Measured latency gates: Club 12288 frames (278.6 ms), Quality 24576 frames (557.3 ms) — first output lands exactly at the reported gate
- Full
MultiResolutionStretcherstreaming API:process_streaming_into,flush_streaming_into,reserve_streaming_capacity,last_frame_flux, and more
Varispeed-First Keylock — Stage 15 (New)
ControlPath::VarispeedFirst: the tempo fader drives a varispeed sinc resampler at the input (sample-accurate retargets, no glide on the tempo axis) and the phase vocoder only pitch-corrects at a delay-matched transposition — the architecture commercial decks use- Tempo control-to-audio latency collapses to the resampler kernel lookahead (16 samples at DJ ratios); the buffering gate becomes a constant, host-compensated pipeline delay, split out in
StreamLatencyReport(control_to_audio_secsvspipeline_delay_secs) - Torture-ride pitch wobble drops from ~100 to ~12 cents p95 on the Live profile (
PhaseVocoder::set_smooth_ratio_updates), gated in the newqa/varispeed_keylock.rsharness - Source timeline stays exact through tempo rides: onsets fire exactly once,
notify_source_jumpandwarm_start_seekmap through the resampled↔source ratio map - Quality A/B: varispeed ≥ vocoder path on every profile row (Live steady 0.9982 → 0.9997), zero clicks, allocation-free steady state
Desktop
- Engine selector (Standard / Multi-resolution) and Tempo Path selector; varispeed-first is the new default, with the pipeline/tempo latency split shown in the UI and an audible-position playhead
QA & Tooling
- Manifest-driven BPM detection accuracy harness (
qa/bpm_accuracy.rs): scores the detector againstbenchmarks/manifest.tomltracks — wav/mp3/aiff corpus entries (bpm_only = true), sha256-verified, MIREX-style exact/octave accuracy scores, JSON report for diffing detector changes - Stages 15 and 16 specced in the ROADMAP (varispeed-first keylock; causal low-end at small FFTs)
Full Changelog: v0.5.0...v0.6.0