summaryrefslogtreecommitdiff
path: root/libs/plugins
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2016-08-27 16:59:15 +0200
committerRobin Gareus <robin@gareus.org>2016-08-27 16:59:15 +0200
commitd6952445cec28c078c9947faa4ec9485a5558b58 (patch)
treea178f9be840e2c786c2bf3aa0855c902845f0e56 /libs/plugins
parent0fa1123f821c96cf47662528a3e6cf64a32f9b90 (diff)
click-free a-delay bypass/enable
Diffstat (limited to 'libs/plugins')
-rw-r--r--libs/plugins/a-delay.lv2/a-delay.c46
-rw-r--r--libs/plugins/a-delay.lv2/a-delay.ttl.in11
2 files changed, 45 insertions, 12 deletions
diff --git a/libs/plugins/a-delay.lv2/a-delay.c b/libs/plugins/a-delay.lv2/a-delay.c
index 8ad4265538..b6f7663b77 100644
--- a/libs/plugins/a-delay.lv2/a-delay.c
+++ b/libs/plugins/a-delay.lv2/a-delay.c
@@ -45,8 +45,8 @@ typedef enum {
ADELAY_FEEDBACK,
ADELAY_LPF,
ADELAY_GAIN,
-
ADELAY_DELAYTIME,
+ ADELAY_ENABLE,
} PortIndex;
@@ -79,6 +79,7 @@ typedef struct {
float* gain;
float* delaytime;
+ float* enable;
float srate;
float bpm;
@@ -154,8 +155,7 @@ 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));
+ adelay->tau = (1.0 - exp (-2.f * M_PI * 25.f / adelay->srate));
return (LV2_Handle)adelay;
}
@@ -204,6 +204,9 @@ connect_port(LV2_Handle instance,
case ADELAY_DELAYTIME:
adelay->delaytime = (float*)data;
break;
+ case ADELAY_ENABLE:
+ adelay->enable = (float*)data;
+ break;
}
}
@@ -352,8 +355,18 @@ run(LV2_Handle instance, uint32_t n_samples)
const float* const input = adelay->input;
float* const output = adelay->output;
- float srate = adelay->srate;
- float tau = adelay->tau;
+ const float srate = adelay->srate;
+ const float tau = adelay->tau;
+
+ float wetdry_target = *adelay->wetdry / 100.f;
+ float gain_target = from_dB(*adelay->gain);
+ float wetdry = adelay->wetdryold;
+ float gain = adelay->gainold;
+
+ if (*adelay->enable <= 0) {
+ wetdry_target = 0.f;
+ gain_target = 1.0;
+ }
uint32_t i;
float in;
@@ -362,6 +375,8 @@ run(LV2_Handle instance, uint32_t n_samples)
float inv;
float xfade;
int recalc;
+
+ // TODO LPF
if (*(adelay->inv) < 0.5) {
inv = -1.f;
} else {
@@ -385,10 +400,8 @@ run(LV2_Handle instance, uint32_t n_samples)
recalc = 1;
}
if (!is_eq(adelay->lpfold, *adelay->lpf, 0.1)) {
- adelay->lpfold += tau * (*adelay->lpf - adelay->lpfold);
- recalc = 1;
- }
- if (*(adelay->gain) != adelay->gainold) {
+ float tc = (1.0 - exp (-2.f * M_PI * n_samples * 25.f / adelay->srate));
+ adelay->lpfold += tc * (*adelay->lpf - adelay->lpfold);
recalc = 1;
}
@@ -419,20 +432,29 @@ run(LV2_Handle instance, uint32_t n_samples)
if (p<0) p += MAX_DELAY;
adelay->fbstate += adelay->z[p] * xfade;
}
- output[i] = from_dB(*(adelay->gain)) * ((100.-*(adelay->wetdry)) / 100. * in + *(adelay->wetdry) / 100. * -inv * runfilter(adelay, adelay->fbstate));
+
+ wetdry += tau * (wetdry_target - wetdry) + 1e-12;
+ gain += tau * (gain_target - gain) + 1e-12;
+
+ output[i] = (1.f - wetdry) * in;
+ output[i] += wetdry * -inv * runfilter(adelay, adelay->fbstate);
+ output[i] *= gain;
+
if (++(adelay->posz) >= MAX_DELAY) {
adelay->posz = 0;
}
}
+
adelay->feedbackold = *(adelay->feedback);
adelay->divisorold = *(adelay->divisor);
- adelay->gainold = *(adelay->gain);
adelay->invertold = *(adelay->inv);
adelay->timeold = *(adelay->time);
adelay->syncold = *(adelay->sync);
- adelay->wetdryold = *(adelay->wetdry);
+ adelay->wetdryold = wetdry;
+ adelay->gainold = gain;
adelay->delaytimeold = *(adelay->delaytime);
adelay->delaysamplesold = delaysamples;
+
if (recalc) {
tmp = adelay->active;
adelay->active = adelay->next;
diff --git a/libs/plugins/a-delay.lv2/a-delay.ttl.in b/libs/plugins/a-delay.lv2/a-delay.ttl.in
index 5c661ebc47..5086f53c2f 100644
--- a/libs/plugins/a-delay.lv2/a-delay.ttl.in
+++ b/libs/plugins/a-delay.lv2/a-delay.ttl.in
@@ -148,6 +148,17 @@
lv2:minimum 1.000000 ;
lv2:maximum 8000.000000 ;
unit:unit unit:ms ;
+ ] ,
+ [
+ a lv2:InputPort, lv2:ControlPort ;
+ lv2:index 12 ;
+ lv2:name "Enable" ;
+ lv2:symbol "enable" ;
+ lv2:default 1 ;
+ lv2:minimum 0 ;
+ lv2:maximum 1 ;
+ lv2:portProperty lv2:integer, lv2:toggled ;
+ lv2:designation <http://ardour.org/lv2/processing#enable>;
] ;
rdfs:comment """