Deluge Firmware 1.3.0
Build date: 2025.04.16
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()
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
108private:
109 std::variant< //<
111 reverb::Mutable, //<
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
The Griesinger topology model from Part 1 of Effect Design by John Dattorro, classically based on the...
Definition digital.hpp:24
Definition freeverb.hpp:34
Definition mutable.hpp:15
Definition base.hpp:7