diff options
| author | Dominik Kaiser | 2025-09-28 13:58:50 +0200 |
|---|---|---|
| committer | Dominik Kaiser | 2025-09-28 13:58:50 +0200 |
| commit | 960adde7e467d2a0c0ee541ed4ee2ec2219221e4 (patch) | |
| tree | 460d428c3cdee2a9e15083ef84857761f788c703 /src | |
| parent | 6084053d60d2afb4de6a4e1448436fd13ab88493 (diff) | |
| download | SchroederReverb-960adde7e467d2a0c0ee541ed4ee2ec2219221e4.tar.gz SchroederReverb-960adde7e467d2a0c0ee541ed4ee2ec2219221e4.zip | |
Tune filters and get reverb to work
Diffstat (limited to 'src')
| -rw-r--r-- | src/DSP/AllPassFilter.cpp | 16 | ||||
| -rw-r--r-- | src/DSP/AllPassFilter.h | 4 | ||||
| -rw-r--r-- | src/DSP/CombFilter.cpp | 14 | ||||
| -rw-r--r-- | src/DSP/CombFilter.h | 4 | ||||
| -rw-r--r-- | src/DSP/SchroederReverb.cpp | 17 |
5 files changed, 33 insertions, 22 deletions
diff --git a/src/DSP/AllPassFilter.cpp b/src/DSP/AllPassFilter.cpp index e90bff7..a6e3908 100644 --- a/src/DSP/AllPassFilter.cpp +++ b/src/DSP/AllPassFilter.cpp @@ -1,24 +1,30 @@ #include "AllPassFilter.h" -void AllPassFilter::prepare(double sampleRate, int samplesPerBlock) { +void AllPassFilter::prepare(double sampleRate, int samplesPerBlock, int delayInSamples, float gain) { int maxDelayTimeMs = 100; int maxDelaySamples = static_cast<int>(sampleRate * maxDelayTimeMs / 1000.0); delayBuffer.resize(maxDelaySamples, 0.0f); - delayInSamples = static_cast<int>(sampleRate * 0.02); + //delayInSamples = static_cast<int>(sampleRate * delayInSeconds); delayBufferWritePos = 0; + this->delayInSamples_ = delayInSamples; + this->gain = gain; } void AllPassFilter::process(float* sample) { int delayBufferLength = (int)delayBuffer.size(); int delayReadPos = - (delayBufferWritePos - delayInSamples + delayBufferLength) % + (delayBufferWritePos - delayInSamples_ + delayBufferLength) % delayBufferLength; - float xn = *sample; + + float delayedSample = delayBuffer[delayReadPos]; + float xn = *sample; + + float bufferInput = xn + gain * delayedSample; float yn = -gain * xn + delayedSample; - delayBuffer[delayBufferWritePos] = xn + gain * yn; + delayBuffer[delayBufferWritePos] = bufferInput; *sample = yn; delayBufferWritePos = (delayBufferWritePos + 1) % delayBufferLength; } diff --git a/src/DSP/AllPassFilter.h b/src/DSP/AllPassFilter.h index be35129..0d9a91e 100644 --- a/src/DSP/AllPassFilter.h +++ b/src/DSP/AllPassFilter.h @@ -4,13 +4,13 @@ class AllPassFilter { public: - void prepare(double sampleRate, int samplesPerBlock); + void prepare(double sampleRate, int samplesPerBlock, int delayInSamples, float gain); void reset(); void process(float *sample); private: std::vector<float> delayBuffer; int delayBufferWritePos = 0; - int delayInSamples = 0; + int delayInSamples_ = 0; float gain = 0.7f; }; diff --git a/src/DSP/CombFilter.cpp b/src/DSP/CombFilter.cpp index f7eff21..d572d47 100644 --- a/src/DSP/CombFilter.cpp +++ b/src/DSP/CombFilter.cpp @@ -1,20 +1,22 @@ #include "CombFilter.h" -void CombFilter::prepare(double sampleRate, int samplesPerBlock) { +void CombFilter::prepare(double sampleRate, int samplesPerBlock, int delayInSamples, float gain) { int maxDelayTimeMs = 100; int maxDelaySamples = static_cast<int>(sampleRate * maxDelayTimeMs / 1000.0); delayBuffer.resize(maxDelaySamples, 0.0f); - delayInSamples = static_cast<int>(sampleRate * 0.02); + //delayInSamples = static_cast<int>(sampleRate * delayInSeconds); delayBufferWritePos = 0; + this->delayInSamples_ = delayInSamples; + this->gain = gain; } void CombFilter::process(float* sample) { int delayBufferLength = (int)delayBuffer.size(); - int delayReadPos = (delayBufferWritePos - delayInSamples + delayBufferLength) % delayBufferLength; + int delayReadPos = (delayBufferWritePos - delayInSamples_ + delayBufferLength) % delayBufferLength; float delayedSample = delayBuffer[delayReadPos]; - float out = *sample + gain * delayedSample; - delayBuffer[delayBufferWritePos] = *sample; - *sample = out; + float yn = *sample + gain * delayedSample; + delayBuffer[delayBufferWritePos] = yn; + *sample = yn; delayBufferWritePos = (delayBufferWritePos + 1) % delayBufferLength; } diff --git a/src/DSP/CombFilter.h b/src/DSP/CombFilter.h index 355fbd9..5568fec 100644 --- a/src/DSP/CombFilter.h +++ b/src/DSP/CombFilter.h @@ -4,13 +4,13 @@ class CombFilter { public: - void prepare(double sampleRate, int samplesPerBlock); + void prepare(double sampleRate, int samplesPerBlock, int delayInSamples, float gain); void reset(); void process(float* sample); private: std::vector<float> delayBuffer; int delayBufferWritePos = 0; - int delayInSamples = 0; + int delayInSamples_ = 0; float gain = 0.7f; }; diff --git a/src/DSP/SchroederReverb.cpp b/src/DSP/SchroederReverb.cpp index 8bd764d..785e84c 100644 --- a/src/DSP/SchroederReverb.cpp +++ b/src/DSP/SchroederReverb.cpp @@ -1,15 +1,17 @@ #include "SchroederReverb.h" void SchroederReverb::prepare(double sampleRate, int samplesPerBlock) { - combFilter0.prepare(sampleRate, samplesPerBlock); - combFilter1.prepare(sampleRate, samplesPerBlock); - combFilter2.prepare(sampleRate, samplesPerBlock); - combFilter3.prepare(sampleRate, samplesPerBlock); - allPassFilter0.prepare(sampleRate, samplesPerBlock); - allPassFilter1.prepare(sampleRate, samplesPerBlock); + combFilter0.prepare(sampleRate, samplesPerBlock, 4799, 0.742f); + combFilter1.prepare(sampleRate, samplesPerBlock, 4999, 0.733f); + combFilter2.prepare(sampleRate, samplesPerBlock, 5399, 0.715f); + combFilter3.prepare(sampleRate, samplesPerBlock, 5801, 0.697f); + allPassFilter0.prepare(sampleRate, samplesPerBlock, 1051, 0.7f); + allPassFilter1.prepare(sampleRate, samplesPerBlock, 337, 0.7f); } void SchroederReverb::process(float *sample) { + juce::ScopedNoDenormals noDenormals; + float in0 = *sample; float in1 = *sample; float in2 = *sample; @@ -20,8 +22,9 @@ void SchroederReverb::process(float *sample) { combFilter2.process(&in2); combFilter3.process(&in3); - float allPassIn = in0 + in1 + in2 + in3; + float allPassIn = 0.25f * (in0 + in1 + in2 + in3); allPassFilter0.process(&allPassIn); allPassFilter1.process(&allPassIn); + *sample = allPassIn; } |
