plate.h
The Dattorro plate.
#include <sonore/plate.h>- 1type
- Guides: Getting started, MIDI and MPE
On this page
Design notes
Jon Dattorro, "Effect Design, Part 1: Reverberator and Other Filters" (JAES 45(9), 1997): the plate-class reverberator in the figure-of-eight: a predelay, a bandwidth one-pole, four input diffusers, then a TANK of two cross-coupled halves, each one modulated-allpass -> delay -> damping -> decay -> allpass -> delay, with the stereo outputs assembled from SEVEN taps each into the opposite half's lines (the paper's Table 2). It is the topology behind half the digital plates in commercial use, and it earns its place beside fdn.h and spring.h because its sound (fast even density, metallic-smooth tail) comes from this exact wiring, not from a parameter set another topology could copy.
Faithfulness, stated precisely:
- every delay length and output tap is the paper's figure, scaled by sr / 29761 (the paper's rate), so the plate keeps its SIZE in seconds at any sample rate;
- decay is applied where the figure applies it (after each half's damping filter, and again on the cross-feed into the opposite half), so the loop loses decay^2 per half-lap of ~0.36 s, which is the T60 formula the test asserts by Schroeder integral;
- the two tank allpasses are modulated (the paper's excursion), rates incommensurate so the wander never loops audibly;
- damping and bandwidth are exposed in HERTZ and designed at the real rate, not as the paper's rate-bound coefficients;
- the allpass signs follow this SDK's lattice convention; the paper's depend on its diagram orientation. What the ear and the tests measure (density, decay, decorrelation) is orientation-blind.
SIZE: ~1.5 MB of delay lines (sized for 384 kHz). A MEMBER of SonoreDsp, never a local: the wasm stack is 64 KB.
Included by dsp.h.
Types 1
Dattorro's 1997 plate: a pre-delay, a bandwidth lowpass and four input diffusers into a modulated figure-of-eight tank, the stereo outputs taken from the paper's seven taps a side (see the file comment for what is faithful to the paper and what is not).
Stereo in and out, the input summed to mono. Call prepare() before audio; it scales the paper's delays to the rate (up to 384 kHz) and clears the tank. Set the controls with setParameters(), or the decay as a T60 with setDecayTime(); both, and process(), run on the audio thread. Report tailSamples() to the host. About 1.5 MB of delay lines: a member, never a local.