Line data Source code
1 : #pragma once
2 :
3 : // Short modulated delay effect for comb-filter sweep sounds.
4 : // Uses y[n]=x[n]+feedback*y[n-D(n)] mixed with a wet tap x[n-D(n)], where
5 : // D(n)=D0 + A*sin(2*pi*f_lfo*n/Fs); the varying delay moves comb notches at
6 : // frequencies approximately k*Fs/D(n).
7 :
8 : #include "audio/effects/effect.h"
9 :
10 : namespace Amplitron {
11 :
12 : /**
13 : * Flanger effect — short modulated delay line (0.1–15ms) mixed with dry signal.
14 : * Feedback through the delay line creates the classic "comb filter sweep" sound.
15 : */
16 : class Flanger : public Effect {
17 : public:
18 : Flanger();
19 : void process(float* buffer, int num_samples) override;
20 : void process_stereo(float* left, float* right, int num_samples) override;
21 : void set_sample_rate(int sample_rate) override;
22 : void reset() override;
23 65 : const char* name() const override { return "Flanger"; }
24 3 : const char* type_id() const override { return "Flanger"; }
25 225 : std::vector<EffectParam>& params() override { return params_; }
26 :
27 : private:
28 : std::vector<EffectParam> params_;
29 : std::vector<float> delay_buffer_;
30 : int write_pos_ = 0;
31 : float lfo_phase_ = 0.0f;
32 : int max_delay_samples_ = 0;
33 : // Right-channel delay line — LFO is 180° out of phase
34 : std::vector<float> delay_buffer_r_;
35 : int write_pos_r_ = 0;
36 : };
37 :
38 : } // namespace Amplitron
|