warren's spectrum

warrensspectrum · effects

Spectral-analysis resynthesizer — a port of the SPECTRAL engine of the Warren's Spectrum VST (a.k.a. CallSine, MIT-licensed). Runs a rolling 2048-point FFT over whatever is patched into AUDIO IN, picks the loudest sinusoidal peaks, ranks them by SALIENCE (a harmonic-series bonus, so thinning the bank collapses toward the fundamental rather than toward the loudest formant), tracks them frame to frame with McAulay-Quatieri matching, and rebuilds the sound as up to 256 oscillators. It also replays what the tracker DISCARDS: leftover bin energy is measured in 16 log-spaced bands and re-synthesised as band-passed noise (the SMS residual) — the difference between a vocoder and a voice. PARTIALS sets density and CPU; LOCK snaps partials onto a harmonic comb (self-disengaging on unpitched input); RESIDUAL fades the noise half; SLICE sets the analysis period over a full 2-200 ms (the plugin declares that range but internally clamps at ~21 ms — here all of it works); SHAPE morphs every partial sine→saw→square; FREEZE (control or GATE input) holds the current spectrum as a drone; FLOOR/STABILITY gate which peaks earn an oscillator; SLEW smears them in time; CENTER and a V/oct PITCH input transpose the whole bank post-analysis. Mono in, mono out, monophonic — it is an EFFECT, so nothing patched into AUDIO IN means silence. Phase 1: no filterbank, no WAVETABLE or MASSPASS engine, no built-in FX.

A resynthesizer with TWO different engines behind one MODE switch — a port of the Warren's Spectrum VST. MODE picks between them and they are separate DSP code, not two settings of one algorithm. MASSPASS is the other engine: it never runs an FFT at all, instead splitting the input across 16 to 99 log-spaced bandpass filters from 50 Hz to 12 kHz and letting each band report its own level (a 3 ms / 80 ms envelope follower) and its own pitch (a smoothed zero-crossing rate). Those per-band readings are sampled and HELD at the SLICE interval, and each band's oscillator runs on the held values — that sample-and-hold is the engine's signature stepping, and it makes SLICE far more dramatic here than in SPECTRAL. Only the loudest PARTIALS-many bands sound; the rest keep tracking and keep their phase advancing so nothing pops when they return. It is coarser and more vocoder-like than SPECTRAL, and at low band counts it is also cheaper, because there is no FFT and no partial matcher. BANDS sets the count and is a timbre control, not a level one (the bank is normalised by 1/sqrt(N)). SHAPE, SLICE, FREEZE, CENTER and the V/oct input all work in both modes; LOCK, RESIDUAL, FLOOR, STABILITY and SLEW are SPECTRAL-only, because they describe peak-tracking machinery MASSPASS does not have. Switching modes is click-free: the output dips to silence for about 6 ms and returns on the new engine. The default engine is SPECTRAL, described next. A spectral-analysis resynthesizer — a port of the SPECTRAL engine of the Warren's Spectrum VST. It listens to whatever audio you patch into AUDIO IN, runs a rolling 2048-point FFT, finds the loudest sinusoidal peaks, tracks them from frame to frame, and rebuilds the sound as a bank of up to 256 oscillators. Crucially it ALSO rebuilds the part a partial tracker normally throws away: the energy left over after the peaks are claimed is measured in 16 log-spaced bands and replayed as filtered noise (the SMS "residual"). That residual is what keeps breath, air and sibilance in the sound — the plugin's own source calls it the number-one fix for the vocoder/robot vibe — so at RESIDUAL 0 an "sss" vanishes and at RESIDUAL 2 it comes back. Because the rebuild is an oscillator bank you can transpose it cleanly (CENTER, or a V/oct cable), thin it out (PARTIALS), recolour every partial from sine through saw to square (SHAPE), snap the partials onto a harmonic series (LOCK), smear it in time (SLEW), change how often it re-analyses (SLICE), or hold the current spectrum forever (FREEZE). It is an EFFECT, not a synth: with nothing patched into AUDIO IN it is silent. It is also mono and monophonic — N voices means N instances.

