Commit 2efd0bc11f4536e3c23cf2ec73311a0815ace4b2

Thomas de Grivel 2020-02-01T14:28:08

constant time delay

diff --git a/rtbuf_signal.c b/rtbuf_signal.c
index 6bb6e57..03f4794 100644
--- a/rtbuf_signal.c
+++ b/rtbuf_signal.c
@@ -30,11 +30,11 @@ const double g_rtbuf_signal_default_frequency = 220.0;
 s_rtbuf_lib_proc_in g_rtbuf_signal_delay_in[] = {
   { "signal",   RTBUF_SIGNAL_TYPE, 0.0, -1.0, 1.0 },
   { "delay",    RTBUF_SIGNAL_TYPE, 0.4, 0.0, RTBUF_SIGNAL_DELAY_MAX },
-  { "feedback", RTBUF_SIGNAL_TYPE, 0.1, 0.0, 1.0 },
+  { "feedback", RTBUF_SIGNAL_TYPE, 0.5, 0.0, 1.0 },
   { 0, 0, 0.0, 0.0, 0.0 } };
 
 s_rtbuf_lib_proc_out g_rtbuf_signal_delay_out[] = {
-  { "wet", RTBUF_SIGNAL_TYPE },
+  { "signal", RTBUF_SIGNAL_TYPE },
   { "in", RTBUF_SIGNAL_DELAY_TYPE },
   { "pos", "unsigned int" },
   { 0, 0 } };
diff --git a/rtbuf_signal_delay.c b/rtbuf_signal_delay.c
index b17e61e..a78576d 100644
--- a/rtbuf_signal_delay.c
+++ b/rtbuf_signal_delay.c
@@ -25,6 +25,7 @@ int rtbuf_signal_delay_start (s_rtbuf *rtb)
   assert(rtb->proc->out_bytes == sizeof(*data));
   data = (s_rtbuf_signal_delay_data*) rtb->data;
   bzero(data->in, sizeof(data->in));
+  data->pos = 0;
   return 0;
 }
 
@@ -37,19 +38,19 @@ int rtbuf_signal_delay (s_rtbuf *rtb)
   unsigned int i = 0;
   rtbuf_signal_fun(rtb, RTBUF_SIGNAL_DELAY_IN_SIGNAL, &in);
   rtbuf_signal_fun(rtb, RTBUF_SIGNAL_DELAY_IN_DELAY, &delay);
-  rtbuf_signal_fun(rtb, RTBUF_SIGNAL_DELAY_IN_FEEDBACK, &feedback);
+  rtbuf_signal_fun(rtb, RTBUF_SIGNAL_DELAY_IN_DELAY, &feedback);
   data = (s_rtbuf_signal_delay_data*) rtb->data;
   while (i < RTBUF_SIGNAL_SAMPLES) {
     double s = in.sample_fun(in.signal, i);
-    double d = clamp(0.0, delay.sample_fun(delay.signal, i),
-                     RTBUF_SIGNAL_DELAY_MAX);
-    double f = feedback.sample_fun(feedback.signal, i);
-    unsigned int ds = min(d * RTBUF_SIGNAL_SAMPLERATE + 1,
-                          RTBUF_SIGNAL_DELAY_SAMPLES_MAX);
-    data->signal[i] = data->in[data->pos];
-    data->in[data->pos] *= f;
-    data->in[data->pos] += s;
-    data->pos %= ds;
+    double d = min(max(0.0, delay.sample_fun(delay.signal, i)),
+                   RTBUF_SIGNAL_DELAY_MAX);
+    double fb = min(max(0.0, feedback.sample_fun(feedback.signal, i)), 1.0);
+    unsigned int ds = d * RTBUF_SIGNAL_SAMPLERATE;
+    unsigned int p = (data->pos + RTBUF_SIGNAL_DELAY_SAMPLES_MAX - ds) %
+      RTBUF_SIGNAL_DELAY_SAMPLES_MAX;
+    data->signal[i] = data->in[p];
+    data->in[data->pos++] = (1.0 - fb) * s + fb * data->in[p];
+    data->pos %= RTBUF_SIGNAL_DELAY_SAMPLES_MAX;
     i++;
   }
   return 0;
diff --git a/test_synth b/test_synth
index ea73bbe..02b2cf7 100644
--- a/test_synth
+++ b/test_synth
@@ -3,6 +3,7 @@ load glfw3
 load synth
 load dynamic
 load sndio
+
 set Keyboard00 = new glfw3 keyboard
 set ADSR00 = new synth adsr
 set Square00 = new signal square
@@ -10,9 +11,14 @@ set Synth00 = new synth synth
 bind Keyboard00 notes Synth00 notes
 bind ADSR00 signal Synth00 envelope
 bind Square00 signal Synth00 oscillator
+
+set Delay00 = new signal delay
+bind Synth00 signal Delay00 signal
+
 set Limiter00 = new dynamic limiter
-bind Synth00 signal Limiter00 signal
+bind Delay00 signal Limiter00 signal
+
 set Output = new sndio output
-bind Limiter00 signal Output left
+bind Synth00 signal Output left
 bind Limiter00 signal Output right
 start