25 constexpr static float kRatio = 29761.f / kSampleRate;
27 constexpr static size_t max_excursion = 16.f * kRatio;
30 void process(std::span<q31_t> in, std::span<StereoSample> output)
override {
48 FxEngine::ConstructTopology(engine_, {&ap1, &ap2, &ap3, &ap4,
49 &dap1a, &del1a, &dap1b, &del1b,
50 &dap2a, &del2a, &dap2b, &del2b});
52 const float kdecay = reverb_time_;
53 const float kid1 = 0.750f;
54 const float kid2 = 0.625f;
55 const float kdd1 = 0.70f;
56 const float kdd2 = std::clamp(kdecay + 0.15f, 0.25f, 0.5f);
58 const float kdamp = lp_;
59 const float kbandwidth = 0.9995f;
61 const float gain = input_gain_;
63 float lp_1 = lp_decay_1_;
64 float lp_2 = lp_decay_2_;
65 float lp_band = lp_band_;
67 for (
size_t frame = 0; frame < in.size(); ++frame) {
70 const float input_sample = in[frame] /
static_cast<float>(std::numeric_limits<int32_t>::max());
73 c.Lp(lp_band, kbandwidth);
80 float apout = c.Get();
84 dap1a.
Interpolate(c, 672.0f * kRatio, LFO_2, max_excursion, -kdd1);
88 dap1b.Process(c, kdd2);
95 dap2a.
Interpolate(c, 908.0f * kRatio, LFO_1, max_excursion, -kdd1);
99 dap2b.Process(c, kdd2);
103 dap1a.Write(c, kdd1);
106 left_sum += 0.6f * del2a.at(266 * kRatio);
107 left_sum += 0.6f * del2a.at(2974 * kRatio);
108 left_sum -= 0.6f * dap2b.at(1913 * kRatio);
109 left_sum += 0.6f * del2b.at(1996 * kRatio);
110 left_sum -= 0.6f * del1a.at(1990 * kRatio);
111 left_sum -= 0.6f * dap1b.at(187 * kRatio);
112 left_sum -= 0.6f * del1b.at(1066 * kRatio);
113 left_sum = left_sum - dsp::OnePole(hp_l_, left_sum, hp_cutoff_);
114 left_sum = dsp::OnePole(lp_l_, left_sum, lp_cutoff_);
117 right_sum += 0.6f * del1a.at(353 * kRatio);
118 right_sum += 0.6f * del1a.at(3627 * kRatio);
119 right_sum -= 0.6f * dap1b.at(1228 * kRatio);
120 right_sum += 0.6f * del1b.at(2673 * kRatio);
121 right_sum -= 0.6f * del2a.at(2111 * kRatio);
122 right_sum -= 0.6f * dap2b.at(335 * kRatio);
123 right_sum -= 0.6f * del2b.at(121 * kRatio);
124 right_sum = right_sum - dsp::OnePole(hp_l_, right_sum, hp_cutoff_);
125 right_sum = dsp::OnePole(lp_l_, right_sum, lp_cutoff_);
128 static_cast<int32_t
>(left_sum *
static_cast<float>(std::numeric_limits<uint32_t>::max()) * 0xF);
131 static_cast<int32_t
>(left_sum *
static_cast<float>(std::numeric_limits<uint32_t>::max()) * 0xF);
134 output[frame].l += multiply_32x32_rshift32_rounded(output_left, getPanLeft());
135 output[frame].r += multiply_32x32_rshift32_rounded(output_right, getPanRight());
Definition fx_engine.hpp:81