the faceplate

warren's spectrumaudio_inaudiopitchpitchgategatepartials_cvcvlock_cvcvresidual_cvcvshape_cvcvslice_cvcvcenter_cvcvoutaudioaudiocvgatepitch
9 inputs · 1 outputs · 15 params

inputs

idcablewhat it does
audio_inaudioThe mono audio to analyse and rebuild — a synth voice, a drum loop, a vocal, a whole mix. Nothing patched here means no output: this module resynthesizes what it hears, it does not generate on its own.
audio signal
pitchpitchA 1V/oct pitch input that transposes the whole rebuilt spectrum after analysis, so it shifts pitch without time-stretching. It multiplies with the CENTER control rather than replacing it.
V/oct pitch CV
gategateFREEZE while the gate is HIGH. Hold it and the oscillator bank keeps playing the frequencies and amplitudes it last acquired — a sustain, not a buffer loop — so SHAPE, CENTER and SLEW still work on the held spectrum. Let it fall and analysis resumes from live audio. It reacts to the LEVEL, not just the edge, so a long gate is a long freeze.
gate / trigger; gate — acts while the level is high (reacts to both edges)
partials_cvcvCV that adds to PARTIALS, opening the bank up or collapsing it toward the fundamental.
control voltage (CV); modulates spectralPartials (additive offset — ±1 CV sweeps the full range, centered on the knob)
lock_cvcvCV that adds to LOCK, sweeping between the raw analysed frequencies and an exact harmonic comb.
control voltage (CV); modulates spectralLock (additive offset — ±1 CV sweeps the full range, centered on the knob)
residual_cvcvCV that adds to RESIDUAL, fading the noise half of the resynthesis in and out.
control voltage (CV); modulates spectralResidual (additive offset — ±1 CV sweeps the full range, centered on the knob)
shape_cvcvCV that adds to SHAPE, morphing every partial between sine, saw and square.
control voltage (CV); modulates spectralShape (additive offset — ±1 CV sweeps the full range, centered on the knob)
slice_cvcvCV that adds to SLICE, modulating how often the spectrum is re-analysed — the rhythmic axis.
control voltage (CV); modulates spectralSlice (additive offset — ±1 CV sweeps the full range, centered on the knob)
center_cvcvCV that adds to CENTER, transposing the output in cents.
control voltage (CV); modulates spectralCenter (additive offset — ±1 CV sweeps the full range, centered on the knob)

outputs

idcablewhat it does
outaudioThe resynthesis: the tracked partials rendered by the oscillator bank, plus the 16-band noise residual, transposed and levelled. Held steady while FREEZE is engaged. It is a STEREO output, but it only carries a stereo image once BANK WET is up and the filterbank's bands are panned — the spectral engine ahead of it is mono, so with the bank out of circuit both channels carry the identical signal.
audio signal

params

idlabelrangedefaultcurve
engineModeMode?..?discrete
spectralBandCountBands?..?discrete
spectralPartialsPartials?..?discrete
spectralLockLock?..?linear
spectralResidualResidual?..?linear
spectralSliceSlice?..?mslinear
engineFreezeFreeze?..?discrete
spectralShapeShape?..?linear
spectralFloorFloor?..?dBlinear
spectralStabStability?..?discrete
spectralSlewSlew?..?slinear
spectralCenterCenter?..?centslinear
resynthLevelBank Wet?..?linear
inputMixInput Mix?..?linear
gainGain?..?dBlinear

controls

