#pragma once #include #include /** * When ignoring wrap, inputIndex > outputIndex. * so output "pull up the rear", reading the samples that were written * delayTime samples ago. */ class FractionalDelay { public: FractionalDelay(int numSamples) : numSamples(numSamples), delayMemory( new float[numSamples]) { for (int i = 0; i < numSamples; ++i) { delayMemory[i] = 0; } } ~FractionalDelay() { delete[] delayMemory; } void setDelay(float samples) { assert(samples < numSamples); delayTime = samples; } float run(float input) { float ret = getOutput(); setInput(input); return ret; } protected: /** * get the fractional delayed output, based in delayTime */ float getOutput(); /** * send the next input to the delay line */ void setInput(float); private: /** * get delay output with integer (non-fractional) delay time */ float getDelayedOutput(int delaySamples); double delayTime = 0; int inputPointerIndex = 0; /** * The size of the delay line, in samples */ const int numSamples; float* delayMemory; }; class RecirculatingFractionalDelay : public FractionalDelay { public: RecirculatingFractionalDelay(int numSamples) : FractionalDelay(numSamples) { } #if 0 void setDelay(float samples) { delay.setDelay(samples); } #endif void setFeedback(float in_feedback) { assert(feedback < 1); assert(feedback > -1); feedback = in_feedback; } float run(float); private: // FractionalDelay delay; float feedback = 0; };