summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDamien Zammit <damien@zamaudio.com>2015-11-10 17:15:19 +1100
committerDamien Zammit <damien@zamaudio.com>2015-11-10 17:15:19 +1100
commit16cbf34fc1fd7dc9fc55150c85e064926b0d38f2 (patch)
tree7ce02aa1ee0a8170e4387a6674e59c102a0bb10d
parent21c4294ecc600f1295e848aaa1ddb5567dcc2643 (diff)
Use delayorama style buffering
Signed-off-by: Damien Zammit <damien@zamaudio.com>
-rw-r--r--plugins/ZamDelay/ZamDelayPlugin.cpp130
-rw-r--r--plugins/ZamDelay/ZamDelayPlugin.hpp9
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;