@@ -85,6 +85,9 @@ void common_hal_audiodelays_echo_construct(audiodelays_echo_obj_t *self, uint32_
85
85
}
86
86
memset (self -> echo_buffer , 0 , self -> max_echo_buffer_len );
87
87
88
+ // calculate the length of a single sample in milliseconds
89
+ self -> sample_ms = MICROPY_FLOAT_CONST (1000.0 ) / self -> sample_rate ;
90
+
88
91
// calculate everything needed for the current delay
89
92
mp_float_t f_delay_ms = synthio_block_slot_get (& self -> delay_ms );
90
93
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
127
130
}
128
131
129
132
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
+
130
136
if (self -> freq_shift ) {
131
137
// Calculate the rate of iteration over the echo buffer with 8 sub-bits
132
138
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) {
153
159
memset (self -> echo_buffer + self -> echo_buffer_len , 0 , self -> max_echo_buffer_len - self -> echo_buffer_len );
154
160
}
155
161
156
- self -> current_delay_ms = ( uint32_t ) f_delay_ms ;
162
+ self -> current_delay_ms = f_delay_ms ;
157
163
}
158
164
159
165
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 *
328
334
mp_float_t mix = synthio_block_slot_get_limited (& self -> mix , MICROPY_FLOAT_CONST (0.0 ), MICROPY_FLOAT_CONST (1.0 ));
329
335
mp_float_t decay = synthio_block_slot_get_limited (& self -> decay , MICROPY_FLOAT_CONST (0.0 ), MICROPY_FLOAT_CONST (1.0 ));
330
336
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 );
334
340
}
335
341
336
342
uint32_t echo_buf_len = self -> echo_buffer_len / sizeof (uint16_t );
0 commit comments