tree.oh.vox

treeohvox · sources

TB-303 voice slice — clean-room TypeScript port of the voice subset of Robin Schmidt's Open303 (MIT, https://github.com/RobinSchmidt/Open303). 6 canonical 303 knobs (TUNE ±12 st, CUTOFF 40 Hz – 6 kHz, RESONANCE 0..1, ENVELOPE 0..1, DECAY 50 ms – 3 s, ACCENT 0..1) plus pitch / gate / accent_in audio-rate inputs and per-knob CV. The DSP is the TB_303 mode of rosic::TeeBeeFilter (the diode-feedback ladder with feedback HP — NOT a moogafakkin ladder; that is the whole point of Open303), the rosic::DecayEnvelope on cutoff, a simplified AR amp envelope mirroring rosic::AnalogEnvelope, and a polyBLEP saw replacing the BlendOscillator wavetable (the 303 character lives in the filter, not the oscillator). Cutoff is modulated per-sample via Open303's measured-mapping scaler+offset formula. All 6 knobs have an 80 Hz one-pole WtParamSmoother on the audio thread (per PR #435) so knob drags and CV ride pop-free through the steep filter. Accent boosts both amp peak and filter env contribution on accented notes. The full 404 module — sequencer + transpose + slide + waveform switch + TD-3 smiley — is queued as a follow-up.

A TB-303 acid-bass voice in one card: a band-limited saw↔square oscillator into the classic 303 ladder-style resonant low-pass, with the cutoff swept by a snappy decay envelope. It's a port of Robin Schmidt's Open303, so the squelch, the resonance scream, and the accent boost behave like the real 303 voice. Play it from a pitch + gate source (a sequencer, keyboard, or MIDI lane): the gate's rising edge starts the note and its falling edge ends it (so gate length is note length), and the dedicated ACCENT gate latches an accent on that note for the louder, brighter, more resonant 303 accent character. This card is the VOICE only — the full 303 sequencer/slide/transpose lives in the planned 404 module.

the faceplate

tree.oh.voxpitch_inpitchgate_ingateaccent_ingatetune_cvcvcutoff_cvcvres_cvcvenv_cvcvdecay_cvcvaccent_cvcvwaveform_cvcvaudio_outaudioaudiocvgatepitch
10 inputs · 1 outputs · 7 params

inputs

idcablewhat it does
pitch_inpitch1V/oct pitch input — patch a sequencer or keyboard pitch CV here to set the note; the Tune knob adds a ±12-semitone offset on top.
V/oct pitch CV
gate_ingateThe note gate, and it is a GATE, not a trigger: the rising edge starts the note (amplitude + filter envelopes) and the FALLING edge ends it, so how long you hold the gate is how long the note lasts. Patch a sequencer/clock gate here. If you hold the gate longer than the 303's fixed VCA decay (~1.2 s) the note fades out under you anyway — that is the hardware's behaviour. Retriggering while a note is still sounding glides into the new note instead of cutting it, so overlapping steps stay click-free.
gate / trigger; gate — acts while the level is high (reacts to both edges)
accent_ingateThe accent gate, latched at the moment the note gate fires: when it's high on a note, that note gets the 303 accent — louder, with extra filter-envelope drive for the signature accented squelch. Drive it from a sequencer's accent lane.
gate / trigger; gate — acts while the level is high (reacts to both edges)
tune_cvcvCV that adds to the Tune knob, shifting pitch in semitones (on top of the 1V/oct input).
control voltage (CV); modulates tune (additive offset — ±1 CV sweeps the full range, centered on the knob)
cutoff_cvcvCV that adds to the Cutoff knob — the classic patch point for an LFO or envelope filter-sweep.
control voltage (CV); modulates cutoff (additive offset — ±1 CV sweeps the full range, centered on the knob)
res_cvcvCV that adds to the Resonance knob, pushing the filter toward self-oscillating scream.
control voltage (CV); modulates resonance (additive offset — ±1 CV sweeps the full range, centered on the knob)
env_cvcvCV that adds to the EnvMod knob, controlling how hard the envelope drives the cutoff.
control voltage (CV); modulates envelope (additive offset — ±1 CV sweeps the full range, centered on the knob)
decay_cvcvCV that adds to the Decay knob, lengthening or shortening the filter-envelope sweep.
control voltage (CV); modulates decay (additive offset — ±1 CV sweeps the full range, centered on the knob)
accent_cvcvCV that adds to the Accent knob, scaling how strong an accented note's boost is.
control voltage (CV); modulates accent (additive offset — ±1 CV sweeps the full range, centered on the knob)
waveform_cvcvCV that adds to the Wave knob, morphing the oscillator between saw and square.
control voltage (CV); modulates waveform (additive offset — ±1 CV sweeps the full range, centered on the knob)

outputs

idcablewhat it does
audio_outaudioThe mono 303 voice — oscillator through the resonant filter and amp envelope. Patch into a distortion/overdrive for a dirtier acid line, or straight to a mixer.
audio signal

params

idlabelrangedefaultcurve
tuneTune-12..12st0linear
cutoffCutoff40..6000Hz1000log
resonanceReso0..10.5linear
envelopeEnvMod0..10.5linear
decayDecay50..3000ms600log
accentAccent0..10.5linear
waveformWave0..10linear

controls

controlwhat it does
AccentAccent amount (0..1): how much louder and brighter an accented note (one whose ACCENT gate is high) gets — 0 makes accents identical to normal notes, 1 is the full 303 accent boost.
CutoffThe filter corner frequency (40 Hz–6 kHz, log): the main timbre control. The 303 deliberately tops out around 6 kHz for its dark, focused voice; the filter envelope sweeps up from wherever you set this. The WHOLE travel is live — the bottom of the knob really does reach a 40 Hz corner, which with EnvMod low is a near-sub-audible thump.
DecayFILTER-envelope decay time (50 ms–3 s, log) — how fast the cutoff falls back after each note: short for tight blips, long for slow sweeps; the canonical 303 range sits around 200 ms–2 s, extended here into doom-y territory. Like the hardware DECAY knob it shapes the TIMBRE, not the note's length — the note lasts as long as you hold the GATE.
EnvModEnv-mod depth (0..1): how far the filter envelope pushes the cutoff up on each note — 0 is a static filter, high values give the dramatic per-note sweep.
ResoFilter resonance/emphasis (0..1): low for a round bass, high for the whistling 303 squelch that nearly self-oscillates.
Treeohvox gate {n}HOLD to play a note with nothing patched in — it is exactly the GATE input held high, so the note starts when you press, lasts as long as you hold, and ends when you let go, and a real patched gate keeps working alongside it. Without a gate source this voice makes no sound at all, so this is how you hear what the seven knobs are doing before you patch anything. The pitch is whatever PITCH is fed (0 V, i.e. the base note, when nothing is patched), offset by TUNE.
TuneCoarse tune in semitones (-12 to +12), added to the 1V/oct pitch input — for transposing the line or tuning to a track.
WaveMorphs the oscillator from saw (0, the classic 303 voice) to square (1) and every blend between. The morph is monotone — the fundamental only ever gets stronger as you turn it up — so there is no dead spot or octave jump anywhere in the travel.

source

treeohvox.ts on GitHub.

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