snare drum
snaredrum · sourcesDeep, flexible stereo SNARE VOICE with a polyphonic two-hand DRUMROLL — the mate to KICK DRUM (own-code). Four decoupled acoustic layers the way a real snare works: a HEAD modal bank at inharmonic Bessel-zero ratios (1.0/1.03/1.593/2.135 — the pitchless membrane "thunk", self-ringing Chamberlin resonators struck by an impulse, with a downward pitch-drop at the strike), band-passed noise BODY around the head (TONE crossfades HEAD↔BODY), the SNARE-WIRE buzz — the defining sizzle — as bright HP-tunable noise on a SHARED re-excitable bed that breathes with the rectified head displacement AND rings out between strokes, and a short CRACK stick-contact transient. TWO strike inputs into one synth: trigger_in fires ONE hit per rising edge; gate_in runs the drumroll WHILE high. The roll is genuinely POLYPHONIC — two alternating hands 180° interleaved, each stroke (and each buzz sub-stroke) allocating its own voice from a 10-voice lowest-energy-steal pool while the shared wire bed sustains continuity, so overlapping decaying tails SUPERPOSE into a continuous roll (NOT a pulsed one-shot retrigger). ROLL SPEED sets 4–24 strokes/hand (+ roll_speed_cv at 1V/oct), BOUNCE morphs single-stroke → double/open → dense multi-bounce buzz/press roll (a coefficient-of-restitution bounce train, ≤6 sub-strokes, more as the hands slow), HUMANIZE adds seeded (deterministic) timing/velocity/detune jitter, and a hard per-second allocation budget routes excess buzz density into bed re-excitation only. The summed pool + bed run ONE shared bus: an oversampled DRIVE with a single HARD character switch (clean-warm tanh @2× vs aggressive wavefold+asym @4×), a 20 Hz DC block, and a per-channel true-peak CEILING soft-clip. Stereo: SPREAD pans the two hands (constant-power) + detunes them, WIDTH decorrelates only the bright wire sizzle; head/body stay centered so width=0 AND spread=0 → L==R exactly (mono-safe fold-down). Inputs: trigger_in (edge-trigger STRIKE), gate_in (edge-gate DRUMROLL), roll_speed_cv, accent_in (per-hit velocity + drive/level macro, latched at each strike), pitch_cv (1V/oct whole-voice transpose), choke_in (level-sensitive hand-on-head mute), PLUS a per-control CV input for each of the 21 remaining voice knobs (tune_cv … level_cv — each ±1 sweeps its param full-range around the live knob, cvScale matched to the knob curve), alongside the existing roll_speed_cv. Level −24..+12 dB, guarded by the ceiling. Wide 3u banded card: HEAD·BODY·WIRE / CRACK·ROLL·DRIVE / STEREO·OUT. Ships as a clean, punchy snare; hold a long gate for a continuous two-hand roll.
the faceplate
inputs
| id | cable | what it does |
|---|---|---|
trigger_in | gate | The STRIKE: each rising edge (crossing 0.5) fires exactly ONE snare hit — a voice is taken from the pool, its modal impulse and envelopes retrigger, the shared wire bed is re-excited, and accent is read at that instant. How long the signal stays high doesn't matter; it's a trigger, not a hold. A trigger hit is always CENTRED and un-detuned (SPREAD only moves the two roll hands), and consecutive hits into an idle pool reuse the same slot and its seed, so they are bit-identical. Patch a sequencer gate, drum-seq lane, or clock here for individual hits. gate / trigger; trigger — fires once per rising edge |
gate_in | gate | The DRUMROLL: WHILE this level is high, the internal two-hand roll engine generates a continuous roll at ROLL SPEED — two alternating hands whose overlapping strokes (and, in buzz mode, multi-bounce trains) keep the snare re-excited faster than it decays. The rising edge resets both hand phases and the jitter PRNG and fires an immediate left-hand stroke, so the roll starts with no initial gap and replays identically for a given gate; on the falling edge scheduling stops and the in-flight voices + wire bed ring out naturally. Hold a long gate here (a sequencer gate with a long gate length, a held clock, an LFO pulse) for a snare roll. gate / trigger; gate — acts while the level is high (reacts to both edges) |
roll_speed_cv | cv | Roll-rate CV — a 1V/oct multiply on ROLL SPEED (+1 V doubles the strokes/second, −1 V halves it; the input is clamped to ±4 V and the resulting rate to 1–40 strokes/s per hand), so you can crescendo a roll from a control source or sequence its density. This is the roll's own rate jack, read per sample straight off the input — not a per-control CV centred on the knob. control voltage (CV) |
accent_in | cv | Per-hit intensity CV (0..1) doing two things at once. At each strike (the trigger edge and every roll sub-stroke) the stroke velocity is multiplied by 1 + 0.5 × accent and clamped at 1 — a full-velocity primary stroke already sits at that ceiling, so the velocity term mostly lifts the quieter REBOUND strokes of a double/buzz roll — while continuously, per sample, accent also pushes DRIVE up to 30 % harder and LEVEL up to +4 dB, so an accented hit leans into the CEILING clip. Patch a velocity lane or an LFO for dynamics; at 0 it is a no-op. control voltage (CV) |
pitch_cv | cv | 1V/oct pitch input: transposes the whole voice — head modes and body noise together — as a true frequency multiplier (tune × 2^volts), so a snare line can track a melody or be tuned per step. It is read per sample, so an audio-rate signal here FMs the drum rather than merely transposing it. control voltage (CV) |
choke_in | gate | Choke group input (level-sensitive gate): WHILE the level is high the output is damped toward silence through a short ~30 ms ramp (a hand on the head), and on the falling edge it releases and recovers through a ~15 Hz one-pole — both edges matter. It multiplies both channels AFTER the ceiling, so a choked voice stays bounded. Hold it high to duck the snare's ring/roll; it does not fire hits. gate / trigger; gate — acts while the level is high (reacts to both edges) |
tune_cv | cv | CV modulation of TUNE (log): ±1 sweeps the head fundamental across its full 90–400 Hz range centred on the knob — the modes and body noise track it. (Distinct from pitch_cv, which transposes the whole voice at 1V/oct.) control voltage (CV); modulates tune (multiplicative ≈ octaves — ±1 CV spans the param’s log range) |
head_decay_cv | cv | CV modulation of HEAD DEC (log): ±1 sweeps the modal ring's decay across its full 30–600 ms range around the knob — dry tick to ringing head. control voltage (CV); modulates head_decay (multiplicative ≈ octaves — ±1 CV spans the param’s log range) |
damping_cv | cv | CV modulation of DAMP (linear): ±1 sweeps the head mode Q across its full 0–1 range around the knob — open and ringy to tight and muted. control voltage (CV); modulates damping (additive offset — ±1 CV sweeps the full range, centered on the knob) |
damp_cv | cv | CV modulation of GLOBAL DAMP (linear): ±1 sweeps the shared head/body/wire decay scaler across its full 0–1 range around the knob — a 'towel on the drum' under CV. control voltage (CV); modulates damp (additive offset — ±1 CV sweeps the full range, centered on the knob) |
pitch_amt_cv | cv | CV modulation of P AMT (linear): ±1 sweeps the strike pitch-drop depth across its full 0–12 st range around the knob — flatten or deepen the snare 'pit'. control voltage (CV); modulates pitch_amt (additive offset — ±1 CV sweeps the full range, centered on the knob) |
pitch_time_cv | cv | CV modulation of P TIME (log): ±1 sweeps the pitch-drop settle time across its full 3–80 ms range around the knob — quick chirp to falling attack. control voltage (CV); modulates pitch_time (multiplicative ≈ octaves — ±1 CV spans the param’s log range) |
tone_cv | cv | CV modulation of TONE (linear): ±1 sweeps the overall bright↔fat tilt across its full 0–1 range around the knob — wire-forward sizzle to head-forward body. control voltage (CV); modulates tone (additive offset — ±1 CV sweeps the full range, centered on the knob) |
body_decay_cv | cv | CV modulation of BODY DEC (log): ±1 sweeps the noise-body decay across its full 20–300 ms range around the knob. control voltage (CV); modulates body_decay (multiplicative ≈ octaves — ±1 CV spans the param’s log range) |
wire_cv | cv | CV modulation of WIRE (linear): ±1 sweeps the snare-wire buzz amount across its full 0–1 range around the knob — also driving how hard each strike re-excites the shared wire bed. control voltage (CV); modulates wire (additive offset — ±1 CV sweeps the full range, centered on the knob) |
wire_tone_cv | cv | CV modulation of W TONE (log): ±1 sweeps the wire high-pass corner across its full 1500–9000 Hz range around the knob — dark rattle to papery sizzle. control voltage (CV); modulates wire_tone (multiplicative ≈ octaves — ±1 CV spans the param’s log range) |
wire_decay_cv | cv | CV modulation of W DEC (log): ±1 sweeps the wire bed's sustain across its full 40–700 ms range around the knob — the roll's continuity control. control voltage (CV); modulates wire_decay (multiplicative ≈ octaves — ±1 CV spans the param’s log range) |
crack_cv | cv | CV modulation of CRACK (linear): ±1 sweeps the stick-transient level across its full 0–1 range around the knob — softer or snappier leading edge. control voltage (CV); modulates crack (additive offset — ±1 CV sweeps the full range, centered on the knob) |
crack_tone_cv | cv | CV modulation of CK TONE (log): ±1 sweeps the crack band-pass across its full 800–7000 Hz range around the knob — dark knock to bright snap. control voltage (CV); modulates crack_tone (multiplicative ≈ octaves — ±1 CV spans the param’s log range) |
bounce_cv | cv | CV modulation of BOUNCE (linear): ±1 sweeps the roll type across its full 0–1 range around the knob — single-stroke → double/open → dense multi-bounce buzz. control voltage (CV); modulates bounce (additive offset — ±1 CV sweeps the full range, centered on the knob) |
humanize_cv | cv | CV modulation of HUMANIZE (linear): ±1 sweeps the seeded roll jitter across its full 0–1 range around the knob — machine-perfect to loose and human (the detune share of that jitter is scaled by SPREAD). control voltage (CV); modulates humanize (additive offset — ±1 CV sweeps the full range, centered on the knob) |
drive_cv | cv | CV modulation of DRIVE (linear): ±1 sweeps the mid-bus saturation across its full 0–1 range around the knob — pump the perceived loudness live. control voltage (CV); modulates drive (additive offset — ±1 CV sweeps the full range, centered on the knob) |
hard_cv | cv | CV modulation of HARD (discrete): the CV is bucketed straight onto the switch by round-half-up, so the flip point sits exactly at CV = 0 — CV ≥ 0 (the midpoint itself included) selects the aggressive wavefold and only CV < 0 selects clean-warm tanh, whatever the knob says. The character switch under CV; only audible while Drive > 0. control voltage (CV); modulates hard (integer buckets — CV selects a discrete step) |
ceiling_cv | cv | CV modulation of CEILING (linear): ±1 sweeps how hard the bus is pushed into the true-peak soft-clip across its full 0–1 range around the knob — cleaner/quieter to hotter/more clipped. control voltage (CV); modulates ceiling (additive offset — ±1 CV sweeps the full range, centered on the knob) |
spread_cv | cv | CV modulation of SPREAD (linear): ±1 sweeps the two-hand pan/detune across its full 0–1 range around the knob — mono-centred to hard L/R hands. It shapes ROLLS only; a single trigger hit is centred whatever this reads. control voltage (CV); modulates spread (additive offset — ±1 CV sweeps the full range, centered on the knob) |
width_cv | cv | CV modulation of WIDTH (linear): ±1 sweeps the decorrelated wire-sizzle width across its full 0–1 range around the knob (head and body stay centred). control voltage (CV); modulates width (additive offset — ±1 CV sweeps the full range, centered on the knob) |
level_cv | cv | CV modulation of LEVEL (linear): ±1 sweeps the output gain across its full −24..+12 dB range around the knob — tremolo or dynamic swells. control voltage (CV); modulates level (additive offset — ±1 CV sweeps the full range, centered on the knob) |
outputs
| id | cable | what it does |
|---|---|---|
audio_l | audio | Left output of the stereo voice — the mid + side sum through the channel's own true-peak tanh ceiling (DRIVE and the DC blocker run on the MID only; the side rejoins here). The head, body and crack of a single centred hit are identical on both sides — only SPREAD (the two-hand roll pan) and WIDTH (the decorrelated wire sizzle) put content on the sides — so a mono fold-down never phase-cancels. Patch L alone for a mono snare; the pair auto-pairs when the target accepts it. audio signal; L/R stereo pair with audio_r |
audio_r | audio | Right output — the other half of the stereo pair, the mid − side difference through its own ceiling. Carries the same centred head/body/crack as the left; the two-hand roll and the bright wire band differ from L when SPREAD / WIDTH are up, and at Spread 0 with Width 0 the two channels are exactly equal. audio signal; L/R stereo pair with audio_l |
params
| id | label | range | default | curve |
|---|---|---|---|---|
tune | Tune | 90..400Hz | 180 | log |
tone | Tone | 0..1 | 0.5 | linear |
damping | Damp | 0..1 | 0.4 | linear |
head_decay | Head | 30..600ms | 180 | log |
body_decay | Body | 20..300ms | 110 | log |
pitch_amt | P Amt | 0..12st | 3 | linear |
pitch_time | P Time | 3..80ms | 18 | log |
wire | Wires | 0..1 | 0.7 | linear |
wire_tone | W Tone | 1500..9000Hz | 4500 | log |
wire_decay | W Dec | 40..700ms | 260 | log |
crack | Crack | 0..1 | 0.4 | linear |
crack_tone | Ck Tone | 800..7000Hz | 3200 | log |
damp | G Damp | 0..1 | 0.2 | linear |
roll_speed | Roll | 0..1 | 0.5 | linear |
bounce | Bounce | 0..1 | 0.35 | linear |
humanize | Human | 0..1 | 0.2 | linear |
spread | Spread | 0..1 | 0.5 | linear |
drive | Drive | 0..1 | 0.2 | linear |
hard | Hard | 0..1 | 0 | discrete |
ceiling | Ceiling | 0..1 | 0.5 | linear |
width | Width | 0..1 | 0.4 | linear |
level | Level | -24..12dB | 0 | linear |
controls
| control | what it does |
|---|---|
| Body | BODY: the noise-body decay to −60 dB (20–300 ms, log) — the length of the drum's noisy tone. Scaled shorter by Global Damp. |
| Bounce | ROLL type: below 0.05 it is a single-stroke roll (one stroke per hand-beat, granular); up to about 0.29 at the default ROLL SPEED it is the classic double/open roll (a primary stroke + one softer rebound); from 0.3 up — the 0.35 default included — a third sub-stroke joins; and → 1 it is a dense multi-bounce buzz / press roll (a bouncing-ball train of up to 6 sub-strokes with geometric decay). The count is set by the knob AND the hand rate together (slower hands add bounces to fill the wider gap), so the same setting reads differently at either end of ROLL SPEED: at the 24 Hz-per-hand top even Bounce 1.0 stays a plain double, while at 4 Hz per hand Bounce 0.6 already schedules four. |
| Ceiling | OUTPUT: how hard the voice is pushed into the per-channel true-peak soft-clip (0–1) — the gain into the clip tanh is 1 + 2 × ceiling. HIGHER = hotter: louder and more aggressively clipped/compressed; LOWER = cleaner and quieter with more headroom before the clip. The tanh always bounds each channel below full scale, so you can run Level hot regardless. |
| Crack | CRACK: level of the stick-contact transient (0–1) — a fixed ~6 ms band-passed noise tick, the leading edge the ear locks onto. It is summed ABOVE the head onset (outside the voice's normalization trim, with its own weight) so it always pokes through instead of being averaged away, and it scales with the stroke's velocity. More = a harder, snappier attack. |
| Ck Tone | CRACK: band-pass center of the stick transient (800–7000 Hz, log) — dark knock at the bottom, bright snap at the top. |
| G Damp | GLOBAL DAMP: scales the head, body and wire-bed decays DOWN together — ×(1 − 0.6 × damp), so at full every tail runs at 40 % of its set time — and, through the head's ring law, tightens the modal resonance with them. A single 'towel on the drum' choke that never touches the tuning. |
| Damp | HEAD: mode Q / ring character (0 = open and ringy, 1 = tight and muted) — the RELATIVE resonance of the modal bank, applied on top of the damping Head Dec sets, so the knob keeps its full range at any decay length. The (0,1) fundamental pair is damped hardest by design — that is what keeps the thunk pitchless while the upper inharmonic modes carry it. |
| Drive | DRIVE: saturation on the summed MID — the mono sum of the voice pool plus the wire bed (0–1); the stereo side signal bypasses it. It adds harmonics and perceived loudness at the same peak level. At 0 the shaper is bypassed outright (no oversampling cost); character is set by HARD, and both modes are oversampled (2× clean / 4× hard) so they stay clean. |
| Hard | DRIVE character switch: OFF = clean-warm tanh saturation, 2× oversampled (smooth, the shipping default); ON = a wavefolder + bounded asymmetric shaper, 4× oversampled and driven harder, with its fold depth riding the head displacement and the wire bed's energy so the bite follows the hit — gated/distorted snares. It only engages when DRIVE > 0 — at Drive = 0 the shaper is bypassed, so the switch has no effect until you add drive. One switch instead of a mode menu. |
| Head | HEAD: the modal ring's decay to −60 dB (30–600 ms, log). It drives the amp envelope AND the resonators' damping — a longer setting lowers their loss so the modes really do ring that long (at short settings the bank self-terminates and the envelope does the work). Short = a dry tick; long = a ringing, resonant head. Scaled shorter by Global Damp. |
| Human | ROLL: seeded (deterministic) jitter on stroke timing (±8 % of the hand period), stroke velocity (±15 %) and per-hand detune (±1.5 semitones) — 0 = machine-perfect, 1 = loose and human. The detune share is scaled by SPREAD, so at Spread 0 the hands stay in tune with each other. The generator reseeds on every roll-gate rising edge, so the same roll replays identically — the constantly-shifting sizzle of a real roll without ever using wall-clock randomness. |
| Level | OUTPUT: output level in dB (−24..+12), applied to mid and side alike BEFORE the ceiling, so hot settings lean into the clip instead of escaping it (an ACCENT adds up to a further +4 dB). The +12 dB of makeup headroom is deliberate — the ceiling stage keeps a hot setting true-peak-safe. |
| P Amt | HEAD: depth of the downward pitch-drop at the strike, in semitones (0–12) — the snare 'pit'. The voice starts this far ABOVE its settled pitch and falls, bending the four modes AND the noise body's centre together so the whole attack chirps. 0 = static pitch; higher = a more pronounced pitched-down attack. |
| P Time | HEAD: how fast the pitch-drop settles (3–80 ms, log). Short = a quick chirp; long = an audible falling attack. |
| Roll | ROLL: strokes per hand while the roll GATE is held (0 → 4 Hz, 1 → 24 Hz, exponential; the hands interleave 180° apart, so the composite sticking rate is ≈ 2×). Below ~15–20 Hz composite the individual strokes are audible (a machine-gun/open roll); above it they fuse into a roar. roll_speed_cv multiplies this at 1V/oct and the result is clamped to 1–40 Hz per hand. |
| Snaredrum hit {n} | AUDITION — HIT: one press fires exactly ONE snare hit, identical to a rising edge on trigger_in. It is a button, not a knob: nothing is stored, nothing is shared with the rackspace, and it drives the same worklet input a cable does, so a sequencer patched into trigger_in keeps working while you use it. Its purpose is that this voice makes NO sound until something strikes it — without the pad the dock offers twenty-two controls over a drum you cannot hear. A hit from here is always centred and un-detuned, exactly like a hit from the jack. |
| Snaredrum roll {n} | AUDITION — ROLL: a MOMENTARY pad. WHILE you hold it the internal two-hand roll engine runs, exactly as it does while gate_in is high, and it stops the instant you let go. Hold-to-roll rather than click-to-roll is not a UI preference: gate_in is declared edge:'gate', the roll exists only for as long as the level stays high, and a roll you could not hold would be a different instrument. Press it with ROLL SPEED and BOUNCE under your other hand — that is the whole reason those two rank into the lane. Like HIT it writes nothing to the graph, and the gate is force-closed if the pane is closed or the window loses focus mid-hold, so a held roll can never be left running. |
| Spread | ROLL/STEREO: two-hand pan + per-hand detune (0 = mono/centred, 1 = hard L/R hands, each detuned ¾ of a semitone off centre in opposite directions). The drum voices pan properly — the left hand's stroke goes left, the right hand's right, each striking a slightly different spot on the membrane — and the loud wire bed's placement slews (~5 ms per stroke) so the sizzle ping-pongs with the sticking rather than sitting still: a genuine stereo roll image, not a decorrelation trick. Voice and sizzle share ONE constant-power pan, so a stroke arrives as a single coherent hand — body and buzz on the same side — and turning WIRE up widens that image instead of splitting it. (It used to split: the bed's pan term was summed with the sign opposite the voices', which threw a left-hand stroke's sizzle right. Fixed in #1293.) It is a ROLL control either way: a single trigger hit is always dead-centre, so Spread does nothing until the roll gate runs. |
| Tone | Overall tonal TILT of the drum (0 = bright, wire/noise-forward sizzle; 1 = fat, head/body-forward). Two things move in opposition: the tonal VOICE's gain rides 0.6→1.4 while the bright wire BED's rides 1.4→0.6, and inside the voice the head modes crossfade with the body noise (the crack tick rides with the voice, not against it). 0.5 leaves both gains at unity — the everyday balance and the shipped default. |
| Tune | HEAD: the snare's fundamental pitch (90–400 Hz, log). The four inharmonic modes track it at their Bessel ratios, and the body noise centres on it. Low = deep/fat snare, high = tight/piccolo. Tracks pitch_cv at 1V/oct. |
| Width | STEREO: M/S width of the decorrelated wire SIZZLE only (0–1). The bed is generated as two independent noise streams and this sets how much of their difference reaches the sides; head, body and crack stay centred/mono-safe. 0 = a mono wire (combine with Spread = 0 for an exactly mono voice, L == R). |
| Wires | WIRE: snare-wire buzz amount (0–1) — the defining sizzle. It sets both the wire level AND how hard every strike tops up the shared wire bed (bed += wire × velocity, clamped at full), so it is the master of a roll's continuous sustain. 0 = a wireless, tom-like drum. |
| W Dec | WIRE: the wire bed's decay to −60 dB (40–700 ms, log) — the sustain of the buzz between strokes. This is what makes a roll continuous: set longer than the stroke interval and the bed never returns to silence mid-roll. Scaled shorter by Global Damp. |
| W Tone | WIRE: the high-pass corner of the wire noise (1500–9000 Hz, log). Lower = a darker, fuller rattle; higher = a bright, papery sizzle that sits on top of the mix. |
source
snaredrum.ts on GitHub.