2026-07-13 20:57:38 +02:00
|
|
|
#pragma once
|
|
|
|
|
#include <vector>
|
|
|
|
|
#include <algorithm>
|
|
|
|
|
#include <cmath>
|
|
|
|
|
|
|
|
|
|
class Delay {
|
|
|
|
|
public:
|
|
|
|
|
void prepare(double sr) {
|
|
|
|
|
sampleRate = sr;
|
|
|
|
|
int maxSamples = static_cast<int>(sr * 2.0);
|
|
|
|
|
bufferL.resize(maxSamples, 0.0f);
|
|
|
|
|
bufferR.resize(maxSamples, 0.0f);
|
|
|
|
|
writePos = 0;
|
|
|
|
|
}
|
|
|
|
|
|
2026-07-14 00:35:26 +02:00
|
|
|
void setParameters(float timeMs, float fb, float mx) {
|
2026-07-13 20:57:38 +02:00
|
|
|
timeSamples = static_cast<int>(timeMs * 0.001f * sampleRate);
|
|
|
|
|
int bufMax = static_cast<int>(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<int>(bufferL.size());
|
|
|
|
|
|
2026-07-14 00:35:26 +02:00
|
|
|
int readPos = (writePos - timeSamples + bufSize) % bufSize;
|
2026-07-13 20:57:38 +02:00
|
|
|
|
2026-07-14 00:35:26 +02:00
|
|
|
float outL = bufferL[readPos];
|
|
|
|
|
float outR = bufferR[readPos];
|
2026-07-13 20:57:38 +02:00
|
|
|
|
2026-07-14 00:35:26 +02:00
|
|
|
bufferL[writePos] = left + outL * feedback;
|
|
|
|
|
bufferR[writePos] = right + outR * feedback;
|
2026-07-13 20:57:38 +02:00
|
|
|
|
2026-07-14 00:35:26 +02:00
|
|
|
writePos = (writePos + 1) % bufSize;
|
2026-07-13 20:57:38 +02:00
|
|
|
|
2026-07-14 00:35:26 +02:00
|
|
|
left = left * (1.0f - mix) + outL * mix;
|
|
|
|
|
right = right * (1.0f - mix) + outR * mix;
|
2026-07-13 20:57:38 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
std::vector<float> bufferL, bufferR;
|
|
|
|
|
int writePos = 0;
|
|
|
|
|
double sampleRate = 44100;
|
|
|
|
|
int timeSamples = 8820;
|
|
|
|
|
float feedback = 0.3f;
|
|
|
|
|
float mix = 0.25f;
|
|
|
|
|
};
|