@audio/ shift-sms
Status calibrated
npm1.1.0licenseMIT
Spectral Modeling Synthesis (Serra/Smith) sinusoidal+residual pitch shift
Overview
- Install
- Updated
- Family
- shift, 15 packages under it
- Tags
- time & pitch
import sms from '@audio/shift-sms'
Spectral Modeling Synthesis. Parabolic-interpolated peak picking builds sinusoidal tracks (freq, mag, phase); each peak's lobe is copied intact to round(f·ratio). Stochastic residual shifts to ratio-scaled bins with analysis phase.
sms(audio, { ratio: 2 })
sms(audio, { ratio: 1.5, maxTracks: 40 })
| Param | Default | |
|---|---|---|
maxTracks |
Infinity |
Max simultaneous sinusoidal tracks |
minMag |
1e-4 |
Peak detection threshold (linear) |
Preserves formant envelope (lobes scale freely with peaks), harmonic structure, tonal clarity.
Destroys transients, noise-like textures (absorbed into residual), polyphony beyond maxTracks.
| f0 err | THD% | alias | attack corr | formant dist | phase coh | shift |
|---|---|---|---|---|---|---|
| 0.00 | 0.0 | 0.002 | 0.963 | 1.845 | 0.929 | 1.701 |
Lower attack corr (0.963) because sinusoidal modeling smooths onset transients into the residual.
Use when: Sustained tonal / harmonic instruments, vowels.
Not for: Percussion, noise-heavy material.
Stream
let write = sms({ ratio: 1.5 })
let out = write(inputBlock)
let tail = write() // flush
sms streams per-frame: each write(chunk) call renormalizes and emits audio as soon as a frame completes, and re-chunking the same input differently reproduces the batch output byte for byte.
Data
Input is a Float32Array (mono) or an array of Float32Array channels ([left, right, ...]) — anything else throws TypeError. ratio also accepts a function t => ratio (seconds from stream start) or a Float32Array breakpoint envelope (resampled across the input via ratioDuration, default the input's own duration) for time-varying pitch.
Part of @audio/shift — the shift family umbrella. This README is generated from the umbrella docs.
MIT © audiojs