rings

rings · sources

Modal / sympathetic-string resonator (Mutable Instruments Rings archetype). Faithful TypeScript port of the eurorack/rings/ DSP (MIT-licensed). v1 ships two resonator models: (0) MODAL — bank of 24 parallel stiffness-stretched RBJ bandpasses with cosine-weighted Odd/Even pickup taps; (1) SYMPATHETIC — 2 parallel Karplus-Strong delay lines with one-pole damping. STRUCTURE/BRIGHTNESS/DAMPING/POSITION are the canonical Rings knobs; LEVEL is a soft-limited output gain. EXCITER in drives both engines; STRUM rising edge re-ignites a ~10ms noise burst (KS) or impulse (modal). Outputs odd / even — patch both for stereo. Polyphony 1; STRING+REVERB deferred.

A modal / string RESONATOR — a faithful port of Mutable Instruments Rings. It doesn't make a tone on its own: it RESONATES an exciter into pitched, decaying string and bell voices. Feed it an audio exciter on IN (a noise burst, a click, a drum, anything percussive works best) and it rings that energy out at the pitch set by PITCH; with nothing patched into IN, the STRUM input self-excites it with a short internal noise burst so it still sounds when you pluck it. MODEL switches the resonator type: MODAL is a bank of 24 stiffness-stretched resonant bandpass filters (harmonic at STRUCTURE 0, growing inharmonic and bell-like as STRUCTURE rises), and SYMPATHETIC is a pair of Karplus–Strong plucked strings whose detuning STRUCTURE sets. STRUCTURE/BRIGHTNESS/DAMPING/POSITION are the canonical Rings macros that sculpt the resonance — inharmonicity, high-end content, ring time, and pickup placement — and LEVEL is a soft-limited (tanh) output gain. The two outputs ODD and EVEN are complementary taps of the same resonator; patch both for a wide pseudo-stereo image, or just ODD for mono.

the faceplate

ringsinaudiopitchpitchstrumgatemodel_cvcvnote_cvcvstr_cvcvbright_cvcvdamp_cvcvpos_cvcvlevel_cvcvoddaudioevenaudioaudiocvgatepitch
10 inputs · 2 outputs · 7 params

inputs

idcablewhat it does
inaudioThe audio EXCITER — the energy the resonator rings out. Patch a percussive, broadband signal here (a noise burst, an impulse/click, a drum hit, even another oscillator) and the body resonates it into pitched string/modal voices; sustained input keeps it continuously excited (a bowed/blown character). When nothing is patched here the resonator is silent until struck, so use STRUM (or an external exciter) to make it sound.
audio signal
pitchpitch1V/oct pitch. Sets the fundamental the resonator is tuned to (1 unit = 1 octave, 0 V = middle C); it sums with the NOTE offset before the body is configured. Sweeping it retunes every partial / both strings together.
V/oct pitch CV
strumgateA TRIGGER: each rising edge re-ignites the resonator with a short (~10 ms) internal noise burst, plucking/striking it once per pulse — like physically strumming the strings. It fires on the edge only and ignores how long the level stays high, so any clock, gate, or button pulse re-strikes it. STRUM works even with nothing patched into IN, making the module a self-contained plucked voice.
gate / trigger; trigger — fires once per rising edge
model_cvcvCV into the MODEL selector (discrete): it displaces the resonator-model choice, jumping between MODAL (0) and SYMPATHETIC (1) — e.g. a gate or step CV can switch resonator type mid-patch.
control voltage (CV); modulates model (integer buckets — CV selects a discrete step)
note_cvcvCV into the NOTE offset: it displaces the semitone offset that sums with PITCH (NOTE spans ±60 st), so an envelope or LFO here bends the tuning around the V/oct fundamental.
control voltage (CV); modulates note (additive offset — ±1 CV sweeps the full range, centered on the knob)
str_cvcvCV into STRUCTURE (0..1): it displaces the inharmonicity/structure macro — sweeping the modal partials from harmonic toward bell-like, or detuning the sympathetic string pair.
control voltage (CV); modulates structure (additive offset — ±1 CV sweeps the full range, centered on the knob)
bright_cvcvCV into BRIGHTNESS (0..1): it displaces the high-end character of the resonance, opening or closing the brightness of the rung partials.
control voltage (CV); modulates brightness (additive offset — ±1 CV sweeps the full range, centered on the knob)
damp_cvcvCV into DAMPING (0..1): it displaces the ring time — low values resonate long, high values damp the partials quickly (a useful target for an envelope to shape per-note decay).
control voltage (CV); modulates damping (additive offset — ±1 CV sweeps the full range, centered on the knob)
pos_cvcvCV into POSITION (0..1): it displaces the pickup position along the resonator, changing which partials are emphasized and shifting the ODD/EVEN balance.
control voltage (CV); modulates position (additive offset — ±1 CV sweeps the full range, centered on the knob)
level_cvcvCV into LEVEL (0..1): it displaces the soft-limited output gain, letting an envelope or LFO swell or duck the output.
control voltage (CV); modulates level (additive offset — ±1 CV sweeps the full range, centered on the knob)

