a-Delay: Smooth transition on LPF changes and set max feedback 100
authorDamien Zammit <damien@zamaudio.com>
Wed, 20 Jul 2016 11:17:51 +0000 (21:17 +1000)
committerDamien Zammit <damien@zamaudio.com>
Wed, 20 Jul 2016 11:17:51 +0000 (21:17 +1000)
libs/plugins/a-delay.lv2/a-delay.c
libs/plugins/a-delay.lv2/a-delay.ttl.in

index f9ddb2a23d96c692960493a130afc29153564f73..b655332299d4986964eb34ed9e0a8a1f01c33bf1 100644 (file)
@@ -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);
index b321ec5d60577e521045c98543727a38119d6167..b962b5c987e4b3686957a4da24753bb1fd8e3f32 100644 (file)
         lv2:symbol "feedback" ;
         lv2:default 20.000000 ;
         lv2:minimum 0.000000 ;
-        lv2:maximum 90.000000 ;
+        lv2:maximum 100.000000 ;
         unit:unit unit:pc ;
     ] ,
     [