tidy vco

tidyVco · sources

TIDY VCO — flagship virtual-analog SUBTRACTIVE SYNTH VOICE: two polyBLEP oscillators with a continuous saw↔pulse SHAPE morph per osc, shared PW + audio-rate PWM CV, OSC2 octave switch + cents detune, and a −1-octave sub square, into an ALL-NEW nonlinear zero-delay-feedback DIODE LADDER filter (EMS VCS3 / TB-303 lineage — bidirectionally-coupled stages, soft warm knee into 24 dB/oct, feedback squelch limiter for a bounded near-sine self-oscillation, CUTOFF calibrated to the resonant pitch within 3 cents so keytracked self-osc plays in tune, DRIVE tanh saturation at 2× oversampling, part-compensated squelch bass dip). Two RC-curve "punch" ADSRs (CEM3310-style exponential segments, overshoot-target convex attack, analog resume-from-level retrigger): a filter EG with bipolar ±4-octave ENV amount + keytracking, and an amp EG into an OTA-flavored soft-knee VCA whose tanh bias blooms gentle even harmonics with level. 5-voice POLY on the polyPitchGate chord bus (lane i → voice i, release tails hold their pitch) AND a mono pitch/gate pair driving a REAL 2-voice unison (±7¢·WIDTH drift panned to opposite sides — true stereo beating); WIDTH also fans the poly voices across the stereo field (root anchored center). Stereo out_l/out_r pair (auto-wires R when L is patched), HOLD pad for droning the voice from the card, and a CV jack for EVERY control (27 inputs): the six original CVs — cutoff (4 oct/V, audio-rate), res, pwm (audio-rate), drive, fold (audio-rate), sym (audio-rate) — PLUS a GLOBAL block-rate per-knob CV for each remaining control: shape1/shape2/mix/sub/fsus/sus/track/width (0..1 full-swing), detune (±50¢), oct2 (discrete ±1 step/V), env (±4-oct bipolar), the six EG times (4 oct/V), and level (±18 dB/V). Every law is scaled in the shared core (lib/tidy-vco-dsp.ts) so cv = 0 is a byte-exact no-op. The rear patch panel groups its jacks into OSC·WAVEFOLD·DIODE FILTER·FILTER EG·AMP EG·OUT·POLY/OUT sections mirroring the card headers.

A flagship two-oscillator virtual-analog subtractive voice: OSC1 and OSC2 each morph continuously from sawtooth to pulse (band-limited polyBLEP), share one pulse-width control with a PWM CV jack, and OSC2 adds an octave switch plus cents detune; a sub square one octave under OSC1 fattens the bottom. The mix then passes through a STEREO WAVEFOLDER placed BEFORE the filter — the West-Coast Serge/Buchla move of folding timbre INTO a lowpass: a reflecting triangle folder (antialiased with antiderivative antialiasing over 2× oversampling) that grows a thicket of harmonics as FOLD climbs, with a SYMMETRY bias that blooms even harmonics off-center, and a genuine stereo image (L and R fold at antiphase points scaled by WIDTH, so the folder itself widens the field). FOLD 0 is a true bypass — every existing patch is unchanged. The folded mix feeds an all-new nonlinear zero-delay-feedback DIODE LADDER filter — the EMS VCS3 / TB-303 circuit family, deliberately distinct from a Moog-style transistor ladder: bidirectionally coupled stages give a softer, warmer knee into a 24 dB/oct slope, the resonance return passes through a squelch limiter so high RES compresses into a bounded, CLEAN self-oscillation whistle, and the CUTOFF knob is calibrated to the resonant pitch itself (keytracked self-osc plays in tune; the zero-res brightness knee sits well below the knob — the diode pole spread, part of the sound). DRIVE saturates into the filter for harmonic warmth (2× oversampled, loudness-compensated), and the diode ladder’s natural bass-loss at high resonance is deliberately only part-compensated — a musical squelch dip instead of a vanished low end. Two RC-curve ADSRs shape the note: real one-pole exponential segments in the CEM3310 lineage, whose attack charges toward an overshoot target and cuts over at full level — a convex, punchy front — with analog retrigger (a re-struck note resumes from its current level, never a click). The filter EG sweeps cutoff by up to ±4 octaves via ENV; the amp EG drives an OTA-flavored VCA whose tanh knee blooms gentle even harmonics as notes get louder. The voice is 5-voice polyphonic on the POLY chord bus (lane i drives voice i; a releasing voice holds its pitch), falls back to the mono PITCH/GATE pair when no lane is gated — where it plays a REAL two-voice unison, detuned ±7 cents times WIDTH and panned to opposite sides, each side with its own filter and envelopes — and WIDTH also fans the five poly voices across the stereo field with the root note anchored center. A momentary HOLD pad on the panel gates the voice by hand — the fastest way to audition or drone it while you shape the sound.

