From 0c7895298db209ce617a0933c737dc7eb9dbb82e Mon Sep 17 00:00:00 2001 From: Ben Loftis Date: Sun, 5 Jul 2020 15:24:38 -0500 Subject: [PATCH] Add Dotted option to a-delay, because dotted intervals cannot be expressed via the integer Divisor param --- libs/plugins/a-delay.lv2/a-delay.c | 14 ++++++++++++++ libs/plugins/a-delay.lv2/a-delay.ttl.in | 22 ++++++++++++++++------ 2 files changed, 30 insertions(+), 6 deletions(-) diff --git a/libs/plugins/a-delay.lv2/a-delay.c b/libs/plugins/a-delay.lv2/a-delay.c index a4b0abf49e..bef26ce4ca 100644 --- a/libs/plugins/a-delay.lv2/a-delay.c +++ b/libs/plugins/a-delay.lv2/a-delay.c @@ -53,6 +53,7 @@ typedef enum { ADELAY_SYNC, ADELAY_TIME, ADELAY_DIVISOR, + ADELAY_DOTTED, ADELAY_WETDRY, ADELAY_FEEDBACK, ADELAY_LPF, @@ -82,6 +83,7 @@ typedef struct { const LV2_Atom_Sequence* atombpm; float* inv; + float* dotted; float* sync; float* time; float* divisor; @@ -108,6 +110,7 @@ typedef struct { float feedbackold; float divisorold; float gainold; + float dottedold; float invertold; float timeold; float delaytimeold; @@ -201,6 +204,9 @@ connect_port(LV2_Handle instance, case ADELAY_DIVISOR: adelay->divisor = (float*)data; break; + case ADELAY_DOTTED: + adelay->dotted = (float*)data; + break; case ADELAY_WETDRY: adelay->wetdry = (float*)data; break; @@ -283,6 +289,7 @@ activate(LV2_Handle instance) adelay->divisorold = 0.f; adelay->gainold = 0.f; adelay->invertold = 0.f; + adelay->dottedold = 0.f; adelay->timeold = 0.f; adelay->delaytimeold = 0.f; adelay->syncold = 0.f; @@ -417,6 +424,9 @@ run(LV2_Handle instance, uint32_t n_samples) if (*(adelay->inv) != adelay->invertold) { recalc = true; } + if (*(adelay->dotted) != adelay->dottedold) { + recalc = true; + } if (*(adelay->sync) != adelay->syncold) { recalc = true; } @@ -441,6 +451,9 @@ run(LV2_Handle instance, uint32_t n_samples) lpfRbj(adelay, adelay->lpfold, srate); if (*(adelay->sync) > 0.5f && adelay->bpmvalid) { *(adelay->delaytime) = adelay->beatunit * 1000.f * 60.f / (adelay->bpm * *(adelay->divisor)); + if (*(adelay->dotted) > 0.5f) { + *(adelay->delaytime) *= 1.5; + } } else { *(adelay->delaytime) = *(adelay->time); } @@ -484,6 +497,7 @@ run(LV2_Handle instance, uint32_t n_samples) adelay->feedbackold = *(adelay->feedback); adelay->divisorold = *(adelay->divisor); adelay->invertold = *(adelay->inv); + adelay->dottedold = *(adelay->dotted); adelay->timeold = *(adelay->time); adelay->syncold = *(adelay->sync); adelay->wetdryold = wetdry; diff --git a/libs/plugins/a-delay.lv2/a-delay.ttl.in b/libs/plugins/a-delay.lv2/a-delay.ttl.in index d723a4c858..8c0f783de8 100644 --- a/libs/plugins/a-delay.lv2/a-delay.ttl.in +++ b/libs/plugins/a-delay.lv2/a-delay.ttl.in @@ -101,6 +101,16 @@ [ a lv2:InputPort, lv2:ControlPort ; lv2:index 7 ; + lv2:name "Dotted" ; + lv2:symbol "dot" ; + lv2:default 0 ; + lv2:minimum 0 ; + lv2:maximum 1 ; + lv2:portProperty lv2:integer, lv2:toggled ; + ] , + [ + a lv2:InputPort, lv2:ControlPort ; + lv2:index 8 ; lv2:name "Dry/Wet" ; lv2:symbol "drywet" ; lv2:default 50.000000 ; @@ -110,7 +120,7 @@ ] , [ a lv2:InputPort, lv2:ControlPort ; - lv2:index 8 ; + lv2:index 9 ; lv2:name "Feedback" ; lv2:symbol "feedback" ; lv2:default 20.000000 ; @@ -120,7 +130,7 @@ ] , [ a lv2:InputPort, lv2:ControlPort ; - lv2:index 9 ; + lv2:index 10 ; lv2:name "LPF" ; lv2:symbol "lpf" ; lv2:default 6000.000000 ; @@ -131,7 +141,7 @@ ] , [ a lv2:InputPort, lv2:ControlPort ; - lv2:index 10 ; + lv2:index 11 ; lv2:name "Output Gain" ; lv2:symbol "gain" ; lv2:default 0.000000 ; @@ -141,7 +151,7 @@ ] , [ a lv2:OutputPort, lv2:ControlPort ; - lv2:index 11 ; + lv2:index 12 ; lv2:name "Delaytime" ; lv2:symbol "delaytime" ; lv2:default 0.000000 ; @@ -151,7 +161,7 @@ ] , [ a lv2:InputPort, lv2:ControlPort ; - lv2:index 12 ; + lv2:index 13 ; lv2:name "Enable" ; lv2:symbol "enable" ; lv2:default 1 ; @@ -170,4 +180,4 @@ A simple delay plugin doap:maintainer ; lv2:microVersion 0 ; - lv2:minorVersion 2 . + lv2:minorVersion 3 .