aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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
-rw-r--r--src/PluginProcessor.cpp8
-rw-r--r--src/PluginProcessor.h1
6 files changed, 33 insertions, 26 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;
diff --git a/src/PluginProcessor.cpp b/src/PluginProcessor.cpp
index 770f7a2..f10065f 100644
--- a/src/PluginProcessor.cpp
+++ b/src/PluginProcessor.cpp
@@ -7,7 +7,8 @@ SchroederReverbAudioProcessor::SchroederReverbAudioProcessor()
.withInput("Input", juce::AudioChannelSet::stereo(), true)
.withOutput("Output", juce::AudioChannelSet::stereo(), true))
{
- addParameter(dryWetMix = new juce::AudioParameterFloat({ "mix", 1 }, "Mix", 0.0f, 1.0f, 0.5f));
+ addParameter(dryWetMix = new juce::AudioParameterFloat("mix", "Mix", 0.0f, 1.0f, 0.5f));
+ addParameter(decayFactor = new juce::AudioParameterFloat("decay", "Decay", 0.1f, 10.0f, 1.0f));
}
SchroederReverbAudioProcessor::~SchroederReverbAudioProcessor() {}
@@ -40,8 +41,7 @@ SchroederReverbAudioProcessor::isMidiEffect() const
double
SchroederReverbAudioProcessor::getTailLengthSeconds() const
{
- // TODO: Change number after implementing Decay
- return 0.0;
+ return 10.0;
}
int
@@ -114,7 +114,7 @@ SchroederReverbAudioProcessor::processBlock(juce::AudioBuffer<float>& buffer,
for (int i = 0; i < buffer.getNumSamples(); ++i)
{
// Apply effect to sample
- schroederReverb.process(channelData[i], dryWetMix->get());
+ schroederReverb.process(channelData[i], dryWetMix->get(), decayFactor->get());
}
}
}
diff --git a/src/PluginProcessor.h b/src/PluginProcessor.h
index 27203ca..f6e6f5d 100644
--- a/src/PluginProcessor.h
+++ b/src/PluginProcessor.h
@@ -49,5 +49,6 @@ class SchroederReverbAudioProcessor final : public juce::AudioProcessor
//==============================================================================
SchroederReverb schroederReverb;
juce::AudioParameterFloat* dryWetMix;
+ juce::AudioParameterFloat* decayFactor;
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(SchroederReverbAudioProcessor)
};