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