the faceplate

tidy vcopolypolyPitchGatepitchcvgategatecutoff_cvcvres_cvcvpwm_cvcvdrive_cvcvfold_cvcvsym_cvcvshape1_cvcvshape2_cvcvdetune_cvcvoct2_cvcvmix_cvcvsub_cvcvenv_cvcvtrack_cvcvfatk_cvcvfdec_cvcvfsus_cvcvfrel_cvcvatk_cvcvdec_cvcvsus_cvcvrel_cvcvwidth_cvcvlevel_cvcvout_laudioout_raudioaudiocvgatepitch
27 inputs · 2 outputs · 25 params

inputs

idcablewhat it does
polypolyPitchGateThe 5-lane poly pitch/gate chord bus: lane i drives voice i (fixed mapping, no allocator). Patch a real poly source — MIDI LANE, POLYSEQZ, or a SEQUENCER with chords — and each gated lane opens that voice’s own filter + amp envelopes; a releasing voice keeps sounding at its held pitch. While ANY lane is gated this bus wins over the mono pitch/gate pair.
poly pitch+gate bus; 10-channel poly bus (5 pitch + 5 gate lanes)
pitchcvMono pitch CV, 1 V/oct with 0 V = C4. When no poly lane is gated, this drives the 2-voice unison pair (both voices track it, split by WIDTH’s detune drift).
control voltage (CV)
gategateMono gate (level-sensitive, not edge-only): high opens the unison pair’s envelopes, low releases them — note-off matters, an ADSR sustain lives while this is held. The panel HOLD pad ORs into this gate, and poly lanes take precedence the moment any lane goes high.
gate / trigger; gate — acts while the level is high (reacts to both edges)
cutoff_cvcvFilter cutoff CV at 4 octaves per volt — a ±1 V full swing covers ±4 octaves around the CUTOFF knob. Audio-rate (per-sample) for filter FM growl.
control voltage (CV)
res_cvcvResonance CV: ±1 V spans the whole RES range on top of the knob — sequence the squelch, or push a moderate knob setting over the self-osc threshold.
control voltage (CV)
pwm_cvcvPulse-width modulation CV: ±0.45 duty per volt on the shared PW, audio-rate. The effective width is clamped 0.05–0.95, so CV reaches wide duties past the knob’s 0.5 (square) ceiling. Classic PWM strings come from an LFO here with SHAPE at pulse.
control voltage (CV)
drive_cvcvDrive CV: ±1 V spans the whole DRIVE range on top of the knob — automate the filter’s input saturation for building intensity.
control voltage (CV)
fold_cvcvWavefolder FOLD CV: ±1 V spans the whole FOLD range on top of the knob, audio-rate. The folder is very modulation-hungry — an envelope or LFO here sweeps timbre from clean to fully folded (classic West-Coast dynamic-fold gestures).
control voltage (CV)
sym_cvcvWavefolder SYMMETRY CV: ±1 V spans the whole asymmetry range each way, audio-rate. Modulate the fold’s bias to make the even-harmonic content breathe (only audible while FOLD is up).
control voltage (CV)
shape1_cvcvOSC1 SHAPE CV: ±1 V sweeps the full saw↔pulse morph (0..1) on top of the knob. GLOBAL (all 5 voices), block-rate; cv = 0 is a no-op.
control voltage (CV)
shape2_cvcvOSC2 SHAPE CV: ±1 V sweeps the full saw↔pulse morph (0..1) on top of the knob. GLOBAL (all voices), block-rate.
control voltage (CV)
detune_cvcvOSC2 DETUNE CV (cents, linear): ±1 V sweeps ±50 ¢ — the full detune range centered on the knob. GLOBAL (all voices), block-rate; feed a slow LFO for a drifting chorus.
control voltage (CV)
oct2_cvcvOSC2 OCTAVE CV (discrete): 1 octave step per volt, summed with the knob, rounded and clamped to −1 / 0 / +1. GLOBAL (all voices), block-rate.
control voltage (CV)
mix_cvcvOSC1↔OSC2 MIX CV: ±1 V sweeps the full equal-power balance (0..1) on top of the knob. GLOBAL (all voices), block-rate.
control voltage (CV)
sub_cvcvSUB-oscillator level CV: ±1 V sweeps the full sub-square level (0..1) on top of the knob. GLOBAL (all voices), block-rate.
control voltage (CV)
env_cvcvFilter-EG AMOUNT CV (bipolar): ±1 V sweeps the full ±1 ENV depth (±4 octaves of cutoff sweep) centered on the knob. GLOBAL (all voices), block-rate.
control voltage (CV)
track_cvcvCutoff KEYTRACKING CV: ±1 V sweeps the full 0–100 % TRACK amount on top of the knob. GLOBAL (all voices), block-rate.
control voltage (CV)
fatk_cvcvFilter-EG ATTACK-time CV: 4 octaves of time per volt (+1 V = ×16, −1 V = ×1⁄16) multiplying the knob time. GLOBAL (all voices), block-rate; cv = 0 = ×1, a no-op.
control voltage (CV)
fdec_cvcvFilter-EG DECAY-time CV: 4 octaves of time per volt on top of the knob. GLOBAL (all voices), block-rate.
control voltage (CV)
fsus_cvcvFilter-EG SUSTAIN CV: ±1 V sweeps the full 0–1 sustain level on top of the knob. GLOBAL (all voices), block-rate.
control voltage (CV)
frel_cvcvFilter-EG RELEASE-time CV: 4 octaves of time per volt on top of the knob. GLOBAL (all voices), block-rate.
control voltage (CV)
atk_cvcvAmp-EG ATTACK-time CV: 4 octaves of time per volt (+1 V = ×16) multiplying the knob time. GLOBAL (all voices), block-rate.
control voltage (CV)
dec_cvcvAmp-EG DECAY-time CV: 4 octaves of time per volt on top of the knob. GLOBAL (all voices), block-rate.
control voltage (CV)
sus_cvcvAmp-EG SUSTAIN CV: ±1 V sweeps the full 0–1 sustain level on top of the knob. GLOBAL (all voices), block-rate.
control voltage (CV)
rel_cvcvAmp-EG RELEASE-time CV: 4 octaves of time per volt on top of the knob. GLOBAL (all voices), block-rate.
control voltage (CV)
width_cvcvStereo WIDTH CV: ±1 V sweeps the full 0–1 width — the poly pan fan / mono unison spread AND the wavefolder’s stereo decorrelation. GLOBAL, block-rate.
control voltage (CV)
level_cvcvOutput LEVEL CV (dB): ±1 V sweeps ±18 dB — the full 36 dB level range centered on the knob (clamped −24..+12 dB into the true-peak bound). GLOBAL, block-rate; cv = 0 is a no-op.
control voltage (CV)

