Line data Source code
1 : #pragma once
2 :
3 : // Modulated delay effect that thickens the signal with chorus movement.
4 : // The wet tap is y_w[n] = x[n - D(n)] with D(n)=D0 + A*sin(2*pi*f_lfo*n/Fs);
5 : // fractional delay reads use interpolation, then y[n]=(1-mix)*x[n]+mix*y_w[n].
6 :
7 : #include "audio/effects/effect.h"
8 :
9 : namespace Amplitron {
10 :
11 : class Chorus : public Effect {
12 : public:
13 : Chorus();
14 : void process(float* buffer, int num_samples) override;
15 : void process_stereo(float* left, float* right, int num_samples) override;
16 : void set_sample_rate(int sample_rate) override;
17 : void set_transport_state(float bpm) override;
18 : void reset() override;
19 80 : const char* name() const override { return "Chorus"; }
20 3 : const char* type_id() const override { return "Chorus"; }
21 89 : std::vector<EffectParam>& params() override { return params_; }
22 :
23 : private:
24 : std::vector<EffectParam> params_;
25 : std::vector<float> delay_buffer_;
26 : int write_pos_ = 0;
27 : float lfo_phase_ = 0.0f;
28 : int max_delay_samples_ = 0;
29 : float last_bpm_=0.0f; //shortcut if bpm not changed.
30 : float smoothed_rate_ = 1.5f;
31 : };
32 :
33 : } // namespace Amplitron
|