@maruaudio/dsp/reverbs/griesinger is Émilie Gillet's Griesinger stereo reverb from Rings and Clouds as the CHOMPI firmware ships it. Four input allpass diffusers feed a figure-eight loop of two arms (two allpasses, a one-pole lowpass and a LFO-modulated long delay each), all inside one shared 32,768-word circular memory. Every operation follows the firmware's float32 order; each channel outputs in + (wet − in) × amount.
Parameters
All setters store Math.fround(value) with no clamp, as upstream.
| Setter | Role | Init |
|---|---|---|
setGriesingerReverbAmount | Dry/wet crossfade | 0 |
setGriesingerReverbInputGain | Gain on left + right before the diffusers | 0 |
setGriesingerReverbTime | Loop gain at each long-delay read | 0 |
setGriesingerReverbDiffusion | Coefficient shared by all eight allpasses | 0.625 |
setGriesingerReverbLowpass | Loop one-pole coefficient (1 is open) | 0.7 |
setGriesingerReverbFreeze | TEMPO freeze; inert unless init chose the freeze path | Off |
initGriesingerReverb(rate, format = GRIESINGER_FORMAT_16_BIT, withFreeze = false) picks 12-, 16- or 32-bit storage; the LFOs run at 0.5 and 0.3 Hz.
Lifecycle
initGriesingerReverb allocates the ring (upstream Init on a zeroed object) → setters → griesingerReverbTick(state, left, right, output) → resetGriesingerReverb or clearGriesingerReverb (upstream Clear, which keeps the LFOs and lowpass states) outside realtime. Live clearing uses clearGriesingerReverbStep, at most 256 stores per call, then finalizeGriesingerReverbClear. Ticks allocate nothing.
When to use it
Reproducing the CHOMPI, Rings or Clouds reverb exactly.
Limits
- Stereo out from a summed
left + rightinput. 16-bit storage truncatesacc × 32768toward zero (NaN → 0), clips to int16 and reads back × 0.0000305175. - With freeze on, time and lowpass are raised towards 1 and the input is gated.
- Delay lengths are fixed in samples; LFO rates follow the init rate. Amount 0 passes the input through exactly while the ring keeps running.