aboutsummaryrefslogtreecommitdiff
path: root/src/DSP
diff options
context:
space:
mode:
authorDominik Kaiser2025-10-06 21:14:55 +0200
committerDominik Kaiser2025-10-06 21:14:55 +0200
commit796c40a0dac68bd2bc9ccd676ad714f2fd3872fc (patch)
tree80fe403c5657828a08ce5ff4a8ce4325dcce1a9c /src/DSP
parent64c508863cb21929cb545b4978edb5d25fed7380 (diff)
downloadSchroederReverb-796c40a0dac68bd2bc9ccd676ad714f2fd3872fc.tar.gz
SchroederReverb-796c40a0dac68bd2bc9ccd676ad714f2fd3872fc.zip
Add Decay
Diffstat (limited to 'src/DSP')
-rw-r--r--src/DSP/CombFilter.cpp10
-rw-r--r--src/DSP/CombFilter.h6
-rw-r--r--src/DSP/SchroederReverb.cpp32
-rw-r--r--src/DSP/SchroederReverb.h2
4 files changed, 28 insertions, 22 deletions
diff --git a/src/DSP/CombFilter.cpp b/src/DSP/CombFilter.cpp
index 0ee03fc..5ee8efc 100644
--- a/src/DSP/CombFilter.cpp
+++ b/src/DSP/CombFilter.cpp
@@ -1,7 +1,7 @@
#include "CombFilter.h"
void
-CombFilter::prepare(double sampleRate, int samplesPerBlock, int delayInSamples, float gain)
+CombFilter::prepare(double sampleRate, int samplesPerBlock, int delayInSamples)
{
int maxDelayTimeMs = 50;
int maxDelaySamples = static_cast<int>(sampleRate * maxDelayTimeMs / 1000.0);
@@ -9,17 +9,19 @@ CombFilter::prepare(double sampleRate, int samplesPerBlock, int delayInSamples,
delayBuffer.resize(maxDelaySamples, 0.0f);
std::fill(delayBuffer.begin(), delayBuffer.end(), 0.0f);
delayBufferWritePos = 0;
+ this->sampleRate = sampleRate;
this->delayInSamples = delayInSamples;
- this->gain = gain;
}
void
-CombFilter::process(float& sample)
-{
+CombFilter::process(float& sample, float decayFactor)
+{
int delayBufferLength = (int)delayBuffer.size();
int delayReadPos
= (delayBufferWritePos - delayInSamples + delayBufferLength) % delayBufferLength;
float delayedSample = delayBuffer[delayReadPos];
+
+ float gain = std::pow(10.0f, -3.0f * delayInSamples / (decayFactor * sampleRate));
delayBuffer[delayBufferWritePos] = sample + gain * delayedSample;
sample = delayedSample;
diff --git a/src/DSP/CombFilter.h b/src/DSP/CombFilter.h
index 6eada89..eb5e914 100644
--- a/src/DSP/CombFilter.h
+++ b/src/DSP/CombFilter.h
@@ -5,13 +5,13 @@
class CombFilter
{
public:
- void prepare(double sampleRate, int samplesPerBlock, int delayInSamples, float gain);
+ void prepare(double sampleRate, int samplesPerBlock, int delayInSamples);
void reset();
- void process(float& sample);
+ void process(float& sample, float decayFactor);
private:
std::vector<float> delayBuffer;
int delayBufferWritePos = 0;
+ double sampleRate = 0.0;
int delayInSamples = 0;
- float gain = 0.7f;
};
diff --git a/src/DSP/SchroederReverb.cpp b/src/DSP/SchroederReverb.cpp
index 97406d2..1b84712 100644
--- a/src/DSP/SchroederReverb.cpp
+++ b/src/DSP/SchroederReverb.cpp
@@ -3,30 +3,34 @@
void
SchroederReverb::prepare(double sampleRate, int samplesPerBlock)
{
- combFilter0.prepare(sampleRate, samplesPerBlock, 1557, 0.742f);
- combFilter1.prepare(sampleRate, samplesPerBlock, 1613, 0.733f);
- combFilter2.prepare(sampleRate, samplesPerBlock, 1499, 0.715f);
- combFilter3.prepare(sampleRate, samplesPerBlock, 1427, 0.697f);
+ preDelay.prepare(sampleRate, samplesPerBlock);
+ combFilter0.prepare(sampleRate, samplesPerBlock, 1557);
+ combFilter1.prepare(sampleRate, samplesPerBlock, 1613);
+ combFilter2.prepare(sampleRate, samplesPerBlock, 1499);
+ combFilter3.prepare(sampleRate, samplesPerBlock, 1427);
allPassFilter0.prepare(sampleRate, samplesPerBlock, 347, 0.7f);
allPassFilter1.prepare(sampleRate, samplesPerBlock, 1137, 0.7f);
}
void
-SchroederReverb::process(float& sample, float dryWetMix)
+SchroederReverb::process(float& sample, float dryWetMix, float decayFactor)
{
juce::ScopedNoDenormals noDenormals;
- float in0 = sample;
- float in1 = sample;
- float in2 = sample;
- float in3 = sample;
+ float in = sample;
- combFilter0.process(in0);
- combFilter1.process(in1);
- combFilter2.process(in2);
- combFilter3.process(in3);
- float allPassIn = 0.25f * (in0 + in1 + in2 + in3);
+ float cf0in = in;
+ float cf1in = in;
+ float cf2in = in;
+ float cf3in = in;
+
+ combFilter0.process(cf0in, decayFactor);
+ combFilter1.process(cf1in, decayFactor);
+ combFilter2.process(cf2in, decayFactor);
+ combFilter3.process(cf3in, decayFactor);
+
+ float allPassIn = 0.25f * (cf0in + cf1in + cf2in + cf3in);
allPassFilter0.process(allPassIn);
allPassFilter1.process(allPassIn);
diff --git a/src/DSP/SchroederReverb.h b/src/DSP/SchroederReverb.h
index c6e5110..2d5cd0b 100644
--- a/src/DSP/SchroederReverb.h
+++ b/src/DSP/SchroederReverb.h
@@ -9,7 +9,7 @@ class SchroederReverb
public:
void prepare(double sampleRate, int samplesPerBlock);
void reset();
- void process(float& sample, float dryWetMix);
+ void process(float& sample, float dryWetMix, float decayFactor);
private:
CombFilter combFilter0, combFilter1, combFilter2, combFilter3;