tom drum
tomtom · sourcesAnalog-modeled TOM DRUM voice — the third member of the drum family (KICK DRUM / SNARE DRUM), at deliberately CURATED complexity: one synthesis engine, seven voice knobs + level, spanning the classic analog tom lineage in one continuous space (808-woody bridged-T ring, 909-punchy swept osc + overtone, Simmons SDS-V "piuuu" dive-bomb, deep floor tom). DSP (own-code, packages/dsp/src/lib/tomtom-dsp.ts): a MEMBRANE fundamental (Tune 60–400 Hz) plus the inharmonic 1.593× Bessel second mode (TONE tilts fundamental ↔ overtone, with its own faster decay) riding ONE exponential pitch-BEND envelope (Bend 0–24 st depth — 0 = stable pitch, 24 = a two-octave zap; B Time 10–300 ms), a band-passed BREATH noise layer tracking ~2.5× the settled pitch (NOISE balances membrane ↔ breath, the SDS-V tone/noise mix law — 808 breath at low settings, full Simmons noise hit at the top), a 2×-oversampled warm-tanh DRIVE, 20 Hz DC block, dB LEVEL, and a true-peak tanh bound (|out| < 1 always). DECAY (40–1500 ms) is FREQUENCY-COMPENSATED: the −60 dB ring time is set in ms regardless of Tune, so a 60 Hz floor tom and a 400 Hz timbale ring equally long at the same knob. Inputs: trigger_in (edge-trigger STRIKE — phases reset, envelopes fire), accent_in (per-hit 0..1 CV latched at the strike edge: up to +80 % velocity AND +50 % bend depth, like a harder stick), pitch_cv (1V/oct whole-voice transpose incl. the breath band), bend_cv (±24 st/V into Bend — full-swing), decay_cv (2 oct of decay TIME per volt), tone_cv / noise_cv (sum into the balances). A per-knob CV now covers EVERY continuous control: tune_cv (2 oct/V on the TUNE knob — distinct from the whole-voice pitch_cv), bend_time_cv (2 oct of sweep-settle time/V), drive_cv (sums into DRIVE), and level_cv (±18 dB/V — the full 36 dB range centered on the knob). Each law is scaled in the shared core so cv = 0 is a perfect no-op. Output: ONE mono audio_out. Card: compact MEMBRANE·COLOR·OUT fader band + a press-to-fire STRIKE pad (the `strike` param, OR-ed with trigger_in in the worklet — one hit per press edge); the rear patch panel groups its jacks into MEMBRANE·COLOR·OUT·TRIG/OUT sections mirroring the card headers. Control set modeled on the Vermona DRM1 tom channel (tune / bend / decay / noise / drive).
the faceplate
inputs
| id | cable | what it does |
|---|---|---|
trigger_in | gate | The STRIKE: each rising edge fires one tom hit — oscillator phases reset (click-free and deterministic), every envelope retriggers, and the accent input is sampled at that instant. How long the signal stays high doesn't matter; it's a trigger, not a hold. Patch a sequencer gate, drum-seq lane, or clock here. gate / trigger; trigger — fires once per rising edge |
accent_in | cv | Per-hit intensity CV (0..1), LATCHED at the strike edge only — between hits it's ignored, so an LFO here gives every hit its own velocity. An accented hit lands hotter (up to +80 % velocity ≈ +5 dB, applied BEFORE the drive stage, so a harder hit also saturates and leans into the output bound a little harder — it compresses musically instead of just getting loud), bends deeper (up to +50 % sweep depth), AND starts brighter (up to 2× overtone and breath excitation — impact nonlinearity) — the three things a harder stick does to a real head. control voltage (CV) |
pitch_cv | cv | 1V/oct pitch input: transposes the whole voice — fundamental, 1.593× overtone, and the breath band together — as a true frequency multiplier (tune × 2^volts) applied ON TOP of the TUNE knob and NOT clamped back into the knob's 60–400 Hz window, so melodic tom lines track across octaves (the oscillators stop short of Nyquist and the breath centre still stops at its 300 Hz / 6 kHz limits). Patch a sequencer pitch output here for tuned toms. control voltage (CV) |
bend_cv | cv | Bend-depth CV: ±1 V adds ±24 semitones to the BEND knob (summed, clamped 0–36 st — a full ±1 V swing covers the knob's whole range, per the house CV full-swing rule). Sequence it to alternate woody flat hits with Simmons-style dive-bombs from the same voice. control voltage (CV) |
decay_cv | cv | Decay-time CV: 2 octaves of TIME per volt — +1 V = ×4 decay, −1 V = ×¼ (clamped 20 ms – 3 s), so ±1 V spans close to the knob's full 40–1500 ms range. Ride it with an envelope or sequencer step to open the tom up on fills. control voltage (CV) |
tone_cv | cv | Overtone-mix CV: sums into TONE (clamped 0–1). More voltage = more of the 1.593× second membrane mode — brighter, more 'struck', more 909. control voltage (CV) |
noise_cv | cv | Breath-mix CV: sums into NOISE (clamped 0–1). More voltage = more of the band-passed skin noise over the attack — more stick, more air. control voltage (CV) |
tune_cv | cv | CV on the TUNE KNOB at 2 octaves/volt (+1 V = ×4, −1 V = ×¼), CLAMPED straight back into the knob's own 60–400 Hz window — that clamp, and the steeper 2 oct/V law, are what make it different from pitch_cv: this input can never take the drum out of its natural register, while pitch_cv is an unclamped 1 V/oct transpose laid on top. Both move the whole voice (the 1.593× overtone and the breath band follow the fundamental either way). cv = 0 is a perfect no-op; sequence it for melodic tom lines that stay inside the tom's range. control voltage (CV) |
bend_time_cv | cv | Bend-TIME CV: 2 octaves of sweep-settle time per volt (+1 V = ×4, −1 V = ×¼, clamped 5–600 ms), riding the B Time knob independently of DECAY. Ride it to turn a tick-of-attack pitch into an audible 'piuuu' without touching the ring length. control voltage (CV) |
drive_cv | cv | Drive CV: sums into DRIVE (clamped 0–1) — a ±1 V swing covers the whole 0–1 warmth range on top of the knob, so an envelope here fattens the hit as it lands (2×-oversampled warm-tanh saturation). control voltage (CV) |
level_cv | cv | Output-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), so a ±1 V LFO or envelope covers the whole level travel. cv = 0 is a no-op. control voltage (CV) |
outputs
| id | cable | what it does |
|---|---|---|
audio_out | audio | The mono tom voice: membrane (fundamental + 1.593× overtone) plus breath noise, through DRIVE, a 20 Hz DC block, LEVEL and the final true-peak bound (|out| < 1 always, so it patches hot safely). One tom = one mono source — spread multiple TOM DRUMs across a mixer's pan field for the classic multi-tom fill. audio signal |
params
| id | label | range | default | curve |
|---|---|---|---|---|
tune | Tune | 60..400Hz | 110 | log |
bend_amt | Bend | 0..24st | 7 | linear |
bend_time | B Time | 10..300ms | 60 | log |
decay | Decay | 40..1500ms | 350 | log |
tone | Tone | 0..1 | 0.35 | linear |
noise | Noise | 0..1 | 0.25 | linear |
drive | Drive | 0..1 | 0.25 | linear |
level | Level | -24..12dB | 0 | linear |
strike | Strike | 0..1 | 0 | discrete |
controls
| control | what it does |
|---|---|
| Bend | Strike pitch-sweep depth in semitones (0–24) — the synth-tom identity. 0 = a perfectly stable pitch (pure resonator ring); 2–4 st = the 808's subtle relaxation; 6–10 st = 909 punch; 24 st = a two-octave Simmons dive-bomb. Accent deepens it up to +50 %; bend_cv adds ±24 st per volt on top (the sum clamps at 36 st). |
| B Time | How fast the sweep settles, as a −60 dB time (10–300 ms, log). Short = a tick of attack pitch; long + deep = the audible 'piuuu'. Independent of DECAY, so a short zap can ride a long ring or vice versa. |
| Decay | The −60 dB ring time (40–1500 ms, log), FREQUENCY-COMPENSATED: the knob means milliseconds at every TUNE, so retuning never shortens the tail. 90 ms = tight and dry, 350 = the shipped default, 1+ s = a singing floor tom. It also sets the two derived envelopes — the overtone rings 0.6× as long, the breath 0.5× (held between 25 and 500 ms) — and decay_cv scales it ×4 / ÷4 per volt. |
| Drive | Analog warmth (0–1): a 2×-oversampled warm tanh soft-clip on the summed voice, its pre-gain rising from 1× to 4×. At 0 the stage is bypassed outright; up, it fattens harmonics and perceived loudness at the same peak — the tom leans into the output bound instead of clipping. |
| Level | Output level in dB (−24..+12), applied after the DC block and before the final true-peak tanh bound, so a hot Level saturates musically rather than clipping the rack. |
| Noise | Membrane ↔ breath balance (0–1): seeded noise through a band-pass centred 2.5× above the settled pitch (floored at 300 Hz, so below roughly 120 Hz TUNE it stops tracking the drum), riding a decay of half the effective DECAY held between 25 and 500 ms — shorter than the drum's own tail at every knob position (the 40 ms DECAY floor still gives a 25 ms breath), though a strongly negative decay_cv can drive the membrane under 25 ms and leave the breath the longer of the two. The SDS-V tone/noise mix law: 0 = pure membrane; full up the breath dominates and the membrane sits back at 30 %, never silent. noise_cv sums in. |
| Strike | The manual STRIKE pad: press to fire exactly one hit — the pad's rising edge IS the strike, so holding it does not retrigger. Handy for auditioning the voice with nothing patched. It is OR-ed with trigger_in, which means that while you hold it the combined trigger stays high and incoming trigger edges are masked until you let go; released, it sits at 0 and is a no-op. The pad is sampled once per audio block, so a press lands on the next block boundary rather than the exact sample. |
| Tone | Membrane tilt: fundamental ↔ the inharmonic 1.593× second mode (0–1). The overtone has its own faster decay (higher modes damp harder) and coming up it ducks the fundamental to as little as 40 %, so the knob sweeps woody-pure → bright/metallic 'struck' — a tilt, not just more level. tone_cv sums in. |
| Tune | The settled fundamental (60–400 Hz, log). 60–90 Hz = floor tom, ~110 = the classic mid tom default, 200+ = high rack tom into timbale territory. The 1.593× overtone and the breath band track it; tune_cv rides this knob (2 oct/V, clamped back into 60–400 Hz) and pitch_cv transposes the result at 1 V/oct. |
source
tomtom.ts on GitHub.