@audio/shift-wsola
v1.0.3
Published
WSOLA (Waveform-Similarity Overlap-Add) pitch shift — similarity-search OLA variant
Readme
@audio/shift-wsola

WSOLA (Waveform-Similarity Overlap-Add) pitch shift — similarity-search OLA variant
npm install @audio/shift-wsolaimport wsola from '@audio/shift-wsola'WSOLA time-stretch + sinc resample. Searches each grain position ±tolerance samples for maximum cross-correlation with the previous grain's tail, eliminating phase cancellation before resampling to the target pitch.
wsola(audio, { ratio: 0.85 })
wsola(audio, { ratio: 1.5, tolerance: 512 })| Param | Default | |
|---|---|---|
| tolerance | frameSize/4 | Similarity search radius (±samples) |
Preserves local waveform shape, attack envelopes. Destroys formants (shifted by resample), phase coherence across long spans.
| f0 err | THD% | alias | attack corr | formant dist | phase coh | shift | |-------:|-----:|------:|------------:|-------------:|----------:|------:| | 1.67 | 0.1 | 0.005 | 0.995 | 2.358 | 0.864 | 1.674 |
f0 err 1.67 Hz from sinc resample quantization (time-domain algorithms round the stretch ratio to grain boundaries). Attack corr 0.995 ties delay for second place — only hpss's untouched percussive pass-through scores higher.
Use when: Speech, low-latency, anywhere the phase vocoder's frame latency is unacceptable. Not for: Polyphonic music with sustained tones.
Stream
let write = wsola({ ratio: 1.5 })
let out = write(inputBlock)
let tail = write() // flushwsola buffers the whole input; write(chunk) accumulates and the batch algorithm runs once on write() (flush, no argument), returning everything at once.
Data
Input is a Float32Array (mono) or an array of Float32Array channels ([left, right, ...]) — anything else throws TypeError. ratio here is a fixed number for the whole call — a function or Float32Array throws.
Part of @audio/shift — the shift family umbrella. This README is generated from the umbrella docs.
MIT © audiojs
