- live playback speed —
a.playbackRatesettable mid-playback, smooth tape-style ramp (player + worker) audio(src, { worker: true })— worker-hosted engine from the main entry- sliding stretch —
stretch(t => f)/stretch({ t, v }): continuous tempo envelope, pitch preserved shrink(gap?)— compress silent pauses to a target gap ≡ ffmpegsilenceremove, audacity truncate-silencecrossover(...freqs)— LR4 band split, allpass-flat sum ≡ ffmpegacrossover- adjustable fade —
fade(dur, { start, end, mid }): arbitrary levels, midpoint skew - per-block note events for streaming instruments; contract
frameshook for length-changing plugins - registry 125 → 136:
chroma/tonnetzstats,stretch-*×9 (pvoc-lock/pghi/wsola/psola/sms/transient/hybrid/paul) - CLI:
split --cue album.cue— cue-sheet tracks,{title}naming, tags;[]player speed keys - save/encode: empty range fails before touching the file (#27)
- fix: unranged
mix/writerestarted at every block (source tiled) - decode: dual-mono wav/flac keep both channels; browser falls back to native WebAudio for unbundled codecs
- OPFS budget auto-detects via
storage.estimate() audio.d.tsfor every@audio/*plugin package, generated from manifest metadataaudio.pluginsregistry (audio.atomsstays as deprecated alias)
Full Changelog: v2.5.1...v2.6.0