aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDominik Kaiser2025-09-28 13:58:50 +0200
committerDominik Kaiser2025-09-28 13:58:50 +0200
commit960adde7e467d2a0c0ee541ed4ee2ec2219221e4 (patch)
tree460d428c3cdee2a9e15083ef84857761f788c703
parent6084053d60d2afb4de6a4e1448436fd13ab88493 (diff)
downloadSchroederReverb-960adde7e467d2a0c0ee541ed4ee2ec2219221e4.tar.gz
SchroederReverb-960adde7e467d2a0c0ee541ed4ee2ec2219221e4.zip
Tune filters and get reverb to work
-rw-r--r--src/DSP/AllPassFilter.cpp16
-rw-r--r--src/DSP/AllPassFilter.h4
-rw-r--r--src/DSP/CombFilter.cpp14
-rw-r--r--src/DSP/CombFilter.h4
-rw-r--r--src/DSP/SchroederReverb.cpp17
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;
}