Deluge Firmware
1.3.0
Build date: 2026.10.14
Toggle main menu visibility
Loading...
Searching...
No Matches
reverb.hpp
1
#pragma once
2
#include "base.hpp"
3
#include "deluge/dsp/reverb/reverb.hpp"
4
#include "digital.hpp"
5
#include "freeverb/freeverb.hpp"
6
#include "mutable.hpp"
7
#include <algorithm>
8
#include <cstdint>
9
#include <variant>
10
11
namespace
deluge::dsp {
12
13
class
[[gnu::hot]] Reverb :
reverb::Base
{
14
public
:
15
enum class
Model {
16
FREEVERB = 0,
// Freeverb is the original
17
MUTABLE,
18
DIGITAL,
19
};
20
21
Reverb() : base_(&std::get<reverb::Freeverb>(reverb_)) {
22
room_size_ = base_->getRoomSize();
23
damping_ = base_->getDamping();
24
width_ = base_->getWidth();
25
hpf_ = base_->getHPF();
26
lpf_ = base_->getLPF();
27
}
28
~Reverb()
override
=
default
;
29
30
void
setModel(Model m) {
31
// emplace destroys whatever was there, so base_ has to be re-pointed at the new object
32
// rather than left aimed at the corpse of the old one.
33
switch
(m) {
34
case
Model::FREEVERB:
35
base_ = &reverb_.emplace<
reverb::Freeverb
>();
36
break
;
37
case
Model::DIGITAL:
38
base_ = &reverb_.emplace<
reverb::Digital
>();
39
break
;
40
case
Model::MUTABLE:
41
base_ = &reverb_.emplace<
reverb::Mutable
>();
42
break
;
43
}
44
base_->setRoomSize(room_size_);
45
base_->setDamping(damping_);
46
base_->setWidth(width_);
47
base_->setHPF(hpf_);
48
base_->setLPF(lpf_);
49
model_ = m;
50
}
51
52
Model getModel() {
return
model_; }
53
54
void
process(std::span<int32_t> input, std::span<StereoSample> output)
override
{
55
using namespace
reverb;
56
switch
(model_) {
57
case
Model::FREEVERB:
58
reverb_as<Freeverb>().process(input, output);
59
break
;
60
case
Model::MUTABLE:
61
reverb_as<Mutable>().process(input, output);
62
break
;
63
case
Model::DIGITAL:
64
reverb_as<Digital>().process(input, output);
65
break
;
66
}
67
}
68
69
void
setPanLevels(
const
int32_t amplitude_left,
const
int32_t amplitude_right) {
70
base_->setPanLevels(amplitude_left, amplitude_right);
71
}
72
73
void
setRoomSize(
float
value)
override
{
74
room_size_ = value;
75
base_->setRoomSize(value);
76
}
77
78
[[nodiscard]]
float
getRoomSize()
const override
{
return
base_->getRoomSize(); };
79
80
void
setDamping(
float
value)
override
{
81
damping_ = value;
82
base_->setDamping(value);
83
}
84
85
[[nodiscard]]
float
getDamping()
const override
{
return
base_->getDamping(); }
86
87
void
setWidth(
float
value)
override
{
88
width_ = value;
89
base_->setWidth(value);
90
}
91
92
[[nodiscard]]
float
getWidth()
const override
{
return
base_->getWidth(); };
93
94
void
setHPF(
float
f)
override
{
95
hpf_ = f;
96
base_->setHPF(f);
97
}
98
[[nodiscard]]
float
getHPF()
const override
{
return
base_->getHPF(); }
99
100
void
setLPF(
float
f)
override
{
101
lpf_ = f;
102
base_->setLPF(f);
103
}
104
[[nodiscard]]
float
getLPF()
const override
{
return
base_->getLPF(); }
105
106
template
<
typename
T>
107
constexpr
T& reverb_as() {
108
return
std::get<T>(reverb_);
109
}
110
111
private
:
112
std::variant<
//<
113
reverb::Freeverb
,
//<
114
reverb::Mutable
,
//<
115
reverb::Digital
//<
116
>
117
reverb_{};
118
119
Model model_ = Model::FREEVERB;
120
121
reverb::Base
* base_ =
nullptr
;
122
123
float
room_size_ = 0.f;
124
float
damping_ = 0.f;
125
float
width_ = 0.f;
126
float
hpf_ = 0.f;
127
float
lpf_ = 0.f;
128
};
129
}
// namespace deluge::dsp
deluge::dsp::reverb::Digital
The Griesinger topology model from Part 1 of Effect Design by John Dattorro, classically based on the...
Definition
digital.hpp:25
deluge::dsp::reverb::Freeverb
Definition
freeverb.hpp:34
deluge::dsp::reverb::Mutable
Definition
mutable.hpp:15
deluge::dsp::reverb::Base
Definition
base.hpp:7