20 sample_rate_ = sample_rate;
22 int delays[] = {1087, 1283, 1481, 1693};
23 for (
int i = 0;
i < 4; ++
i) {
25 static_cast<int>(delays[
i] * sample_rate / SampleType{44100.0f}) + 1);
27 static_cast<int>(delays[
i] * sample_rate / SampleType{44100.0f});
31 void set_decay(SampleType seconds) { decay_ = seconds; }
33 damping_ = std::clamp(d, SampleType{0.0f}, SampleType{0.99f});
42 for (
int i = 0;
i < 4; ++
i)
43 s[
i] = lines_[
i].read(delay_samples_[
i]);
47 h[0] = SampleType{0.5f} * (s[0] + s[1] + s[2] + s[3]);
48 h[1] = SampleType{0.5f} * (s[0] - s[1] + s[2] - s[3]);
49 h[2] = SampleType{0.5f} * (s[0] + s[1] - s[2] - s[3]);
50 h[3] = SampleType{0.5f} * (s[0] - s[1] - s[2] + s[3]);
53 SampleType
feedback = decay_feedback();
54 for (
int i = 0;
i < 4; ++
i) {
60 lp_state_[
i] + (h[
i] - lp_state_[
i]) * (SampleType{1.0f} - damping_));
61 lines_[
i].push(input + lp_state_[
i] *
feedback);
65 SampleType wet_l = (s[0] + s[2]) * SampleType{0.5f};
66 SampleType wet_r = (s[1] + s[3]) * SampleType{0.5f};
68 SampleType dry = SampleType{1.0f} - mix_;
69 return {input * dry + wet_l * mix_,
70 input * dry + wet_r * mix_};
74 for (
auto& l : lines_) l.reset();
79 SampleType sample_rate_ = SampleType{44100.0f};
80 SampleType decay_ = SampleType{2.0f};
81 SampleType damping_ = SampleType{0.3f};
82 SampleType mix_ = SampleType{0.3f};
84 std::array<DelayLineT<SampleType>, 4> lines_;
85 std::array<int, 4> delay_samples_{};
86 std::array<SampleType, 4> lp_state_{};
88 SampleType decay_feedback()
const {
90 SampleType avg_delay = 0;
91 for (
int i = 0;
i < 4; ++
i)
92 avg_delay += delay_samples_[
i];
93 avg_delay /= (SampleType{4.0f} * sample_rate_);
96 if (decay_ <= 0 || avg_delay <= 0)
return 0;
97 return std::pow(SampleType{10.0f}, SampleType{-3.0f} * avg_delay / decay_);