Skip to content

Commit 05db339

Browse files
committed
Remove truncation of delay_ms within buffer processing loop.
1 parent 8c40c56 commit 05db339

File tree

2 files changed

+12
-5
lines changed

2 files changed

+12
-5
lines changed

shared-module/audiodelays/Echo.c

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,9 @@ void common_hal_audiodelays_echo_construct(audiodelays_echo_obj_t *self, uint32_
8585
}
8686
memset(self->echo_buffer, 0, self->max_echo_buffer_len);
8787

88+
// calculate the length of a single sample in milliseconds
89+
self->sample_ms = MICROPY_FLOAT_CONST(1000.0) / self->sample_rate;
90+
8891
// calculate everything needed for the current delay
8992
mp_float_t f_delay_ms = synthio_block_slot_get(&self->delay_ms);
9093
recalculate_delay(self, f_delay_ms);
@@ -127,6 +130,9 @@ void common_hal_audiodelays_echo_set_delay_ms(audiodelays_echo_obj_t *self, mp_o
127130
}
128131

129132
void recalculate_delay(audiodelays_echo_obj_t *self, mp_float_t f_delay_ms) {
133+
// Require that delay is at least 1 sample long
134+
f_delay_ms = MAX(f_delay_ms, self->sample_ms);
135+
130136
if (self->freq_shift) {
131137
// Calculate the rate of iteration over the echo buffer with 8 sub-bits
132138
self->echo_buffer_rate = (uint32_t)MAX(self->max_delay_ms / f_delay_ms * MICROPY_FLOAT_CONST(256.0), MICROPY_FLOAT_CONST(1.0));
@@ -153,7 +159,7 @@ void recalculate_delay(audiodelays_echo_obj_t *self, mp_float_t f_delay_ms) {
153159
memset(self->echo_buffer + self->echo_buffer_len, 0, self->max_echo_buffer_len - self->echo_buffer_len);
154160
}
155161

156-
self->current_delay_ms = (uint32_t)f_delay_ms;
162+
self->current_delay_ms = f_delay_ms;
157163
}
158164

159165
mp_obj_t common_hal_audiodelays_echo_get_decay(audiodelays_echo_obj_t *self) {
@@ -328,9 +334,9 @@ audioio_get_buffer_result_t audiodelays_echo_get_buffer(audiodelays_echo_obj_t *
328334
mp_float_t mix = synthio_block_slot_get_limited(&self->mix, MICROPY_FLOAT_CONST(0.0), MICROPY_FLOAT_CONST(1.0));
329335
mp_float_t decay = synthio_block_slot_get_limited(&self->decay, MICROPY_FLOAT_CONST(0.0), MICROPY_FLOAT_CONST(1.0));
330336

331-
uint32_t delay_ms = (uint32_t)synthio_block_slot_get(&self->delay_ms);
332-
if (self->current_delay_ms != delay_ms) {
333-
recalculate_delay(self, delay_ms);
337+
mp_float_t f_delay_ms = synthio_block_slot(&self->delay_ms);
338+
if (MICROPY_FLOAT_C_FUN(fabs)(self->current_delay_ms - f_delay_ms) >= self->sample_ms) {
339+
recalculate_delay(self, f_delay_ms);
334340
}
335341

336342
uint32_t echo_buf_len = self->echo_buffer_len / sizeof(uint16_t);

shared-module/audiodelays/Echo.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@ typedef struct {
1616
mp_obj_base_t base;
1717
uint32_t max_delay_ms;
1818
synthio_block_slot_t delay_ms;
19-
uint32_t current_delay_ms;
19+
mp_float_t current_delay_ms;
20+
mp_float_t sample_ms;
2021
synthio_block_slot_t decay;
2122
synthio_block_slot_t mix;
2223

0 commit comments

Comments
 (0)