summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDamien Zammit <damien@zamaudio.com>2016-07-20 21:17:51 +1000
committerDamien Zammit <damien@zamaudio.com>2016-07-20 21:17:51 +1000
commitb648ad9cc7b1e5e4d888ac170950b0b0df25a22d (patch)
tree157eecbeae63e77070a581b75ee099cad5dd320d
parent62cd4d43bf75c6f1045754edc0b543358c598574 (diff)
a-Delay: Smooth transition on LPF changes and set max feedback 100
-rw-r--r--libs/plugins/a-delay.lv2/a-delay.c16
-rw-r--r--libs/plugins/a-delay.lv2/a-delay.ttl.in2
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 ;
] ,
[