mirror of
https://codeberg.org/armin/chromaflock.git
synced 2026-09-01 20:30:47 +02:00
Fix delay plucking with interpolated read tap
This commit is contained in:
parent
c632bda92f
commit
d4db11b195
1 changed files with 12 additions and 7 deletions
|
|
@ -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;
|
||||
};
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue