Deluge Firmware 1.3.0
Build date: 2026.10.14
Loading...
Searching...
No Matches
deluge::dsp::reverb::Digital Class Reference

The Griesinger topology model from Part 1 of Effect Design by John Dattorro, classically based on the famous Lexicon 224 Digital Reverb. More...

#include <digital.hpp>

Inheritance diagram for deluge::dsp::reverb::Digital:
Collaboration diagram for deluge::dsp::reverb::Digital:

Public Member Functions

void process (std::span< q31_t > in, std::span< StereoSample > output) override
void setRoomSize (float value) override
float getRoomSize () const override
Public Member Functions inherited from deluge::dsp::reverb::Mutable
void process (std::span< int32_t > in, std::span< StereoSample > output) override
void Clear ()
void setRoomSize (float value) override
float getRoomSize () const override
void setDamping (float value) override
float getDamping () const override
void setWidth (float value) override
float getWidth () const override
void setHPF (float f) override
float getHPF () const override
void setLPF (float f) override
float getLPF () const override
Public Member Functions inherited from deluge::dsp::reverb::Base
constexpr void setPanLevels (const int32_t amplitude_left, const int32_t amplitude_right)
constexpr int32_t getPanLeft () const
constexpr int32_t getPanRight () const

Private Attributes

float lp_band_ {0.f}

Static Private Attributes

static constexpr float kRatio = 29761.f / kSampleRate
static constexpr size_t max_excursion = 16.f * kRatio
 Dattorro's +/-16 samples of tank modulation, rescaled to our sample rate.
static constexpr size_t kInterpolationGuard = 1
static constexpr float kDecayMin = 0.1f
static constexpr float kDecayMax = 0.9f

Additional Inherited Members

Public Types inherited from deluge::dsp::reverb::Base
enum class  FilterType { LowPass , HighPass }
Static Public Member Functions inherited from deluge::dsp::reverb::Base
template<FilterType filtertype>
static constexpr float calcFilterCutoff (float f)
Static Public Attributes inherited from deluge::dsp::reverb::Mutable
static constexpr float kOutputGain = 15.f * 4294967296.f
static constexpr float kReverbTimeMin = 0.01f
static constexpr float kReverbTimeMax = 0.98f
static constexpr float kWidthMin = 0.1f
static constexpr float kWidthMax = 0.9f
static constexpr float kLpMin = 0.01f
static constexpr float kLpMax = 1.f
Protected Attributes inherited from deluge::dsp::reverb::Mutable
std::array< float, kBufferSize > buffer_ {}
FxEngine engine_ {buffer_, {0.5f / sample_rate, 0.3f / sample_rate}}
float reverb_time_ = 0.665f
float diffusion_ = 0.625f
float lp_ {0.7f}
float lp_val_ {0.7f}
float lp_decay_1_ {0}
float lp_decay_2_ {0}
float hp_cutoff_val_ {0.f}
float hp_cutoff_ {calcFilterCutoff<FilterType::HighPass>(0)}
float hp_l_ {0.0}
float hp_r_ {0.0}
float lp_cutoff_val_ {0.f}
float lp_cutoff_ {calcFilterCutoff<FilterType::LowPass>(0)}
float lp_l_ {0.0}
float lp_r_ {0.0}
Static Protected Attributes inherited from deluge::dsp::reverb::Mutable
static constexpr float sample_rate = kSampleRate

Detailed Description

The Griesinger topology model from Part 1 of Effect Design by John Dattorro, classically based on the famous Lexicon 224 Digital Reverb.

Member Function Documentation

◆ getRoomSize()

float deluge::dsp::reverb::Digital::getRoomSize ( ) const
inlinenodiscardoverridevirtual

Reimplemented from deluge::dsp::reverb::Base.

◆ process()

void deluge::dsp::reverb::Digital::process ( std::span< q31_t > in,
std::span< StereoSample > output )
inlineoverridevirtual

◆ setRoomSize()

void deluge::dsp::reverb::Digital::setRoomSize ( float value)
inlineoverridevirtual

Reimplemented from deluge::dsp::reverb::Base.

Member Data Documentation

◆ kDecayMin

float deluge::dsp::reverb::Digital::kDecayMin = 0.1f
staticconstexprprivate

Dattorro's decay range. The tank's allpasses are unity gain, so the round trip loses only decay^4 – pushing this to the old shared [0.01, 0.98] leaves the top of the knob ringing for the better part of half a minute.

◆ kInterpolationGuard

size_t deluge::dsp::reverb::Digital::kInterpolationGuard = 1
staticconstexprprivate

An interpolated read touches both offset and offset + 1, so a modulated line has to reserve one slot beyond the furthest its LFO can push it. Without this the read spills into the next line's memory and drags a sample from a whole buffer ago into the tank.


The documentation for this class was generated from the following file: