Skip to content

v0.6.0

Latest

Choose a tag to compare

@robmorgan robmorgan released this 12 Jul 00:54
f630588

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::LegacyHybridRerender and StreamProcessor::set_hybrid_mode removed — StreamingEngine::Deterministic (persistent per-channel PVs + transient scheduler) is the streaming path; the offline hybrid stretcher behind stretch_buffer/batch APIs is unaffected
  • StreamProcessor::set_streaming_engine now returns Result<(), 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 MultiResolutionStretcher streaming 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_secs vs pipeline_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 new qa/varispeed_keylock.rs harness
  • Source timeline stays exact through tempo rides: onsets fire exactly once, notify_source_jump and warm_start_seek map 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 against benchmarks/manifest.toml tracks — 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