diff options
author | Damien Zammit <damien@zamaudio.com> | 2015-11-10 17:15:19 +1100 |
---|---|---|
committer | Damien Zammit <damien@zamaudio.com> | 2015-11-10 17:15:19 +1100 |
commit | 16cbf34fc1fd7dc9fc55150c85e064926b0d38f2 (patch) | |
tree | 7ce02aa1ee0a8170e4387a6674e59c102a0bb10d | |
parent | 21c4294ecc600f1295e848aaa1ddb5567dcc2643 (diff) |
Use delayorama style buffering
Signed-off-by: Damien Zammit <damien@zamaudio.com>
-rw-r--r-- | plugins/ZamDelay/ZamDelayPlugin.cpp | 130 | ||||
-rw-r--r-- | plugins/ZamDelay/ZamDelayPlugin.hpp | 9 |
2 files changed, 90 insertions, 49 deletions
diff --git a/plugins/ZamDelay/ZamDelayPlugin.cpp b/plugins/ZamDelay/ZamDelayPlugin.cpp index f8ad0e1..141dffd 100644 --- a/plugins/ZamDelay/ZamDelayPlugin.cpp +++ b/plugins/ZamDelay/ZamDelayPlugin.cpp @@ -231,9 +231,23 @@ void ZamDelayPlugin::activate() z[i] = 0.f; } posz = 0; + tap[0] = 0; + tap[1] = 0; + active = 0; + next = 1; age = 0; clearfilter(); fbstate = 0.f; + + lpfold = 0.f; + divisorold = 0.f; + gainold = 0.f; + invertold = 0.f; + delaytimeold = 0.f; + syncold = 0.f; + drywetold = 0.f; + delaytimeoutold = 0.f; + delaysamplesold = 1.f; } @@ -282,59 +296,25 @@ float ZamDelayPlugin::runfilter(float in) return out; } -float ZamDelayPlugin::getsample(float dline[], int pos, int a, int max) -{ - if (a < max) { - return 0.; - } - int p = pos + 1; - if (p >= max) { - p = 0; - } - - return dline[p]; -} - -void ZamDelayPlugin::pushsample(float in, float dline[], int *pos, int *a, int max) -{ - static int oldmax = 1; - int i; - if (max != oldmax) { - clearfilter(); - for (i = 0; i < MAX(max, oldmax); i++) { - dline[i] = 0.; - } - *a = 0; - fbstate = 0.; - oldmax = max; - } - (*pos)++; - if (*pos >= max) { - *pos = 0; - } - (*a)++; - if (*a >= max) { - *a = max; - } - dline[*pos] = in; -} - void ZamDelayPlugin::run(const float** inputs, float** outputs, uint32_t frames) { uint32_t i; - float in; + float in, out; float srate = getSampleRate(); TimePosition t = getTimePosition(); float bpm = 120.f; int delaysamples; + unsigned int tmp; float inv; - float filtered; + float xfade; + int recalc; if (invert < 0.5) { inv = -1.f; } else { inv = 1.f; } - + + recalc = 0; delaytimeout = delaytime; if (t.bbt.valid) { bpm = t.bbt.beatsPerMinute; @@ -345,14 +325,72 @@ void ZamDelayPlugin::run(const float** inputs, float** outputs, uint32_t frames) } delaysamples = (int)(delaytimeout * srate) / 1000; - lpfRbj(lpf, srate); + if (lpf != lpfold) { + lpfRbj(lpf, srate); + recalc = 1; + } + if (divisor != divisorold) { + recalc = 1; + } + if (gain != gainold) { + recalc = 1; + } + if (invert != invertold) { + recalc = 1; + } + if (delaytime != delaytimeold) { + recalc = 1; + } + if (sync != syncold) { + recalc = 1; + } + if (drywet != drywetold) { + recalc = 1; + } + if (delaytimeout != delaytimeoutold) { + recalc = 1; + } + if (recalc) { + tap[next] = delaysamples; + clearfilter(); + } + + xfade = 0.f; for (i = 0; i < frames; i++) { - in = (1. - feedb) * inputs[0][i] + feedb * fbstate; - filtered = runfilter(getsample(&z[0], posz, age, delaysamples)); - fbstate = ((1. - drywet) * in) + drywet * -inv * filtered; - outputs[0][i] = fbstate * from_dB(gain); - pushsample(in, &z[0], &posz, &age, delaysamples); + in = inputs[0][i]; + z[posz] = in + feedb * fbstate; + out = 0.f; + int p = posz - tap[active]; // active line + if (p<0) p += MAX_DELAY; + out += runfilter(z[p]); + + if (recalc) { + xfade += 1.0f / (float)frames; + out *= (1.-xfade); + int p = posz - tap[next]; // next line + if (p<0) p += MAX_DELAY; + out += runfilter(z[p]) * xfade; + } + fbstate = from_dB(gain) * (((1. - drywet) * in) + drywet * -inv * out); + outputs[0][i] = fbstate; + if (++posz >= MAX_DELAY) { + posz = 0; + } + } + lpfold = lpf; + divisorold = divisor; + gainold = gain; + invertold = invert; + delaytimeold = delaytime; + syncold = sync; + drywetold = drywet; + delaytimeoutold = delaytimeout; + delaysamplesold = delaysamples; + if (recalc) { + tmp = active; + active = next; + next = tmp; } } diff --git a/plugins/ZamDelay/ZamDelayPlugin.hpp b/plugins/ZamDelay/ZamDelayPlugin.hpp index 06a95ba..b9b61af 100644 --- a/plugins/ZamDelay/ZamDelayPlugin.hpp +++ b/plugins/ZamDelay/ZamDelayPlugin.hpp @@ -112,8 +112,6 @@ protected: void activate() override; void run(const float** inputs, float** outputs, uint32_t frames) override; - void pushsample(float in, float dline[], int *pos, int *a, int max); - float getsample(float dline[], int pos, int age, int max); void clearfilter(void); void lpfRbj(float fc, float srate); float runfilter(float in); @@ -122,8 +120,13 @@ protected: private: float invert, feedb, delaytime, sync, lpf, divisor, gain, drywet, delaytimeout; + float invertold, feedbold, delaytimeold, syncold, lpfold, divisorold, gainold, drywetold, delaytimeoutold, delaysamplesold; float z[MAX_DELAY]; - int posz, age; + unsigned int posz; + unsigned int tap[2]; + int active; + int next; + int age; float A0, A1, A2, A3, A4, A5, B0, B1, B2, B3, B4, B5; float state[4]; float fbstate; |