#include "ModulatedAllPassFilter.h" template ModulatedAllPassFilter::ModulatedAllPassFilter() { } template ModulatedAllPassFilter::~ModulatedAllPassFilter() { } template void ModulatedAllPassFilter::prepare(SampleType sampleRate) { this->sampleRate = sampleRate; allPassFilter.prepare(sampleRate); allPassFilter.setDelayMs(delayTime); allPassFilter.setFeedback(feedback); lfo.prepare(sampleRate); lfo.setWaveformType(LFO::Waveforms::Sine); } template void ModulatedAllPassFilter::setDelayMs(SampleType delayInMs) { this->delayTime = delayInMs; } template void ModulatedAllPassFilter::setDelayInSamples(SampleType delayInSamples) { this->delayTime = (delayInSamples / sampleRate) * 1000.0; } template void ModulatedAllPassFilter::setFeedback(SampleType newFeedback) { this->feedback = newFeedback; allPassFilter.setFeedback(this->feedback); } template void ModulatedAllPassFilter::setRate(SampleType newRate) { this->rate = newRate; lfo.setFrequency(this->rate); } template void ModulatedAllPassFilter::setDepth(SampleType newDepth) { this->depth = newDepth; } template void ModulatedAllPassFilter::setWidth(SampleType newWidth) { this->width = newWidth; } template SampleType ModulatedAllPassFilter::processSample(SampleType input) { SampleType minDelay = ((this->delayTime / 1000) * sampleRate) - width; SampleType maxDelay = ((this->delayTime / 1000) * sampleRate) + width; SampleType modMin = minDelay; SampleType modMax = maxDelay; SampleType newDelTime = (doUnipolarModulationFromMin(bipolarToUnipolar(depth * lfo.getNextOutputSample(LFO::LFOPhase::Normal)), modMin, modMax)); allPassFilter.setDelaySamples(newDelTime); SampleType output = allPassFilter.processSample(input); return output; } template void ModulatedAllPassFilter::process(SampleType* data, int startSample, int endSample) { for(int sample = startSample; sample < endSample; ++sample) data[sample] = processSample(data[sample]); } template SampleType ModulatedAllPassFilter::doUnipolarModulationFromMin(SampleType unipolarModulatorValue, SampleType minValue, SampleType maxValue) { // --- UNIPOLAR bound unipolarModulatorValue = fmin(unipolarModulatorValue, 1.0f); unipolarModulatorValue = fmax(unipolarModulatorValue, 0.0f); // --- modulate from minimum value upwards return unipolarModulatorValue * (maxValue - minValue) + minValue; } template SampleType ModulatedAllPassFilter::bipolarToUnipolar(SampleType value) { return 0.5 * value + 0.5; } template class ModulatedAllPassFilter; template class ModulatedAllPassFilter;