shimmershine

shimmershine · effects

Stereo shimmer reverb. Schroeder-style tank (4 parallel comb filters with damped feedback + 2 series allpasses per channel) feeds a +12-semitone granular-fade pitch shifter; the shifted signal is summed back into the tank input (gain hard-capped at 0.55 to prevent runaway). Decay sets tank tail length, Shimmer the pitch-shifted feedback amount (0 = plain reverb, 1 = strong octave-up halo), Size the comb-feedback scale, Damp the in-loop high-frequency rolloff, Mix dry/wet. More processor-intensive than the plain Reverb module by design.

A stereo shimmer reverb: a plain Schroeder tank wired into an octave-up regeneration loop. Each channel gets its own tank — four parallel comb filters, each with a one-pole lowpass in its feedback path, then two series allpasses for diffusion (the first four of Freeverb's comb tunings and its first two allpasses — 1116/1188/1277/1356 and 556/441 samples at 44.1 kHz, rescaled to the running sample rate). What makes it SHIMMER is what happens to the tank's output: it is fed through a +12-semitone granular pitch shifter (two read heads chasing the write head at 2× speed, cosine-crossfaded over a 25 ms window to hide each wrap) and summed back into the tank input, so every trip round the loop transposes the tail up another octave and a held note grows a rising ladder of octaves above itself. Only the tank output is blended to the outs, so the shimmer never touches the direct sound — it emerges in the tail, tens of milliseconds behind the note. A 20 Hz DC blocker sits on the tank output, in the loop, so the regeneration can only recirculate audio: without it every stage in the loop passed 0 Hz at unity or better and the tail charged a DC offset instead of shimmering. The loop gain is hard-capped at 0.55 with a tanh saturator, which bounds the LEVEL but not the SUSTAIN: with SHIMMER off this is a modest room — a measured RT60 of about 0.45–1.3 s over the DECAY / SIZE plane at the default DAMP, stretching to ~1.55 s with DAMP at 0 and collapsing to ~0.15 s with DAMP full up — and once SHIMMER is high enough the loop stops decaying and settles into a continuous, level-bounded crystalline drone of stacked octaves. Where that tipping point sits depends on the tank: with the tank at its defaults it is around SHIMMER 0.75, it drops to about 0.15 with SIZE and DECAY up and DAMP at 0, and with SIZE at 0 it takes about 0.85 (DAMP at 1 kills the loop outright, so it never sustains). Below the tipping point the tail decays, all the way down: SHIMMER's own 0.4 default is a shimmering room, not a drone. Left and right run independent, identically-tuned tanks with no cross-feed, so it faithfully passes on the stereo image it is given rather than synthesising width. Patch it as a stereo insert and ride MIX, or feed it from an aux send with MIX at 1.

the faceplate

shimmershinein_laudioin_raudiodecay_cvcvshimmer_cvcvsize_cvcvmix_cvcvout_laudioout_raudioaudiocvgatepitch
6 inputs · 2 outputs · 5 params

inputs

idcablewhat it does
in_laudioLeft channel of the stereo input. It is summed with the loop’s pitch-shifted feedback and drives the LEFT reverb tank; left and right are separate, identically-tuned tanks that never cross-feed.
audio signal; L/R stereo pair with in_r — L-only auto-duplicates to R
in_raudioRight channel of the stereo input, driving the right-hand tank on the same signal path. If unpatched it is normalled from IN L, so a mono source patched to IN L alone drives both tanks and the halo comes back centred; patch both jacks to feed the tanks a true stereo image.
audio signal; L/R stereo pair with in_l
decay_cvcvCV that displaces the DECAY knob. Linear on a 0–1 param: ±1 moves it by up to ±0.5 and pins at the ends. The worklet’s params are k-rate, so this is sampled once per 128-sample render quantum (~2.7 ms at 48 kHz) — automate swelling and collapsing tails with it, not audio-rate modulation.
control voltage (CV); modulates decay (additive offset — ±1 CV sweeps the full range, centered on the knob)
shimmer_cvcvCV that displaces SHIMMER, the octave-up feedback amount (±1 = ±0.5 of the 0–1 range, block-rate). The expressive jack: an envelope here blooms the halo per note, and since the loop turns self-sustaining right around the 0.4 default (at the default tank settings — see SHIMMER), a slow LFO walks the tail in and out of a drone.
control voltage (CV); modulates shimmer (additive offset — ±1 CV sweeps the full range, centered on the knob)
size_cvcvCV that displaces SIZE, modulating the tank’s comb feedback — how long and dense the tail is, not how big the delay lines are (they are fixed), so sweeping it changes ring time without any pitch artifact. ±1 = ±0.5 of the 0–1 range, block-rate.
control voltage (CV); modulates size (additive offset — ±1 CV sweeps the full range, centered on the knob)
mix_cvcvCV that displaces MIX, the dry/wet crossfade (±1 = ±0.5 of the 0–1 range, block-rate) — patch an envelope or LFO for ducked or pumping wet swells. The tank and the shimmer loop keep running whatever MIX is doing, so the tail is already there when the CV brings the wet back up.
control voltage (CV); modulates mix (additive offset — ±1 CV sweeps the full range, centered on the knob)

outputs

idcablewhat it does
out_laudioLeft output: dry × (1 − MIX) + left-tank wet × MIX. The wet half is the TANK output, so the octave-up shimmer only reaches here after it has recirculated — the direct signal is never pitch-shifted. That tank output is tanh-limited and then DC-blocked at 20 Hz, so it carries no DC offset at all (measured under 0.1 % of RMS even at the runaway corner) and stays within a few percent of ±1 — the highpass transient can carry a hot onset to about 1.17 before it settles.
audio signal; L/R stereo pair with out_r
out_raudioRight output — the same blend computed on the right-hand tank, which keeps entirely separate comb, allpass and pitch-shifter state. The two sides never cross-feed and the two tanks are tuned identically, so the module adds no width of its own: the field that comes out is exactly as wide as the one you patched in.
audio signal; L/R stereo pair with out_l

params

idlabelrangedefaultcurve
decayDecay0..10.6linear
shimmerShimmer0..10.4linear
sizeSize0..10.6linear
dampDamp0..10.4linear
mixMix0..10.4linear

controls

controlwhat it does
DampHigh-frequency damping — a one-pole lowpass inside each comb’s feedback path, so every recirculation comes back a little darker than the last. That is what keeps the stacked octaves from turning brittle. At 0 the tail stays bright and rings longest; raising it both darkens and shortens the tail; at 1 the lowpass is fully closed (its state freezes at zero), which stops the comb feedback outright and collapses the reverb to a short diffuse burst (measured RT60 ≈ 0.15 s, whatever DECAY and SIZE are doing). The only control with no CV jack.
DecayStretches the tail. DECAY and SIZE multiply internally — the tank’s comb feedback is set by size × (0.5 + 0.5 × decay) — so this scales SIZE’s effect rather than setting an absolute time, and with SIZE at 0 it does nothing at all. With SHIMMER off, the whole DECAY / SIZE plane spans a measured RT60 of roughly 0.45–1.3 s at the default DAMP (0.55–1.55 s with DAMP at 0): it is a room control, not an infinite-reverb control (that is what SHIMMER is for).
MixThe dry/wet crossfade at the output: out = dry × (1 − mix) + wet × mix. 0 is the untouched input, 1 is wet only, in between is a straight linear blend. The tank and the shimmer loop run regardless of where MIX sits, so a tail — or a drone — you built at MIX 1 is still ringing when you bring the knob back up. Insert use lives around the 0.4 default; on an aux send put it at 1.
ShimmerThe module's signature: how much of the tank's output is transposed +1 octave and fed back into it. At 0 this is a plain Schroeder reverb. Turn it up and each recirculation stacks another octave, so a held note grows a rising crystalline ladder above itself. The loop gain is the knob × 0.55 with a tanh saturator and a 20 Hz DC blocker, so the LEVEL is always bounded and only audio can recirculate — but the sustain is not bounded: past a threshold the loop stops decaying and rings on as a continuous drone until you pull the knob back. With the tank at its defaults that threshold sits around 0.75 (measured on a 25 s tail: 0.7 has died to −148 dB, 0.8 is still ringing at −10 dB); it falls to about 0.15 with SIZE and DECAY up and DAMP at 0, and rises to about 0.85 with SIZE at 0 — with DAMP at 1 there is no loop left to sustain at all. The 0.4 default therefore sits well inside the decaying region: a bright shimmering room whose tail fades. Go to ~0.8 for the endless pad.
SizeSets the tank’s comb feedback — 0.70 with SIZE at 0, rising to 0.88 with SIZE and DECAY both wide open — which reads as a longer, denser, more sustained space. It does NOT resize the room: the comb and allpass delay lines are fixed at build time, so the tank’s timbre and modal colour stay put and only the ring time changes. Nothing is being re-tuned, so you can sweep it without the pitch artifact a real delay-length morph would give.

source

shimmershine.ts on GitHub.

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