controlwhat it does
FreezeHolds the current picture so the module drones on it no matter what the input does. In SPECTRAL that is the tracked partials — their frequencies and amplitudes — held as oscillator state rather than a looped buffer, which is why it sustains rather than stutters, and why SHAPE, CENTER and SLEW still change a frozen sound. In MASSPASS it holds the per-band level and pitch snapshot instead, with the oscillators still running, so it sustains the same way. The GATE input does the same thing while it is high; the two OR together. Note: in the original plugin FREEZE is wired to the spectral engine only and does nothing in MASSPASS — here it works in both, because a gate input that accepts a cable and silently ignores it is worse than a missing feature.
ModeWhich of the two resynthesis engines is running — they are different DSP code, not two settings of one algorithm, so this changes more than any other control here. SPECTRAL runs a 2048-point FFT, finds and tracks sinusoidal peaks, and rebuilds the sound as tracked partials plus a noise residual; it follows pitch and sounds like the source rebuilt. MASSPASS never transforms anything: it splits the input across 16 to 99 tuned bandpass filters and lets each band report its own level and its own zero-crossing pitch, sampled and held at SLICE. The result is coarser, more vocoder-like and much more obviously stepped, and because MASSPASS has no FFT it is also cheaper at low band counts. Switching is click-free — the output dips to silence for about 6 ms and comes back on the new engine. The original plugin also has a WAVETABLE mode, which is not implemented here yet; a preset saved in it opens in SPECTRAL rather than silent, and it will be added as a third position rather than renumbering these two.
GainOutput level in dB, −60 to +12.
Input MixAdds the RAW audio from AUDIO IN straight onto the output, on top of everything else. Independent of BANK WET — it is the only way to hear the unprocessed source, so it is what you reach for to blend a little of the real signal back under a heavily-thinned resynthesis, or to use the module as a parallel effect rather than an insert. It arrives equally in both channels, since the input is mono.
Bank WetHow much of the output comes through the 8-band FILTERBANK: 0 is the bare resynthesis, 1 is the resynthesis heard ONLY through the bands. It is a crossfade, not a level — turning it up does not make the module louder, it swaps one path for the other. It also decides whether this module is mono or stereo, because the per-band PAN is the only stage in the whole chain that makes a stereo image. NOTE: the original plugin ships this at 1, with the bank always in circuit; here it defaults to 0 so that adding the filterbank cannot change how a rack you already saved sounds. Turn it up and the bank is exactly the plugin's.
BandsHow many bandpass filters MASSPASS splits the input across — 16, 24, 33, 48, 66 or 99, log-spaced from 50 Hz to 12 kHz. Used ONLY in MASSPASS mode; it does nothing in SPECTRAL. Higher counts narrow each band (Q rises to about 10 at 66 bands and 17 at 99), which sharpens the resynthesis toward a classic vocoder and resolves closely-spaced partials, while low counts are broader, blurrier and cheaper. It is not a volume control — the bank is normalised by 1/sqrt(N) so changing it changes timbre and not level. It is the engine's CPU dial: 99 bands costs roughly six times what 16 does.
CenterTransposes the rebuilt spectrum by up to ±3600 cents (±3 octaves), applied after analysis so the whole bank moves coherently and the tracking is unaffected. Adds to whatever the V/oct PITCH input contributes. Works in both modes — in MASSPASS it transposes every band's oscillator while leaving the analysis filters where they are, so the resynthesis moves in pitch but keeps reading the same part of the spectrum. (The original plugin has no transposition in MASSPASS at all; ours honours it so the PITCH input is never a dead jack.)
FloorThe peak-detection threshold, in dB BELOW THE LOUDEST BIN of each frame — not an absolute level. Stricter (toward −20 dB) admits only the dominant peaks and starves the bank; more permissive (toward −90 dB) lets quiet detail and noise floor become tracked partials. Works together with STABILITY: FLOOR decides what is loud enough, STABILITY decides what has lasted long enough. Used only in SPECTRAL mode — MASSPASS has no peak detector, so nothing reads this.
LockPulls each tracked partial toward the nearest exact multiple of the detected fundamental. 0 leaves partials where the analysis found them (faithful, inharmonic, a bit warbly on voice); 1 snaps them onto a harmonic comb (musical, more synthetic). Only partials already within about 100 cents of a harmonic are moved, so formants and noise are left alone — and the whole effect is multiplied by the pitch-detector confidence, so it self-disengages on unpitched material. Used only in SPECTRAL mode: MASSPASS has no global pitch detector to snap to, because each band estimates its own frequency independently.
PartialsIn SPECTRAL: how many tracked partials the oscillator bank plays, 1 to 256, ranked by SALIENCE rather than raw loudness — so turning it down collapses toward the fundamental and its low harmonics instead of toward whichever formant happened to be loudest. It is also the CPU dial, and it scales the residual by the cube root of (PARTIALS−1)/47, so thinning the bank cleans up the noise too. 1 is a bare fundamental; 64 (the plugin default) is a full rebuild. In MASSPASS the SAME knob becomes the active-band limiter, re-clamped to 1..BANDS: only the loudest that many bands sound, and the rest keep tracking and keep their oscillator phase advancing so that a band coming back does not pop. Turning it down there thins the vocoder to its strongest formants.
ResidualLevel of the SMS noise residual: the energy left in the spectrum after every tracked peak is masked out, measured in 16 log-spaced bands from 80 Hz up and replayed through band-passed noise. 0 gives you the pure sinusoidal bank (the classic vocoder/robot sound); 0.5 is the plugin default; 2 puts back more breath and air than the input had. This is the control that decides whether the module sounds like a machine or like the source. Used only in SPECTRAL mode: the residual is what is left over after peak-picking, and MASSPASS never picks peaks.
ShapeThe waveform every voice uses: sine at 0, band-limited saw at 0.5, band-limited square at 1, crossfading smoothly in between. At 0 this is a faithful additive resynthesis; past that each voice sprouts its own harmonic series, which thickens and dirties the whole rebuild. It works identically in both modes — the two engines render their voices through the same shared waveform function, so the knob means exactly the same thing whichever is selected.
SlewSmoothing time for each partial, 0.02 to 4 seconds — applied to amplitude per sample and to frequency per analysis frame. Short values follow the input crisply; long values glide partials between analyses, smearing the resynthesis into an evolving pad. Frequency smoothing is also why a partial drifting between FFT bins glides instead of chirping. Used only in SPECTRAL mode: MASSPASS does its own smoothing with a fixed 3 ms attack / 80 ms release envelope follower per band, which this knob does not reach.
SliceThe rate at which the engine re-reads the input, 2 to 200 ms — and it means something different, and much stronger, in each mode. In SPECTRAL it is how often the spectrum is re-analysed: short values track transients and chatter with the source, long values sample and hold. The analysis WINDOW is always 2048 samples (about 43 ms), so a long SLICE slows the update rate without blurring what each frame sees. In MASSPASS it is the sample-and-hold interval on every band's level and pitch at once — between snapshots each band's oscillator is literally frozen in amplitude and frequency, which is where that engine's hard stepping comes from. Note: the original plugin declares this same 2–200 ms range but internally clamps SPECTRAL at about 21 ms, so most of its knob does nothing there — here the whole range works in both modes.
StabilityHow many consecutive analysis frames a partial must survive before it is allowed to make sound, 1 to 16. It fades in over that window rather than hard-unmuting. Low values track fast and chirp on noisy material; high values suppress the short-lived flickering peaks that make a partial tracker sound like beeping robots. Used only in SPECTRAL mode — MASSPASS bands are permanent, so there is no birth to gate.
Ws filterbank {n}One of the 8 parallel resonant bands the output passes through when BANK WET is up. Each band is a filter with its own CUTOFF (20 Hz–20 kHz), RESONANCE (0.5–20), TYPE (a continuous morph from low-pass through band-pass to high-pass), PAN and SEND. SEND is the band's level into the output and doubles as its on/off switch — a band at 0 is skipped entirely and costs nothing. PAN is where stereo comes from: the engine ahead of this is mono, so spreading the bands across the image is the only way to widen the module. The defaults are the plugin's own opening layout — cutoffs log-spaced at 60/120/250/500 Hz and 1/2/4/8 kHz, the three lowest bands high-pass, the two middle band-pass, the three highest low-pass — which reads as a broad EQ rather than a resonator comb until you raise RESONANCE.

source

warrensspectrum.ts on GitHub.

Generated from packages/web/src/lib/{audio,video}/module-registry.ts · repo