Deluge Firmware 1.3.0
Build date: 2026.10.14
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
11namespace deluge::dsp {
12
13class [[gnu::hot]] Reverb : reverb::Base {
14public:
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
111private:
112 std::variant< //<
114 reverb::Mutable, //<
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
The Griesinger topology model from Part 1 of Effect Design by John Dattorro, classically based on the...
Definition digital.hpp:25
Definition freeverb.hpp:34
Definition mutable.hpp:15
Definition base.hpp:7