rings
rings · sources · schema v1Modal / 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.
the faceplate
10 inputs · 2 outputs · 7 params
inputs
| id | cable | what it does |
|---|---|---|
in | audio | The 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 |
pitch | pitch | 1V/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 |
strum | gate | A 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 |
model_cv | cv | CV 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_cv | cv | CV 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_cv | cv | CV 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_cv | cv | CV 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_cv | cv | CV 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_cv | cv | CV 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_cv | cv | CV 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
| id | cable | what it does |
|---|---|---|
odd | audio | One of the resonator's two complementary output taps (the cosine-weighted ODD-indexed partial sum in MODAL, the position-crossfaded string mix 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 |
even | audio | The companion tap to ODD — the EVEN-indexed partial sum / opposite string-mix, also tanh soft-limited. ODD and EVEN carry different partial 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. audio signal; L/R stereo pair with odd |
params
| id | label | range | default | curve |
|---|---|---|---|---|
model | Model | 0..? | 0 | discrete |
note | Note | -60..60st | 0 | linear |
structure | Structure | 0..1 | 0.25 | linear |
brightness | Brightness | 0..1 | 0.5 | linear |
damping | Damping | 0..1 | 0.5 | linear |
position | Position | 0..1 | 0.5 | linear |
level | Level | 0..1 | 0.8 | linear |
controls
| control | what it does |
|---|---|
| Brightness | Sculpts the high-frequency content of the resonance (0..1): low values are dark and muted, high values let the upper partials sing through. In SYMPATHETIC it also opens the brightness shaper on each string's input. |
| Damping | Sets the ring/decay time (0..1): low DAMPING resonates long (high Q in MODAL, a near-lossless string loop in SYMPATHETIC), high DAMPING damps the energy quickly for a short, plucky decay. A natural target for an envelope to vary decay per note. |
| Level | Output gain (0..1) feeding a tanh soft-limiter, so pushing it adds gentle saturation rather than hard clipping. Sets the overall loudness of both ODD and EVEN. |
| Model | The 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. |
| Note | A 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). |
| Position | The pickup position along the resonator (0..1): it changes which partials are emphasized via a cosine-weighted tap, and because it weights the ODD and EVEN sums differently it also shifts the balance and stereo image between the two outputs. |
| Structure | The 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.