diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/DSP/Delay.cpp | 37 | ||||
| -rw-r--r-- | src/DSP/Delay.h | 18 | ||||
| -rw-r--r-- | src/DSP/SchroederReverb.cpp | 7 | ||||
| -rw-r--r-- | src/DSP/SchroederReverb.h | 4 | ||||
| -rw-r--r-- | src/PluginProcessor.cpp | 9 | ||||
| -rw-r--r-- | src/PluginProcessor.h | 4 |
6 files changed, 79 insertions, 0 deletions
diff --git a/src/DSP/Delay.cpp b/src/DSP/Delay.cpp new file mode 100644 index 0000000..50c310a --- /dev/null +++ b/src/DSP/Delay.cpp @@ -0,0 +1,37 @@ +#include "Delay.h" + +void +Delay::prepare(double sampleRate, int samplesPerBlock) +{ + int maxDelayTimeMs = 2000; + int maxDelaySamples = static_cast<int>(sampleRate * maxDelayTimeMs / 1000.0); + + delayBuffer.resize(maxDelaySamples, 0.0f); + std::fill(delayBuffer.begin(), delayBuffer.end(), 0.0f); + delayBufferWritePos = 0; + this->sampleRate = sampleRate; +} + +void +Delay::process(float& sample) +{ + if (delayInSamples == 0) + { + return; + } + int delayBufferLength = (int)delayBuffer.size(); + int delayReadPos + = (delayBufferWritePos - delayInSamples + delayBufferLength) % delayBufferLength; + float delayedSample = delayBuffer[delayReadPos]; + + delayBuffer[delayBufferWritePos] = sample; + sample = delayedSample; + + delayBufferWritePos = (delayBufferWritePos + 1) % delayBufferLength; +} + +void +Delay::setDelayMs(float ms) +{ + delayInSamples = static_cast<int>(sampleRate * (ms / 1000.0f)); +} diff --git a/src/DSP/Delay.h b/src/DSP/Delay.h new file mode 100644 index 0000000..e8bd2f1 --- /dev/null +++ b/src/DSP/Delay.h @@ -0,0 +1,18 @@ +#pragma once + +#include <juce_audio_processors/juce_audio_processors.h> + +class Delay +{ + public: + void prepare(double sampleRate, int samplesPerBlock); + void reset(); + void process(float& sample); + void setDelayMs(float ms); + + private: + std::vector<float> delayBuffer; + int delayBufferWritePos = 0; + int delayInSamples = 0; + double sampleRate = 0.0; +}; diff --git a/src/DSP/SchroederReverb.cpp b/src/DSP/SchroederReverb.cpp index 1b84712..87aa3c4 100644 --- a/src/DSP/SchroederReverb.cpp +++ b/src/DSP/SchroederReverb.cpp @@ -19,6 +19,7 @@ SchroederReverb::process(float& sample, float dryWetMix, float decayFactor) float in = sample; + preDelay.process(in); float cf0in = in; float cf1in = in; @@ -36,3 +37,9 @@ SchroederReverb::process(float& sample, float dryWetMix, float decayFactor) sample = dryWetMix * allPassIn + (1.0f - dryWetMix) * sample; } + +void +SchroederReverb::setPreDelayMs(float ms) +{ + preDelay.setDelayMs(ms); +} diff --git a/src/DSP/SchroederReverb.h b/src/DSP/SchroederReverb.h index 2d5cd0b..5f1b7b1 100644 --- a/src/DSP/SchroederReverb.h +++ b/src/DSP/SchroederReverb.h @@ -2,6 +2,7 @@ #include "AllPassFilter.h" #include "CombFilter.h" +#include "Delay.h" #include <juce_audio_processors/juce_audio_processors.h> class SchroederReverb @@ -11,7 +12,10 @@ class SchroederReverb void reset(); void process(float& sample, float dryWetMix, float decayFactor); + void setPreDelayMs(float ms); + private: CombFilter combFilter0, combFilter1, combFilter2, combFilter3; AllPassFilter allPassFilter0, allPassFilter1; + Delay preDelay; }; diff --git a/src/PluginProcessor.cpp b/src/PluginProcessor.cpp index f10065f..768dda0 100644 --- a/src/PluginProcessor.cpp +++ b/src/PluginProcessor.cpp @@ -9,6 +9,8 @@ SchroederReverbAudioProcessor::SchroederReverbAudioProcessor() { 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)); + addParameter(preDelay + = new juce::AudioParameterFloat("predelay", "Pre-Delay", 0.0f, 0.2f, 0.0f)); } SchroederReverbAudioProcessor::~SchroederReverbAudioProcessor() {} @@ -104,6 +106,13 @@ SchroederReverbAudioProcessor::processBlock(juce::AudioBuffer<float>& buffer, int totalNumInputChannels = getTotalNumInputChannels(); int totalNumOutputChannels = getTotalNumOutputChannels(); + float currentPreDelay = preDelay->get(); + if (currentPreDelay != lastPreDelay) + { + schroederReverb.setPreDelayMs(currentPreDelay * 1000.0f); + lastPreDelay = currentPreDelay; + } + // Clear extra channels for (int i = totalNumInputChannels; i < totalNumOutputChannels; ++i) buffer.clear(i, 0, buffer.getNumSamples()); diff --git a/src/PluginProcessor.h b/src/PluginProcessor.h index f6e6f5d..00b18d0 100644 --- a/src/PluginProcessor.h +++ b/src/PluginProcessor.h @@ -50,5 +50,9 @@ class SchroederReverbAudioProcessor final : public juce::AudioProcessor SchroederReverb schroederReverb; juce::AudioParameterFloat* dryWetMix; juce::AudioParameterFloat* decayFactor; + juce::AudioParameterFloat* preDelay; + + float lastPreDelay = 0.0f; + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(SchroederReverbAudioProcessor) }; |
