Fix delay plucking with interpolated read tap

This commit is contained in:
Armin 2026-07-16 00:21:14 +02:00
commit d4db11b195

View file

@ -14,9 +14,9 @@ public:
}
void setParameters(float timeMs, float fb, float mx) {
timeSamples = static_cast<int>(timeMs * 0.001f * sampleRate);
int bufMax = static_cast<int>(bufferL.size()) - 1;
timeSamples = std::clamp(timeSamples, 1, bufMax);
timeSamplesF = timeMs * 0.001f * static_cast<float>(sampleRate);
float bufMax = static_cast<float>(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<int>(bufferL.size());
int readPos = (writePos - timeSamples + bufSize) % bufSize;
float readPosF = static_cast<float>(writePos) - timeSamplesF;
while (readPosF < 0.0f) readPosF += static_cast<float>(bufSize);
float outL = bufferL[readPos];
float outR = bufferR[readPos];
int i0 = static_cast<int>(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<float> bufferL, bufferR;
int writePos = 0;
double sampleRate = 44100;
int timeSamples = 8820;
float timeSamplesF = 8820.0f;
float feedback = 0.3f;
float mix = 0.25f;
};