26 constexpr static float kRatio = 29761.f / kSampleRate;
40 constexpr static float kDecayMax = 0.9f;
43 void process(std::span<q31_t> in, std::span<StereoSample> output)
override {
61 FxEngine::ConstructTopology(engine_, {&ap1, &ap2, &ap3, &ap4,
62 &dap1a, &del1a, &dap1b, &del1b,
63 &dap2a, &del2a, &dap2b, &del2b});
65 const float kdecay = reverb_time_;
66 const float kid1 = 0.750f;
67 const float kid2 = 0.625f;
68 const float kdd1 = 0.70f;
69 const float kdd2 = std::clamp(kdecay + 0.15f, 0.25f, 0.5f);
71 const float kdamp = lp_;
72 const float kbandwidth = 0.9995f;
74 float lp_1 = lp_decay_1_;
75 float lp_2 = lp_decay_2_;
76 float lp_band = lp_band_;
78 for (
size_t frame = 0; frame < in.size(); ++frame) {
81 const float input_sample = in[frame] /
static_cast<float>(std::numeric_limits<int32_t>::max());
84 c.Lp(lp_band, kbandwidth);
91 float apout = c.Get();
97 c.Add(kdecay * del2b.Read(del2b.length));
98 dap1a.ProcessInterpolate(c, 672.0f * kRatio, LFO_2,
max_excursion, -kdd1);
102 dap1b.Process(c, kdd2);
107 dap2a.ProcessInterpolate(c, 908.0f * kRatio, LFO_1,
max_excursion, -kdd1);
111 dap2b.Process(c, kdd2);
115 left_sum += 0.6f * del2a.at(266 * kRatio);
116 left_sum += 0.6f * del2a.at(2974 * kRatio);
117 left_sum -= 0.6f * dap2b.at(1913 * kRatio);
118 left_sum += 0.6f * del2b.at(1996 * kRatio);
119 left_sum -= 0.6f * del1a.at(1990 * kRatio);
120 left_sum -= 0.6f * dap1b.at(187 * kRatio);
121 left_sum -= 0.6f * del1b.at(1066 * kRatio);
122 left_sum = left_sum - dsp::OnePole(hp_l_, left_sum, hp_cutoff_);
123 left_sum = dsp::OnePole(lp_l_, left_sum, lp_cutoff_);
126 right_sum += 0.6f * del1a.at(353 * kRatio);
127 right_sum += 0.6f * del1a.at(3627 * kRatio);
128 right_sum -= 0.6f * dap1b.at(1228 * kRatio);
129 right_sum += 0.6f * del1b.at(2673 * kRatio);
130 right_sum -= 0.6f * del2a.at(2111 * kRatio);
131 right_sum -= 0.6f * dap2b.at(335 * kRatio);
132 right_sum -= 0.6f * del2b.at(121 * kRatio);
133 right_sum = right_sum - dsp::OnePole(hp_r_, right_sum, hp_cutoff_);
134 right_sum = dsp::OnePole(lp_r_, right_sum, lp_cutoff_);
136 q31_t output_left = dsp::toQ31Saturating(left_sum *
kOutputGain);
137 q31_t output_right = dsp::toQ31Saturating(right_sum *
kOutputGain);
140 output[frame].l += multiply_32x32_rshift32_rounded(output_left, getPanLeft());
141 output[frame].r += multiply_32x32_rshift32_rounded(output_right, getPanRight());
150 void setRoomSize(
float value)
override { reverb_time_ = util::map(value, 0.f, 1.f,
kDecayMin, kDecayMax); }
151 [[nodiscard]]
float getRoomSize()
const override {
152 return util::map(reverb_time_,
kDecayMin, kDecayMax, 0.f, 1.f);
Definition fx_engine.hpp:98