outputs

idcablewhat it does
oddaudioOne of the resonator's two complementary output taps (the cosine-weighted ODD-indexed partial sum in MODAL, the bridge tap of the string pair in SYMPATHETIC), passed through a tanh soft-limiter. Use it alone for a mono resonator output, or pair it with EVEN.
audio signal; L/R stereo pair with even
evenaudioThe companion tap to ODD — the EVEN-indexed partial sum in MODAL, a second pickup read further along the string in SYMPATHETIC — also tanh soft-limited. ODD and EVEN carry different content from the same resonator, so patching both into a stereo bus gives a wide pseudo-stereo image; summing them back to mono recombines the body. In MODAL, POSITION 0.25 and 0.75 sit exactly on a pickup NODE for every odd-indexed partial, so EVEN falls silent there while ODD stays full — that null is real resonator behaviour (it is where the pickup lands on a mode's standing-wave zero), not a fault; nudge POSITION off the quarter-marks to bring EVEN back.
audio signal; L/R stereo pair with odd

params

idlabelrangedefaultcurve
modelModel0..?0discrete
noteNote-60..60st0linear
structureStructure0..10.25linear
brightnessBrightness0..10.5linear
dampingDamping0..10.5linear
positionPosition0..10.5linear
levelLevel0..10.8linear

controls

controlwhat it does
BrightnessA TONE CONTROL THAT IS ALSO A DECAY CONTROL, and the second one is the bigger effect. Spectrally it does what the name says (0..1): at 0 the 24-partial bank collapses to essentially one sine (h3 measured 110 dB below h1), at 0.5 the upper partials are present and tapering, and at 1 the fundamental is the QUIETEST partial in the bank — h3 through h9 sit 9-20 dB above it. But `qLoss` is a CUMULATIVE per-partial Q taper, so raising it lengthens the whole bank's ring: at a FIXED DAMPING of 0.5 the measured T60 runs 293 ms at BRIGHTNESS 0 to 7420 ms at BRIGHTNESS 1, a 25x move on a knob nothing previously described as a decay control. If a patch rings for longer than you expect, check this before DAMPING. In SYMPATHETIC it opens the brightness shaper on each string's input instead. ⚠ The absolute ring time also depends on the INTERFACE SAMPLE RATE (measured 3889 / 7420 / 476 ms at 44.1 / 48 / 96 kHz at BRIGHTNESS 1) because MODAL's decay constant is q/(pi*sampleRate) with no compensating term — a known DSP defect, not a property of this control.
DampingSets the ring/decay time (0..1) across roughly three decades: low DAMPING resonates long (in MODAL a struck-bar tail measured in seconds; in SYMPATHETIC a near-lossless string loop), high DAMPING damps the energy quickly for a short, plucky decay of a few tens of milliseconds. In MODAL the partial Q is set proportional to partial frequency, so the whole bank decays together rather than the top of the spectrum dying first. A natural target for an envelope to vary decay per note.
LevelOutput gain (0..1) on both ODD and EVEN. There IS a tanh on the output, but in normal use it is a LINEAR GAIN: measured against a linear extrapolation from LEVEL 0.2, the compression is 0.024 dB at 0.5, 0.068 dB at 0.8 and 0.107 dB at 1.0, with a peak of 0.415 at full — nowhere near the knee. A sustained external exciter does not change that (white noise at 0.3 into IN peaks at 0.288 with LEVEL at 1). So do not reach for this expecting saturation or limiting; it will not protect a downstream stage from a hot exciter, and it does not add character at any setting the module can reach on its own.
ModelThe resonator MODEL selector (the on-card button cycles it): MODAL (0) is a 24-partial stiffness-stretched resonant bandpass bank — a struck bar / bell / metal character — and SYMPATHETIC (1) is a pair of Karplus–Strong plucked strings detuned by STRUCTURE. The other macros mean the same thing in both models but the timbre changes substantially between them.
NoteA fixed semitone offset (-60..+60 st) added on top of the PITCH input, so you can tune the resonator without an external pitch source or transpose it relative to one. At 0 the resonator tracks PITCH (or middle C with PITCH unpatched).
PositionThe pickup position along the resonator (0..1). In MODAL it is the classic Rings cosine pickup — partial n is weighted by cos(2*PI*POSITION*n) — so sweeping it moves a comb of emphasis and nulls across the bank and continuously rebalances ODD against EVEN (at 0.25 and 0.75 every odd-indexed partial sits on a node and EVEN goes silent, which is the pickup landing on a standing-wave zero). ⚠ HALF THIS DIAL IS A DUPLICATE OF THE OTHER HALF: because cos(2*PI*(1-p)*n) = cos(2*PI*p*n), POSITION p and 1-p are the SAME filter bank — measured bit-identical (max|delta| 0.000e+0) at 0.00/1.00, 0.25/0.75 and 0.30/0.70 — so moving from 0.5 to 1.0 retraces 0.5 to 0.0 backwards. And the shipped default of 0.5 is a MAXIMUM of the comb rather than a midpoint: every |weight| is 1 there, exactly as at POSITION 0, and the two differ only in the sign of the EVEN tap (measured max|even(0) + even(0.5)| = 0.000e+0, an exact polarity inverse). In SYMPATHETIC it places the second pickup along the string that feeds EVEN, and biases the strike formant of the internal pluck.
Rings comb {n}THE PICKUP COMB — the faceplate's picture of the partial bank, and the one thing about this module that a number cannot say. It draws all 24 MODAL partials at their STRUCTURE-stretched frequencies on a log axis, each bar's height the product of its band-pass gain and its cos(2*PI*POSITION*n) pickup weight, coloured by which output tap it lands in: ODD holds the odd-numbered harmonics, EVEN the even-numbered ones. Under it runs the POSITION dial's whole travel, which is MIRROR-SYMMETRIC about 0.5 — that symmetry is why half the dial is a duplicate, and the two quarter-marks where the EVEN curve touches zero are where the EVEN output falls silent. Read-only: it draws the bank, it does not set it.
Rings strum {n}STRUM — strike the resonator once, from the panel. RINGS makes no sound of its own (measured peak exactly 0.000e+0 on both taps with nothing patched and nothing struck), so this is how you hear it without wiring an exciter first. It fires the same short internal noise burst a rising edge on the STRUM input fires, through a host-side trigger source summed into that input — so it works whether or not a cable is patched there, and it writes nothing to the patch: nothing is persisted, synced or undoable.
StructureThe inharmonicity / structure macro (0..1): in MODAL it stretches the partial spacing from harmonic (0) toward bell-/metal-like (1); in SYMPATHETIC it detunes the second string from unison (0) up to about +19 semitones. The single biggest control over how 'tuned' versus 'clangy' the resonance sounds.

source

rings.ts on GitHub.

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