diff options
| author | Dominik Kaiser | 2025-09-25 20:40:18 +0200 |
|---|---|---|
| committer | Dominik Kaiser | 2025-09-25 20:40:18 +0200 |
| commit | 3254981cbeb568adfca7991700e92984e0b92f12 (patch) | |
| tree | 1eefc18f682e4ee0ca461647e5fe4b1e3fc533bf | |
| parent | d034708ad60f8fc3c9db9481e424d6eca5e2450d (diff) | |
| download | SchroederReverb-3254981cbeb568adfca7991700e92984e0b92f12.tar.gz SchroederReverb-3254981cbeb568adfca7991700e92984e0b92f12.zip | |
Implement basic CombFilter
| -rw-r--r-- | src/DSP/CombFilter.cpp | 20 | ||||
| -rw-r--r-- | src/DSP/CombFilter.h | 16 | ||||
| -rw-r--r-- | src/PluginProcessor.cpp | 8 | ||||
| -rw-r--r-- | src/PluginProcessor.h | 4 |
4 files changed, 44 insertions, 4 deletions
diff --git a/src/DSP/CombFilter.cpp b/src/DSP/CombFilter.cpp new file mode 100644 index 0000000..f7eff21 --- /dev/null +++ b/src/DSP/CombFilter.cpp @@ -0,0 +1,20 @@ +#include "CombFilter.h" + +void CombFilter::prepare(double sampleRate, int samplesPerBlock) { + int maxDelayTimeMs = 100; + int maxDelaySamples = static_cast<int>(sampleRate * maxDelayTimeMs / 1000.0); + + delayBuffer.resize(maxDelaySamples, 0.0f); + delayInSamples = static_cast<int>(sampleRate * 0.02); + delayBufferWritePos = 0; +} + +void CombFilter::process(float* sample) { + int delayBufferLength = (int)delayBuffer.size(); + int delayReadPos = (delayBufferWritePos - delayInSamples + delayBufferLength) % delayBufferLength; + float delayedSample = delayBuffer[delayReadPos]; + float out = *sample + gain * delayedSample; + delayBuffer[delayBufferWritePos] = *sample; + *sample = out; + delayBufferWritePos = (delayBufferWritePos + 1) % delayBufferLength; +} diff --git a/src/DSP/CombFilter.h b/src/DSP/CombFilter.h new file mode 100644 index 0000000..355fbd9 --- /dev/null +++ b/src/DSP/CombFilter.h @@ -0,0 +1,16 @@ +#pragma once + +#include <juce_audio_processors/juce_audio_processors.h> + +class CombFilter { +public: + void prepare(double sampleRate, int samplesPerBlock); + void reset(); + void process(float* sample); + +private: + std::vector<float> delayBuffer; + int delayBufferWritePos = 0; + int delayInSamples = 0; + float gain = 0.7f; +}; diff --git a/src/PluginProcessor.cpp b/src/PluginProcessor.cpp index 825d31a..1b4ada7 100644 --- a/src/PluginProcessor.cpp +++ b/src/PluginProcessor.cpp @@ -88,7 +88,7 @@ void SchroederReverbAudioProcessor::prepareToPlay (double sampleRate, int sample { // Use this method as the place to do any pre-playback // initialisation that you need.. - juce::ignoreUnused (sampleRate, samplesPerBlock); + combFilter.prepare(sampleRate, samplesPerBlock); } void SchroederReverbAudioProcessor::releaseResources() @@ -147,8 +147,10 @@ void SchroederReverbAudioProcessor::processBlock (juce::AudioBuffer<float>& buff // interleaved by keeping the same state. for (int channel = 0; channel < totalNumInputChannels; ++channel) { - auto* channelData = buffer.getWritePointer (channel); - juce::ignoreUnused (channelData); + auto *channelData = buffer.getWritePointer(channel); + for (int i = 0; i < buffer.getNumSamples(); ++i) { + combFilter.process(&channelData[i]); + } // ..do something to the data... } } diff --git a/src/PluginProcessor.h b/src/PluginProcessor.h index 8fcb1e5..ce21b96 100644 --- a/src/PluginProcessor.h +++ b/src/PluginProcessor.h @@ -1,6 +1,7 @@ #pragma once #include <juce_audio_processors/juce_audio_processors.h> +#include "DSP/CombFilter.h" //============================================================================== class SchroederReverbAudioProcessor final : public juce::AudioProcessor @@ -43,6 +44,7 @@ public: void setStateInformation (const void* data, int sizeInBytes) override; private: - //============================================================================== + //============================================================================== + CombFilter combFilter; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (SchroederReverbAudioProcessor) }; |
