#pragma once #include #include #include class Delay { public: void prepare(double sr) { sampleRate = sr; int maxSamples = static_cast(sr * 2.0); bufferL.resize(maxSamples, 0.0f); bufferR.resize(maxSamples, 0.0f); writePos = 0; } void setParameters(float timeMs, float fb, float mx) { timeSamples = static_cast(timeMs * 0.001f * sampleRate); int bufMax = static_cast(bufferL.size()) - 1; timeSamples = std::clamp(timeSamples, 1, bufMax); feedback = std::clamp(fb, 0.0f, 0.95f); mix = std::clamp(mx, 0.0f, 1.0f); } void process(float& left, float& right) { int bufSize = static_cast(bufferL.size()); int readPos = (writePos - timeSamples + bufSize) % bufSize; float outL = bufferL[readPos]; float outR = bufferR[readPos]; bufferL[writePos] = left + outL * feedback; bufferR[writePos] = right + outR * feedback; writePos = (writePos + 1) % bufSize; left = left * (1.0f - mix) + outL * mix; right = right * (1.0f - mix) + outR * mix; } private: std::vector bufferL, bufferR; int writePos = 0; double sampleRate = 44100; int timeSamples = 8820; float feedback = 0.3f; float mix = 0.25f; };