outputs

idcablewhat it does
out_laudioLeft output of the stereo voice bus (equal-power voice pans, 1/√n normalization, dB LEVEL, DC-blocked, true-peak bounded). Pairs with out_r — patching L into a stereo target auto-wires R.
audio signal; L/R stereo pair with out_r
out_raudioRight output — the partner of out_l, carrying the WIDTH pan fan (poly) or the opposite unison voice (mono).
audio signal; L/R stereo pair with out_l

params

idlabelrangedefaultcurve
shape1Shape 10..10linear
shape2Shape 20..10linear
pwPW0.05..0.50.5linear
detuneDetune-50..50¢6linear
oct2Oct 2-1..10discrete
mixMix0..10.5linear
subSub0..10.15linear
foldFold0..10linear
symSym-1..10linear
cutoffCutoff40..14000Hz900log
resRes0..10.35linear
driveDrive0..10.25linear
envEnv-1..10.45linear
trackTrack0..10.4linear
fatkF.A0.0005..5s0.005log
fdecF.D0.001..5s0.35log
fsusF.S0..10.2linear
frelF.R0.001..5s0.3log
atkA0.0005..5s0.003log
decD0.001..5s0.25log
susS0..10.75linear
relR0.001..5s0.25log
widthWidth0..10.4linear
levelLevel-24..12dB0linear
holdHold0..10discrete

controls

