diff options
Diffstat (limited to 'plugins/ZamDelay/ZamDelayPlugin.cpp')
-rw-r--r-- | plugins/ZamDelay/ZamDelayPlugin.cpp | 130 |
1 files changed, 84 insertions, 46 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; } } |