Skip to content

Commit 4774807

Browse files
committed
Delay and Decay to BlockInput
1 parent d88b0c7 commit 4774807

File tree

4 files changed

+67
-63
lines changed

4 files changed

+67
-63
lines changed

shared-bindings/audiodelays/Echo.c

Lines changed: 14 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,13 @@
2222
//| """An Echo effect"""
2323
//|
2424
static mp_obj_t audiodelays_echo_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *all_args) {
25-
enum { ARG_delay_ms, ARG_decay, ARG_mix, ARG_buffer_size, ARG_sample_rate, ARG_bits_per_sample, ARG_samples_signed, ARG_channel_count, };
25+
enum { ARG_max_delay_ms, ARG_delay_ms, ARG_decay, ARG_mix, ARG_buffer_size, ARG_sample_rate, ARG_bits_per_sample, ARG_samples_signed, ARG_channel_count, };
2626
static const mp_arg_t allowed_args[] = {
27-
{ MP_QSTR_delay_ms, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 50 } },
27+
{ MP_QSTR_max_delay_ms, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 50 } },
28+
{ MP_QSTR_delay_ms, MP_ARG_OBJ | MP_ARG_KW_ONLY, {.u_obj = MP_OBJ_NULL} },
2829
{ MP_QSTR_decay, MP_ARG_OBJ | MP_ARG_KW_ONLY, {.u_obj = MP_OBJ_NULL} },
2930
{ MP_QSTR_mix, MP_ARG_OBJ | MP_ARG_KW_ONLY, {.u_obj = MP_OBJ_NULL} },
30-
{ MP_QSTR_buffer_size, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 1024} },
31+
{ MP_QSTR_buffer_size, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 512} },
3132
{ MP_QSTR_sample_rate, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 8000} },
3233
{ MP_QSTR_bits_per_sample, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 16} },
3334
{ MP_QSTR_samples_signed, MP_ARG_BOOL | MP_ARG_KW_ONLY, {.u_bool = true} },
@@ -37,12 +38,7 @@ static mp_obj_t audiodelays_echo_make_new(const mp_obj_type_t *type, size_t n_ar
3738
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
3839
mp_arg_parse_all_kw_array(n_args, n_kw, all_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
3940

40-
mp_int_t delay_ms = mp_arg_validate_int_range(args[ARG_delay_ms].u_int, 1, 4000, MP_QSTR_delay_ms);
41-
42-
mp_float_t decay = (args[ARG_decay].u_obj == MP_OBJ_NULL)
43-
? (mp_float_t)DECAY_DEFAULT
44-
: mp_obj_get_float(args[ARG_decay].u_obj);
45-
mp_arg_validate_float_range(decay, 0.0f, 1.0f, MP_QSTR_decay);
41+
mp_int_t max_delay_ms = mp_arg_validate_int_range(args[ARG_max_delay_ms].u_int, 1, 4000, MP_QSTR_max_delay_ms);
4642

4743
mp_int_t channel_count = mp_arg_validate_int_range(args[ARG_channel_count].u_int, 1, 2, MP_QSTR_channel_count);
4844
mp_int_t sample_rate = mp_arg_validate_int_min(args[ARG_sample_rate].u_int, 1, MP_QSTR_sample_rate);
@@ -52,7 +48,7 @@ static mp_obj_t audiodelays_echo_make_new(const mp_obj_type_t *type, size_t n_ar
5248
}
5349

5450
audiodelays_echo_obj_t *self = mp_obj_malloc(audiodelays_echo_obj_t, &audiodelays_echo_type);
55-
common_hal_audiodelays_echo_construct(self, delay_ms, decay, args[ARG_mix].u_obj, args[ARG_buffer_size].u_int, bits_per_sample, args[ARG_samples_signed].u_bool, channel_count, sample_rate);
51+
common_hal_audiodelays_echo_construct(self, max_delay_ms, args[ARG_delay_ms].u_obj, args[ARG_decay].u_obj, args[ARG_mix].u_obj, args[ARG_buffer_size].u_int, bits_per_sample, args[ARG_samples_signed].u_bool, channel_count, sample_rate);
5652

5753
return MP_OBJ_FROM_PTR(self);
5854
}
@@ -90,29 +86,27 @@ static mp_obj_t audiodelays_echo_obj___exit__(size_t n_args, const mp_obj_t *arg
9086
static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(audiodelays_echo___exit___obj, 4, 4, audiodelays_echo_obj___exit__);
9187

9288

93-
//| delay_ms: int
89+
//| delay_ms: BlockInput
9490
//| """Delay of the echo in microseconds. (read-only)"""
9591
//|
9692
static mp_obj_t audiodelays_echo_obj_get_delay_ms(mp_obj_t self_in) {
9793
audiodelays_echo_obj_t *self = MP_OBJ_TO_PTR(self_in);
9894

99-
return mp_obj_new_float(common_hal_audiodelays_echo_get_delay_ms(self));
95+
return common_hal_audiodelays_echo_get_delay_ms(self);
10096

10197
}
10298
MP_DEFINE_CONST_FUN_OBJ_1(audiodelays_echo_get_delay_ms_obj, audiodelays_echo_obj_get_delay_ms);
10399

104100
static mp_obj_t audiodelays_echo_obj_set_delay_ms(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
105101
enum { ARG_delay_ms };
106102
static const mp_arg_t allowed_args[] = {
107-
{ MP_QSTR_delay_ms, MP_ARG_INT | MP_ARG_REQUIRED, {} },
103+
{ MP_QSTR_delay_ms, MP_ARG_OBJ | MP_ARG_REQUIRED, {} },
108104
};
109105
audiodelays_echo_obj_t *self = MP_OBJ_TO_PTR(pos_args[0]);
110106
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
111107
mp_arg_parse_all(n_args - 1, pos_args + 1, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
112108

113-
mp_int_t delay_ms = mp_arg_validate_int_range(args[ARG_delay_ms].u_int, 1, 4000, MP_QSTR_delay_ms);
114-
115-
common_hal_audiodelays_echo_set_delay_ms(self, delay_ms);
109+
common_hal_audiodelays_echo_set_delay_ms(self, args[ARG_delay_ms].u_obj);
116110

117111
return mp_const_none;
118112
}
@@ -122,10 +116,10 @@ MP_PROPERTY_GETSET(audiodelays_echo_delay_ms_obj,
122116
(mp_obj_t)&audiodelays_echo_get_delay_ms_obj,
123117
(mp_obj_t)&audiodelays_echo_set_delay_ms_obj);
124118

125-
//| decay: float
119+
//| decay: BlockInput
126120
//| """The rate the echo decays between 0 and 1."""
127121
static mp_obj_t audiodelays_echo_obj_get_decay(mp_obj_t self_in) {
128-
return mp_obj_new_float(common_hal_audiodelays_echo_get_decay(self_in));
122+
return common_hal_audiodelays_echo_get_decay(self_in);
129123
}
130124
MP_DEFINE_CONST_FUN_OBJ_1(audiodelays_echo_get_decay_obj, audiodelays_echo_obj_get_decay);
131125

@@ -138,10 +132,7 @@ static mp_obj_t audiodelays_echo_obj_set_decay(size_t n_args, const mp_obj_t *po
138132
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
139133
mp_arg_parse_all(n_args - 1, pos_args + 1, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
140134

141-
mp_float_t decay = mp_obj_get_float(args[ARG_decay].u_obj);
142-
mp_arg_validate_float_range(decay, 0.0f, 1.0f, MP_QSTR_decay);
143-
144-
common_hal_audiodelays_echo_set_decay(self, decay);
135+
common_hal_audiodelays_echo_set_decay(self, args[ARG_decay].u_obj);
145136

146137
return mp_const_none;
147138
}
@@ -151,10 +142,7 @@ MP_PROPERTY_GETSET(audiodelays_echo_decay_obj,
151142
(mp_obj_t)&audiodelays_echo_get_decay_obj,
152143
(mp_obj_t)&audiodelays_echo_set_decay_obj);
153144

154-
155-
156-
157-
//| mix: float
145+
//| mix: BlockInput
158146
//| """The rate the echo mix between 0 and 1."""
159147
static mp_obj_t audiodelays_echo_obj_get_mix(mp_obj_t self_in) {
160148
return common_hal_audiodelays_echo_get_mix(self_in);

shared-bindings/audiodelays/Echo.h

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@
1010

1111
extern const mp_obj_type_t audiodelays_echo_type;
1212

13-
void common_hal_audiodelays_echo_construct(audiodelays_echo_obj_t *self,
14-
uint32_t delay_ms, mp_float_t decay, mp_obj_t mix,
13+
void common_hal_audiodelays_echo_construct(audiodelays_echo_obj_t *self, uint32_t max_delay_ms,
14+
mp_obj_t delay_ms, mp_obj_t decay, mp_obj_t mix,
1515
uint32_t buffer_size, uint8_t bits_per_sample, bool samples_signed,
1616
uint8_t channel_count, uint32_t sample_rate);
1717

@@ -22,11 +22,11 @@ uint32_t common_hal_audiodelays_echo_get_sample_rate(audiodelays_echo_obj_t *sel
2222
uint8_t common_hal_audiodelays_echo_get_channel_count(audiodelays_echo_obj_t *self);
2323
uint8_t common_hal_audiodelays_echo_get_bits_per_sample(audiodelays_echo_obj_t *self);
2424

25-
uint32_t common_hal_audiodelays_echo_get_delay_ms(audiodelays_echo_obj_t *self);
26-
void common_hal_audiodelays_echo_set_delay_ms(audiodelays_echo_obj_t *self, uint32_t delay_ms);
25+
mp_obj_t common_hal_audiodelays_echo_get_delay_ms(audiodelays_echo_obj_t *self);
26+
void common_hal_audiodelays_echo_set_delay_ms(audiodelays_echo_obj_t *self, mp_obj_t delay_ms);
2727

28-
mp_float_t common_hal_audiodelays_echo_get_decay(audiodelays_echo_obj_t *self);
29-
void common_hal_audiodelays_echo_set_decay(audiodelays_echo_obj_t *self, mp_float_t decay);
28+
mp_obj_t common_hal_audiodelays_echo_get_decay(audiodelays_echo_obj_t *self);
29+
void common_hal_audiodelays_echo_set_decay(audiodelays_echo_obj_t *self, mp_obj_t decay);
3030

3131
mp_obj_t common_hal_audiodelays_echo_get_mix(audiodelays_echo_obj_t *self);
3232
void common_hal_audiodelays_echo_set_mix(audiodelays_echo_obj_t *self, mp_obj_t arg);

shared-module/audiodelays/Echo.c

Lines changed: 41 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@
1010
#include "shared-module/audiomixer/utils.h"
1111

1212

13-
void common_hal_audiodelays_echo_construct(audiodelays_echo_obj_t *self, uint32_t delay_ms, mp_float_t decay, mp_obj_t mix,
13+
void common_hal_audiodelays_echo_construct(audiodelays_echo_obj_t *self, uint32_t max_delay_ms,
14+
mp_obj_t delay_ms, mp_obj_t decay, mp_obj_t mix,
1415
uint32_t buffer_size, uint8_t bits_per_sample,
1516
bool samples_signed, uint8_t channel_count, uint32_t sample_rate) {
1617

@@ -19,7 +20,6 @@ void common_hal_audiodelays_echo_construct(audiodelays_echo_obj_t *self, uint32_
1920
self->channel_count = channel_count;
2021
self->sample_rate = sample_rate;
2122

22-
// check that buffer_size <= echo_buffer_size
2323
self->buffer_len = buffer_size;
2424
self->buffer = m_malloc(self->buffer_len);
2525
if (self->buffer == NULL) {
@@ -28,23 +28,34 @@ void common_hal_audiodelays_echo_construct(audiodelays_echo_obj_t *self, uint32_
2828
}
2929
memset(self->buffer, 0, self->buffer_len);
3030

31-
self->decay = (uint16_t)(decay * (1 << 15));
31+
if (decay == MP_OBJ_NULL) {
32+
decay = mp_obj_new_float(0.7);
33+
}
34+
synthio_block_assign_slot(decay, &self->decay, MP_QSTR_decay);
35+
36+
if (delay_ms == MP_OBJ_NULL) {
37+
delay_ms = mp_obj_new_float(0.05);
38+
}
39+
synthio_block_assign_slot(delay_ms, &self->delay_ms, MP_QSTR_delay_ms);
3240

3341
if (mix == MP_OBJ_NULL) {
3442
mix = mp_obj_new_float(0.5);
3543
}
3644
synthio_block_assign_slot(mix, &self->mix, MP_QSTR_mix);
3745

3846
// calculate buffer size for the set delay
39-
self->delay_ms = delay_ms;
40-
self->echo_buffer_len = self->sample_rate / 1000.0f * self->delay_ms * (self->channel_count * (self->bits_per_sample / 8));
47+
mp_float_t f_delay_ms = synthio_block_slot_get(&self->delay_ms);
48+
self->echo_buffer_len = self->sample_rate / 1000.0f * f_delay_ms * (self->channel_count * (self->bits_per_sample / 8));
4149

42-
self->echo_buffer = m_malloc(self->echo_buffer_len);
50+
// Set the echo buffer for the max possible delay
51+
self->max_delay_ms = max_delay_ms;
52+
self->max_echo_buffer_len = self->sample_rate / 1000.0f * max_delay_ms * (self->channel_count * (self->bits_per_sample / 8));
53+
self->echo_buffer = m_malloc(self->max_echo_buffer_len);
4354
if (self->echo_buffer == NULL) {
4455
common_hal_audiodelays_echo_deinit(self);
45-
m_malloc_fail(self->echo_buffer_len);
56+
m_malloc_fail(self->max_echo_buffer_len);
4657
}
47-
memset(self->echo_buffer, 0, self->echo_buffer_len);
58+
memset(self->echo_buffer, 0, self->max_echo_buffer_len);
4859

4960
// read is where we store the incoming sample
5061
// write is what we send to the outgoing buffer
@@ -74,19 +85,15 @@ void common_hal_audiodelays_echo_deinit(audiodelays_echo_obj_t *self) {
7485
}
7586

7687

77-
uint32_t common_hal_audiodelays_echo_get_delay_ms(audiodelays_echo_obj_t *self) {
78-
return self->delay_ms;
88+
mp_obj_t common_hal_audiodelays_echo_get_delay_ms(audiodelays_echo_obj_t *self) {
89+
return self->delay_ms.obj;
7990
}
8091

81-
void common_hal_audiodelays_echo_set_delay_ms(audiodelays_echo_obj_t *self, uint32_t delay_ms) {
82-
self->delay_ms = delay_ms;
83-
self->echo_buffer_len = self->sample_rate / 1000.0f * self->delay_ms * (self->channel_count * (self->bits_per_sample / 8));
92+
void common_hal_audiodelays_echo_set_delay_ms(audiodelays_echo_obj_t *self, mp_obj_t delay_ms) {
93+
synthio_block_assign_slot(delay_ms, &self->delay_ms, MP_QSTR_delay_ms);
8494

85-
self->echo_buffer = m_realloc(self->echo_buffer, self->echo_buffer_len);
86-
if (self->echo_buffer == NULL) {
87-
common_hal_audiodelays_echo_deinit(self);
88-
m_malloc_fail(self->echo_buffer_len);
89-
}
95+
mp_float_t f_delay_ms = synthio_block_slot_get(&self->delay_ms);
96+
self->echo_buffer_len = self->sample_rate / 1000.0f * f_delay_ms * (self->channel_count * (self->bits_per_sample / 8));
9097

9198
uint32_t max_ebuf_length = self->echo_buffer_len / sizeof(uint32_t);
9299

@@ -99,12 +106,12 @@ void common_hal_audiodelays_echo_set_delay_ms(audiodelays_echo_obj_t *self, uint
99106
}
100107
}
101108

102-
mp_float_t common_hal_audiodelays_echo_get_decay(audiodelays_echo_obj_t *self) {
103-
return (mp_float_t)self->decay / (1 << 15);
109+
mp_obj_t common_hal_audiodelays_echo_get_decay(audiodelays_echo_obj_t *self) {
110+
return self->decay.obj;
104111
}
105112

106-
void common_hal_audiodelays_echo_set_decay(audiodelays_echo_obj_t *self, mp_float_t decay) {
107-
self->decay = (uint16_t)(decay * (1 << 15));
113+
void common_hal_audiodelays_echo_set_decay(audiodelays_echo_obj_t *self, mp_obj_t decay) {
114+
synthio_block_assign_slot(decay, &self->decay, MP_QSTR_decay);
108115
}
109116

110117
mp_obj_t common_hal_audiodelays_echo_get_mix(audiodelays_echo_obj_t *self) {
@@ -169,8 +176,6 @@ void common_hal_audiodelays_echo_play(audiodelays_echo_obj_t *self, mp_obj_t sam
169176

170177
void common_hal_audiodelays_echo_stop(audiodelays_echo_obj_t *self) {
171178
self->sample = NULL;
172-
// memset(self->echo_buffer, 0, self->echo_buffer_len); // clear echo
173-
// memset(self->buffer, 0, self->buffer_len);
174179
return;
175180
}
176181

@@ -188,6 +193,14 @@ audioio_get_buffer_result_t audiodelays_echo_get_buffer(audiodelays_echo_obj_t *
188193
}
189194
uint16_t mix = (uint16_t)(f_mix * (1 << 15));
190195

196+
mp_float_t f_decay = synthio_block_slot_get(&self->decay);
197+
if (f_decay > 1.0) {
198+
f_decay = 1.0;
199+
} else if (f_decay < 0.0) {
200+
f_decay = 0.0;
201+
}
202+
uint16_t decay = (uint16_t)(f_decay * (1 << 15));
203+
191204
while (length != 0) {
192205
if (self->sample_buffer_length == 0) {
193206
if (!self->more_data) {
@@ -219,7 +232,7 @@ audioio_get_buffer_result_t audiodelays_echo_get_buffer(audiodelays_echo_obj_t *
219232
// sample signed/unsigned won't matter as we have no sample
220233
for (uint32_t i = 0; i < length; i++) {
221234
uint32_t echo = self->echo_buffer[self->echo_buffer_read_pos++];
222-
word_buffer[i] = mult16signed(echo, self->decay);
235+
word_buffer[i] = mult16signed(echo, decay);
223236
self->echo_buffer[self->echo_buffer_write_pos++] = word_buffer[i];
224237

225238
word_buffer[i] = mult16signed(word_buffer[i], mix);
@@ -238,7 +251,7 @@ audioio_get_buffer_result_t audiodelays_echo_get_buffer(audiodelays_echo_obj_t *
238251
uint16_t *echo_hsrc = (uint16_t *)self->echo_buffer;
239252
for (uint32_t i = 0; i < length * 2; i++) {
240253
uint32_t echo_word = unpack8(echo_hsrc[i]);
241-
echo_word = mult16signed(echo_word, self->decay);
254+
echo_word = mult16signed(echo_word, decay);
242255
hword_buffer[i] = pack8(echo_word);
243256

244257
echo_hsrc[self->echo_buffer_write_pos++] = hword_buffer[i];
@@ -267,7 +280,7 @@ audioio_get_buffer_result_t audiodelays_echo_get_buffer(audiodelays_echo_obj_t *
267280
sample_word = tosigned16(sample_word);
268281
}
269282
uint32_t echo = self->echo_buffer[self->echo_buffer_read_pos++];
270-
word_buffer[i] = add16signed(mult16signed(echo, self->decay), sample_word);
283+
word_buffer[i] = add16signed(mult16signed(echo, decay), sample_word);
271284
self->echo_buffer[self->echo_buffer_write_pos++] = word_buffer[i];
272285

273286
word_buffer[i] = add16signed(mult16signed(sample_word, 32768 - mix), mult16signed(word_buffer[i], mix));
@@ -290,7 +303,7 @@ audioio_get_buffer_result_t audiodelays_echo_get_buffer(audiodelays_echo_obj_t *
290303
if (MP_LIKELY(!self->samples_signed)) {
291304
sample_word = tosigned16(sample_word);
292305
}
293-
echo_word = mult16signed(echo_word, self->decay);
306+
echo_word = mult16signed(echo_word, decay);
294307
sample_word = add16signed(sample_word, echo_word);
295308
hword_buffer[i] = pack8(sample_word);
296309

shared-module/audiodelays/Echo.h

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,16 +14,18 @@ extern const mp_obj_type_t audiodelays_echo_type;
1414

1515
typedef struct {
1616
mp_obj_base_t base;
17-
uint32_t delay_ms;
18-
uint16_t decay;
17+
uint32_t max_delay_ms;
18+
synthio_block_slot_t delay_ms;
19+
synthio_block_slot_t decay;
1920
synthio_block_slot_t mix;
21+
2022
uint8_t bits_per_sample;
2123
bool samples_signed;
2224
uint8_t channel_count;
2325
uint32_t sample_rate;
2426

2527
uint32_t *buffer;
26-
uint32_t buffer_len; // buffer in bytes
28+
uint32_t buffer_len; // max buffer in bytes
2729

2830
uint32_t *sample_remaining_buffer;
2931
uint32_t sample_buffer_length;
@@ -33,6 +35,7 @@ typedef struct {
3335

3436
uint32_t *echo_buffer;
3537
uint32_t echo_buffer_len; // bytes
38+
uint32_t max_echo_buffer_len; // bytes
3639

3740
uint32_t echo_buffer_read_pos; // words
3841
uint32_t echo_buffer_write_pos; // words

0 commit comments

Comments
 (0)