From b648ad9cc7b1e5e4d888ac170950b0b0df25a22d Mon Sep 17 00:00:00 2001 From: Damien Zammit Date: Wed, 20 Jul 2016 21:17:51 +1000 Subject: [PATCH] a-Delay: Smooth transition on LPF changes and set max feedback 100 --- libs/plugins/a-delay.lv2/a-delay.c | 16 +++++++++++++--- libs/plugins/a-delay.lv2/a-delay.ttl.in | 2 +- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/libs/plugins/a-delay.lv2/a-delay.c b/libs/plugins/a-delay.lv2/a-delay.c index f9ddb2a23d..b655332299 100644 --- a/libs/plugins/a-delay.lv2/a-delay.c +++ b/libs/plugins/a-delay.lv2/a-delay.c @@ -101,6 +101,7 @@ typedef struct { float syncold; float wetdryold; float delaysamplesold; + float tau; float A0, A1, A2, A3, A4, A5; float B0, B1, B2, B3, B4, B5; @@ -153,6 +154,8 @@ instantiate(const LV2_Descriptor* descriptor, adelay->srate = rate; adelay->bpmvalid = 0; + // 25Hz time constant @ 64fpp + adelay->tau = (1.0 - exp(-2.0 * M_PI * 64. * 25. / adelay->srate)); return (LV2_Handle)adelay; } @@ -222,6 +225,11 @@ to_dB(float g) { return (20.f*log10(g)); } +static inline bool +is_eq(float a, float b, float small) { + return (fabsf(a - b) < small); +} + static void clearfilter(LV2_Handle instance) { ADelay* adelay = (ADelay*)instance; @@ -345,6 +353,7 @@ run(LV2_Handle instance, uint32_t n_samples) float* const output = adelay->output; float srate = adelay->srate; + float tau = adelay->tau; uint32_t i; float in; @@ -375,14 +384,16 @@ run(LV2_Handle instance, uint32_t n_samples) if (*(adelay->divisor) != adelay->divisorold) { recalc = 1; } - if (*(adelay->lpf) != adelay->lpfold) { - lpfRbj(adelay, *(adelay->lpf), srate); + if (!is_eq(adelay->lpfold, *adelay->lpf, 0.1)) { + adelay->lpfold += tau * (*adelay->lpf - adelay->lpfold); + recalc = 1; } if (*(adelay->gain) != adelay->gainold) { recalc = 1; } if (recalc) { + lpfRbj(adelay, adelay->lpfold, srate); if (*(adelay->sync) > 0.5f && adelay->bpmvalid) { *(adelay->delaytime) = adelay->beatunit * 1000.f * 60.f / (adelay->bpm * *(adelay->divisor)); } else { @@ -413,7 +424,6 @@ run(LV2_Handle instance, uint32_t n_samples) adelay->posz = 0; } } - adelay->lpfold = *(adelay->lpf); adelay->feedbackold = *(adelay->feedback); adelay->divisorold = *(adelay->divisor); adelay->gainold = *(adelay->gain); diff --git a/libs/plugins/a-delay.lv2/a-delay.ttl.in b/libs/plugins/a-delay.lv2/a-delay.ttl.in index b321ec5d60..b962b5c987 100644 --- a/libs/plugins/a-delay.lv2/a-delay.ttl.in +++ b/libs/plugins/a-delay.lv2/a-delay.ttl.in @@ -114,7 +114,7 @@ lv2:symbol "feedback" ; lv2:default 20.000000 ; lv2:minimum 0.000000 ; - lv2:maximum 90.000000 ; + lv2:maximum 100.000000 ; unit:unit unit:pc ; ] , [