FREE 🔥 ODDDIST — Distortion, now completely FREE. Powered by ODD ENGINE. 🎛️

What it takes to keep a twelve second tail stable

Most of the work in a long reverb is not in making it sound good. It is in stopping a feedback loop that runs for twelve seconds from quietly destroying itself.

Energy that never leaves

A feedback delay network is a loop with a gain just under one. Anything that enters and is not filtered out stays for the length of the decay, going round and round.

The obvious version of that problem is instability. The subtle version is direct current: an offset near zero hertz that no one can hear, circulating with everything else and slowly biasing the whole tank. On a two second decay it never accumulates enough to matter. On twelve seconds it does, and the tail starts behaving oddly for reasons no listening test explains.

EvoraVerb runs a very slow lowpass on each line that tracks its mean level, and subtracts a small proportion of it — a coefficient of 0.0008, removing about 35 per cent. It is a DC blocker written to be gentle enough that the low end of the reverb survives intact.

Denormals

At the end of a long decay, sample values get extremely small. Below roughly 10-38, floating point numbers enter a subnormal range that x86 processors handle in microcode rather than in hardware.

The audible result is a plugin that behaves perfectly for eleven seconds and then spikes the CPU as the tail fades out, which is a genuinely confusing bug to be handed. The engine is wrapped in JUCE's ScopedNoDenormals and adds a tiny offset in the loop so values never fall into that range.

A limiter you should never hear

There is a soft clip in the feedback path, threshold 0.9, tanh above it.

Under any normal use it does nothing at all: reverb tails do not approach full scale. It exists for the corner case where a dense input meets a very long decay and the loop accumulates faster than the damping removes. Rather than let that run away, it saturates gently. It is a seatbelt, not a sound design choice.

Eight lines that fade differently

Each line has its own one-pole lowpass in the feedback path for high-frequency damping, and each is given a slightly different spectral tilt, between 0.90 and 1.10.

If all eight damp identically, the whole tank decays with a single timbre. It is subtle and it is exactly what makes a reverb sound synthetic: real rooms have surfaces that absorb differently, so different parts of the sound die at different rates. Detuning the damping by ten per cent per line reproduces that unevenness for almost nothing.

Changing a delay without a glissando

Moving the size control changes the length of all eight delay lines. Doing that naively — sliding the read pointer to its new position — drags the audio already stored in the buffer with it, and you hear a pitch sweep, the same mechanism as a tape machine changing speed.

The base delays therefore do not slide. They jump, with a 30 millisecond crossfade between the old and new read positions. Long enough not to click, short enough that the knob feels immediate.

Ramps, and no allocation

Every parameter is smoothed before it reaches the engine, with a time constant chosen for what that parameter does:

  • Decay, 250 ms, because it changes the loop gain
  • Size, 150 ms, because it alters the geometry the most
  • Modulation depth and width, 80 ms
  • Pre-delay and damping, 50 ms
  • Mix, 20 ms, so the gesture feels instant

The damping filter smooths its coefficient rather than its cutoff frequency, which avoids an exponential per sample while keeping the sweep free of steps.

And nothing is allocated while audio is running. Every buffer is reserved when the plugin is prepared, 285 milliseconds per line at 48 kHz. Allocating on the audio thread is the classic way to produce dropouts that only appear on someone else's machine.