From d4db11b195f70933ab4fda59d7d8becb2d06a4dd Mon Sep 17 00:00:00 2001 From: Armin Date: Thu, 16 Jul 2026 00:21:14 +0200 Subject: [PATCH] Fix delay plucking with interpolated read tap --- Source/DSP/Delay.h | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/Source/DSP/Delay.h b/Source/DSP/Delay.h index 5cfd08d..5f74946 100644 --- a/Source/DSP/Delay.h +++ b/Source/DSP/Delay.h @@ -14,9 +14,9 @@ public: } 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); + timeSamplesF = timeMs * 0.001f * static_cast(sampleRate); + float bufMax = static_cast(bufferL.size()) - 1.0f; + timeSamplesF = std::clamp(timeSamplesF, 1.0f, bufMax); feedback = std::clamp(fb, 0.0f, 0.95f); mix = std::clamp(mx, 0.0f, 1.0f); } @@ -24,10 +24,15 @@ public: void process(float& left, float& right) { int bufSize = static_cast(bufferL.size()); - int readPos = (writePos - timeSamples + bufSize) % bufSize; + float readPosF = static_cast(writePos) - timeSamplesF; + while (readPosF < 0.0f) readPosF += static_cast(bufSize); - float outL = bufferL[readPos]; - float outR = bufferR[readPos]; + int i0 = static_cast(readPosF) % bufSize; + int i1 = (i0 + 1) % bufSize; + float frac = readPosF - std::floor(readPosF); + + float outL = bufferL[i0] * (1.0f - frac) + bufferL[i1] * frac; + float outR = bufferR[i0] * (1.0f - frac) + bufferR[i1] * frac; bufferL[writePos] = left + outL * feedback; bufferR[writePos] = right + outR * feedback; @@ -42,7 +47,7 @@ private: std::vector bufferL, bufferR; int writePos = 0; double sampleRate = 44100; - int timeSamples = 8820; + float timeSamplesF = 8820.0f; float feedback = 0.3f; float mix = 0.25f; };