controlwhat it does
AAmp attack time — the same convex RC punch: a re-struck note resumes from its current level (analog retrigger, no reset click).
CutoffFilter cutoff, 40 Hz–14 kHz — calibrated to the RESONANT pitch: at full RES the filter whistles AT this frequency (and tracks it to under 3 cents). The zero-res brightness knee sits a few octaves below the knob — the diode ladder’s soft spread knee, part of its warmth.
DAmp decay time to SUSTAIN while the note is held.
DetuneOSC2 detune in cents (±50): a few cents gives the classic two-osc VA shimmer — the pair beats at a rate proportional to the note’s frequency, so high notes shimmer faster — while large values approach quarter-tone clash.
DriveInput saturation into the ladder (2× oversampled tanh with loudness makeup): grows odd harmonics by tens of dB across the travel without acting as a volume knob.
EnvFilter-EG amount, bipolar: up to ±4 octaves of cutoff sweep from the filter ADSR. Negative values pull the attack DARK and open into the sustain.
F.AFilter EG attack time (RC-curve: exponential charge toward an overshoot target — front-loaded, punchy).
F.DFilter EG decay time to the filter sustain level (−60 dB RC convention).
FoldStereo WAVEFOLDER amount, placed BEFORE the filter (the West-Coast timbre-into-lowpass voice): 0 is a true bypass (the voice sounds exactly as it did without the folder), and turning it up drives the osc bus into a reflecting triangle folder that reflects more times as you climb — a rising thicket of harmonics the diode ladder then shapes. The fold is antialiased (ADAA + 2× oversampling) and GENUINELY stereo: L and R fold at antiphase points (scaled by WIDTH) so the folder itself widens the image, more as FOLD rises. Very modulation-hungry — patch an envelope or LFO into the FOLD CV.
F.RFilter EG release time after note-off (the brightness falls at its own rate, independent of the amp tail).
F.SFilter EG sustain level — the settled brightness while a note is held.
HoldMomentary drone pad: pressed = the mono gate held high, released = note-off (no latch). OR-ed with the GATE jack — an external gate keeps working — and poly lanes still win while any lane is gated. The fastest way to audition the voice as you shape it.
LevelOutput level in dB (−24…+12) into the true-peak bound.
MixEqual-power OSC1↔OSC2 balance: 0 = OSC1 only, 1 = OSC2 only.
Oct 2OSC2 octave switch — three states, not a sweep: −1 (an octave below OSC1), 0 (OSC1’s own octave, where DETUNE alone separates the pair into the classic two-osc shimmer) and +1 (an octave above). At ±1 the DETUNE beat rides on top of the interval rather than replacing it.
PWShared pulse width for both oscillators’ pulse legs: 0.5 = square (even harmonics nulled) down to 0.05 = a thin reedy sliver. The PWM CV jack modulates around this — and can push the effective width past the knob’s square ceiling, up to 0.95.
RAmp release time after note-off.
ResResonance: squelchy diode-ladder emphasis that compresses through the feedback limiter as it rises; self-oscillation starts near 0.89 and the whistle stays bounded and near-sinusoidal. High RES also drops the passband by design — up to ~10 dB near full resonance, part-compensated from the raw diode ladder’s −25 dB collapse: the 303 body-drop squelch dip.
Shape 1OSC1 waveform morph: 0 = sawtooth, 1 = pulse, continuous crossfade between (both legs band-limited; the even harmonics drain out as it approaches the square).
Shape 2OSC2 waveform morph, same law as SHAPE 1 (0 = saw, 1 = pulse).
SubSub-oscillator level: a band-limited square one octave below OSC1, mixed under the pair for floor weight.
SAmp sustain level (read live — sweeping it during a held note tracks).
SymWavefolder SYMMETRY: a bipolar DC bias on the fold input (only active while FOLD is up). At center the fold is symmetric (odd harmonics only); pushed either way it folds asymmetrically, blooming EVEN harmonics for a hollow, brassy, or reedy character. Modulate it with the SYM CV.
TrackCutoff keytracking, 0–100 %: at 100 % the filter (and its self-osc whistle) follows the keyboard exactly — play the resonance as a voice.
WidthStereo width: in poly it fans the five voices across the field (root anchored center); in mono it engages the 2-voice unison — ±(7 ¢ × WIDTH) drift panned to opposite sides. It also scales the wavefolder’s L/R decorrelation, so the folder widens with it. 0 = center mono, 1 = full field.

source

tidy-vco.ts on GitHub.

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