Deluge Firmware
1.3.0
Build date: 2026.08.29
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()
22
: base_(&std::get<0>(reverb_)),
//<
23
room_size_(base_->getRoomSize()),
//<
24
damping_(base_->getDamping()),
//<
25
lpf_(base_->getLPF()),
//<
26
width_(base_->getWidth()) {}
27
~Reverb()
override
=
default
;
28
29
void
setModel(Model m) {
30
switch
(m) {
31
case
Model::FREEVERB:
32
reverb_.emplace<
reverb::Freeverb
>();
33
break
;
34
case
Model::DIGITAL:
35
reverb_.emplace<
reverb::Digital
>();
36
break
;
37
case
Model::MUTABLE:
38
reverb_.emplace<
reverb::Mutable
>();
39
break
;
40
}
41
base_->setRoomSize(room_size_);
42
base_->setDamping(damping_);
43
base_->setWidth(width_);
44
base_->setHPF(hpf_);
45
base_->setLPF(lpf_);
46
model_ = m;
47
}
48
49
Model getModel() {
return
model_; }
50
51
void
process(std::span<int32_t> input, std::span<StereoSample> output)
override
{
52
using namespace
reverb;
53
switch
(model_) {
54
case
Model::FREEVERB:
55
reverb_as<Freeverb>().process(input, output);
56
break
;
57
case
Model::MUTABLE:
58
reverb_as<Mutable>().process(input, output);
59
break
;
60
case
Model::DIGITAL:
61
reverb_as<Digital>().process(input, output);
62
break
;
63
}
64
}
65
66
void
setPanLevels(
const
int32_t amplitude_left,
const
int32_t amplitude_right) {
67
base_->setPanLevels(amplitude_left, amplitude_right);
68
}
69
70
void
setRoomSize(
float
value)
override
{
71
room_size_ = value;
72
base_->setRoomSize(value);
73
}
74
75
[[nodiscard]]
float
getRoomSize()
const override
{
return
base_->getRoomSize(); };
76
77
void
setDamping(
float
value)
override
{
78
damping_ = value;
79
base_->setDamping(value);
80
}
81
82
[[nodiscard]]
float
getDamping()
const override
{
return
base_->getDamping(); }
83
84
void
setWidth(
float
value)
override
{
85
width_ = value;
86
base_->setWidth(value);
87
}
88
89
[[nodiscard]]
float
getWidth()
const override
{
return
base_->getWidth(); };
90
91
void
setHPF(
float
f)
override
{
92
hpf_ = f;
93
base_->setHPF(f);
94
}
95
[[nodiscard]]
float
getHPF()
const override
{
return
base_->getHPF(); }
96
97
void
setLPF(
float
f)
override
{
98
lpf_ = f;
99
base_->setLPF(f);
100
}
101
[[nodiscard]]
float
getLPF()
const override
{
return
base_->getLPF(); }
102
103
template
<
typename
T>
104
constexpr
T& reverb_as() {
105
return
std::get<T>(reverb_);
106
}
107
108
private
:
109
std::variant<
//<
110
reverb::Freeverb
,
//<
111
reverb::Mutable
,
//<
112
reverb::Digital
//<
113
>
114
reverb_{};
115
116
Model model_ = Model::FREEVERB;
117
118
reverb::Base
* base_ =
nullptr
;
119
120
float
room_size_;
121
float
damping_;
122
float
width_;
123
float
hpf_;
124
float
lpf_;
125
};
126
}
// 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:24
deluge::dsp::reverb::Freeverb
Definition
freeverb.hpp:34
deluge::dsp::reverb::Mutable
Definition
mutable.hpp:15
deluge::dsp::reverb::Base
Definition
base.hpp:7