chenlh
2026-03-26 36e42207da4c088b5bfd96f2cfc8944f890440d7
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#pragma once
 
#include <EffectProcessorBase.h>
#include <ModulatedCombFilter.h>
#include <ModulatedAllPassFilter.h>
#include <LFO.h>
#include <IIRFilter.h>
#include <FirstOrderSmoother.h>
 
#define NUM_COMBS 4
#define NUM_ALLPASS 2
 
template <typename SampleType>
class Reverb : public EffectProcessorBase<SampleType>
{
public:
    Reverb();
    ~Reverb();
 
    void prepare(SampleType sampleRate) override;
 
    /**
     * @brief Processes a single sample
     * 
     * @param input Input sample
     */
    SampleType processSample(SampleType input) override;
 
    /**
     * @brief Processes a memory block that holds audio samples
     * 
     * @param data Memory block start pointer 
     * @param startSample Sample index to start processing from
     * @param endSample Number of samples to process
     */
    void process(SampleType* data, int startSample, int endSample) override;
 
    void setRoomSize(SampleType newRoomSize);
    void setDecay(SampleType newDecay);
    void setCutoff(SampleType newCutoff);
    void setMix(SampleType newMix);
 
private:
 
    ModulatedCombFilter<SampleType> combFilters[NUM_COMBS];
    ModulatedAllPassFilter<SampleType> allPassFilters[NUM_ALLPASS];
    
    LFO combLFO[NUM_COMBS];
    LFO allPassLFO[NUM_ALLPASS];
 
    SampleType combDelayTimeValues[NUM_COMBS] {43.7, 41.1, 37.1, 29.7}; // CombFilter Delay times in ms
    SampleType combFeedbackValues[NUM_COMBS] {0.9, -0.9, 0.9, -0.9};
    SampleType combModRates[NUM_COMBS] {0.6, 0.71, 0.83, 0.95};
 
    SampleType allPassDelayTimeValues[NUM_ALLPASS] {5.0, 1.7}; // AllPass Delay times in ms
    SampleType allPassFeedbackValues[NUM_ALLPASS] {0.7, 0.7};
    SampleType allPassModRates[NUM_ALLPASS] {0.6, 0.83};
 
    FirstOrderSmoother valueSmoothers[NUM_COMBS];
 
    IIRFilter<SampleType> filter;
 
    // User Parameters
    SampleType roomSize {1.0}, decay {0.5}, filterCutoff {20000.0}, mix {0.5};
};