diff options
| author | Dominik Kaiser | 2025-10-06 21:14:55 +0200 |
|---|---|---|
| committer | Dominik Kaiser | 2025-10-06 21:14:55 +0200 |
| commit | 796c40a0dac68bd2bc9ccd676ad714f2fd3872fc (patch) | |
| tree | 80fe403c5657828a08ce5ff4a8ce4325dcce1a9c /src | |
| parent | 64c508863cb21929cb545b4978edb5d25fed7380 (diff) | |
| download | SchroederReverb-796c40a0dac68bd2bc9ccd676ad714f2fd3872fc.tar.gz SchroederReverb-796c40a0dac68bd2bc9ccd676ad714f2fd3872fc.zip | |
Add Decay
Diffstat (limited to 'src')
| -rw-r--r-- | src/DSP/CombFilter.cpp | 10 | ||||
| -rw-r--r-- | src/DSP/CombFilter.h | 6 | ||||
| -rw-r--r-- | src/DSP/SchroederReverb.cpp | 32 | ||||
| -rw-r--r-- | src/DSP/SchroederReverb.h | 2 | ||||
| -rw-r--r-- | src/PluginProcessor.cpp | 8 | ||||
| -rw-r--r-- | src/PluginProcessor.h | 1 |
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) }; |
