#include "ModulatedCombFilter.h" template ModulatedCombFilter::ModulatedCombFilter() { } template ModulatedCombFilter::~ModulatedCombFilter() { } template void ModulatedCombFilter::prepare(SampleType sampleRate) { this->sampleRate = sampleRate; combFilter.prepare(sampleRate); combFilter.setDelayMs(delayTime); combFilter.setFeedback(feedback); lfo.prepare(sampleRate); lfo.setWaveformType(LFO::Waveforms::Sine); } template void ModulatedCombFilter::setDelayMs(SampleType delayInMs) { this->delayTime = delayInMs; } template void ModulatedCombFilter::setDelayInSamples(SampleType delayInSamples) { this->delayTime = (delayInSamples / sampleRate) * 1000.0; } template void ModulatedCombFilter::setFeedback(SampleType newFeedback) { this->feedback = newFeedback; combFilter.setFeedback(this->feedback); } template void ModulatedCombFilter::setRate(SampleType newRate) { this->rate = newRate; lfo.setFrequency(this->rate); } template void ModulatedCombFilter::setDepth(SampleType newDepth) { this->depth = newDepth; } template void ModulatedCombFilter::setWidth(SampleType newWidth) { this->width = newWidth; } template SampleType ModulatedCombFilter::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)); combFilter.setDelaySamples(newDelTime); SampleType output = combFilter.processSample(input); return output; } template void ModulatedCombFilter::process(SampleType* data, int startSample, int endSample) { for(int sample = startSample; sample < endSample; ++sample) data[sample] = processSample(data[sample]); } template SampleType ModulatedCombFilter::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 ModulatedCombFilter::bipolarToUnipolar(SampleType value) { return 0.5 * value + 0.5; } template class ModulatedCombFilter; template class ModulatedCombFilter;