16
16
#include "shared-bindings/util.h"
17
17
18
18
#define DECAY_DEFAULT 0.7f
19
+ #define MIX_DEFAULT 0.5f
19
20
20
21
//| class Echo:
21
22
//| """An Echo effect"""
22
23
//|
23
24
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 ) {
24
- enum { ARG_delay_ms , ARG_decay , ARG_buffer_size , ARG_sample_rate , ARG_bits_per_sample , ARG_samples_signed , ARG_channel_count , };
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
26
static const mp_arg_t allowed_args [] = {
26
27
{ MP_QSTR_delay_ms , MP_ARG_INT | MP_ARG_KW_ONLY , {.u_int = 50 } },
27
28
{ MP_QSTR_decay , MP_ARG_OBJ | MP_ARG_KW_ONLY , {.u_obj = MP_OBJ_NULL } },
29
+ { MP_QSTR_mix , MP_ARG_OBJ | MP_ARG_KW_ONLY , {.u_obj = MP_OBJ_NULL } },
28
30
{ MP_QSTR_buffer_size , MP_ARG_INT | MP_ARG_KW_ONLY , {.u_int = 1024 } },
29
31
{ MP_QSTR_sample_rate , MP_ARG_INT | MP_ARG_KW_ONLY , {.u_int = 8000 } },
30
32
{ MP_QSTR_bits_per_sample , MP_ARG_INT | MP_ARG_KW_ONLY , {.u_int = 16 } },
@@ -42,6 +44,11 @@ static mp_obj_t audiodelays_echo_make_new(const mp_obj_type_t *type, size_t n_ar
42
44
: mp_obj_get_float (args [ARG_decay ].u_obj );
43
45
mp_arg_validate_float_range (decay , 0.0f , 1.0f , MP_QSTR_decay );
44
46
47
+ mp_float_t mix = (args [ARG_mix ].u_obj == MP_OBJ_NULL )
48
+ ? (mp_float_t )MIX_DEFAULT
49
+ : mp_obj_get_float (args [ARG_mix ].u_obj );
50
+ mp_arg_validate_float_range (mix , 0.0f , 1.0f , MP_QSTR_mix );
51
+
45
52
mp_int_t channel_count = mp_arg_validate_int_range (args [ARG_channel_count ].u_int , 1 , 2 , MP_QSTR_channel_count );
46
53
mp_int_t sample_rate = mp_arg_validate_int_min (args [ARG_sample_rate ].u_int , 1 , MP_QSTR_sample_rate );
47
54
mp_int_t bits_per_sample = args [ARG_bits_per_sample ].u_int ;
@@ -50,7 +57,7 @@ static mp_obj_t audiodelays_echo_make_new(const mp_obj_type_t *type, size_t n_ar
50
57
}
51
58
52
59
audiodelays_echo_obj_t * self = mp_obj_malloc (audiodelays_echo_obj_t , & audiodelays_echo_type );
53
- common_hal_audiodelays_echo_construct (self , delay_ms , decay , args [ARG_buffer_size ].u_int , bits_per_sample , args [ARG_samples_signed ].u_bool , channel_count , sample_rate );
60
+ common_hal_audiodelays_echo_construct (self , delay_ms , decay , mix , args [ARG_buffer_size ].u_int , bits_per_sample , args [ARG_samples_signed ].u_bool , channel_count , sample_rate );
54
61
55
62
return MP_OBJ_FROM_PTR (self );
56
63
}
@@ -120,8 +127,6 @@ MP_PROPERTY_GETSET(audiodelays_echo_delay_ms_obj,
120
127
(mp_obj_t )& audiodelays_echo_get_delay_ms_obj ,
121
128
(mp_obj_t )& audiodelays_echo_set_delay_ms_obj );
122
129
123
-
124
-
125
130
//| decay: float
126
131
//| """The rate the echo decays between 0 and 1."""
127
132
static mp_obj_t audiodelays_echo_obj_get_decay (mp_obj_t self_in ) {
@@ -139,10 +144,7 @@ static mp_obj_t audiodelays_echo_obj_set_decay(size_t n_args, const mp_obj_t *po
139
144
mp_arg_parse_all (n_args - 1 , pos_args + 1 , kw_args , MP_ARRAY_SIZE (allowed_args ), allowed_args , args );
140
145
141
146
mp_float_t decay = mp_obj_get_float (args [ARG_decay ].u_obj );
142
-
143
- if (decay > 1 || decay < 0 ) {
144
- mp_raise_ValueError (MP_ERROR_TEXT ("decay must be between 0 and 1" ));
145
- }
147
+ mp_arg_validate_float_range (decay , 0.0f , 1.0f , MP_QSTR_decay );
146
148
147
149
common_hal_audiodelays_echo_set_decay (self , decay );
148
150
@@ -155,6 +157,39 @@ MP_PROPERTY_GETSET(audiodelays_echo_decay_obj,
155
157
(mp_obj_t )& audiodelays_echo_set_decay_obj );
156
158
157
159
160
+
161
+
162
+ //| mix: float
163
+ //| """The rate the echo mix between 0 and 1."""
164
+ static mp_obj_t audiodelays_echo_obj_get_mix (mp_obj_t self_in ) {
165
+ return mp_obj_new_float (common_hal_audiodelays_echo_get_mix (self_in ));
166
+ }
167
+ MP_DEFINE_CONST_FUN_OBJ_1 (audiodelays_echo_get_mix_obj , audiodelays_echo_obj_get_mix );
168
+
169
+ static mp_obj_t audiodelays_echo_obj_set_mix (size_t n_args , const mp_obj_t * pos_args , mp_map_t * kw_args ) {
170
+ enum { ARG_mix };
171
+ static const mp_arg_t allowed_args [] = {
172
+ { MP_QSTR_mix , MP_ARG_OBJ | MP_ARG_REQUIRED , {} },
173
+ };
174
+ audiodelays_echo_obj_t * self = MP_OBJ_TO_PTR (pos_args [0 ]);
175
+ mp_arg_val_t args [MP_ARRAY_SIZE (allowed_args )];
176
+ mp_arg_parse_all (n_args - 1 , pos_args + 1 , kw_args , MP_ARRAY_SIZE (allowed_args ), allowed_args , args );
177
+
178
+ mp_float_t mix = mp_obj_get_float (args [ARG_mix ].u_obj );
179
+ mp_arg_validate_float_range (mix , 0.0f , 1.0f , MP_QSTR_mix );
180
+
181
+ common_hal_audiodelays_echo_set_mix (self , mix );
182
+
183
+ return mp_const_none ;
184
+ }
185
+ MP_DEFINE_CONST_FUN_OBJ_KW (audiodelays_echo_set_mix_obj , 1 , audiodelays_echo_obj_set_mix );
186
+
187
+ MP_PROPERTY_GETSET (audiodelays_echo_mix_obj ,
188
+ (mp_obj_t )& audiodelays_echo_get_mix_obj ,
189
+ (mp_obj_t )& audiodelays_echo_set_mix_obj );
190
+
191
+
192
+
158
193
//| playing: bool
159
194
//| """True when any voice is being output. (read-only)"""
160
195
static mp_obj_t audiodelays_echo_obj_get_playing (mp_obj_t self_in ) {
@@ -196,7 +231,7 @@ static mp_obj_t audiodelays_echo_obj_play(size_t n_args, const mp_obj_t *pos_arg
196
231
}
197
232
MP_DEFINE_CONST_FUN_OBJ_KW (audiodelays_echo_play_obj , 1 , audiodelays_echo_obj_play );
198
233
199
- //| def stop_voice (self, voice: int = 0 ) -> None:
234
+ //| def stop (self) -> None:
200
235
//| """Stops playback of the sample."""
201
236
//| ...
202
237
//|
@@ -222,6 +257,7 @@ static const mp_rom_map_elem_t audiodelays_echo_locals_dict_table[] = {
222
257
{ MP_ROM_QSTR (MP_QSTR_playing ), MP_ROM_PTR (& audiodelays_echo_playing_obj ) },
223
258
{ MP_ROM_QSTR (MP_QSTR_delay_ms ), MP_ROM_PTR (& audiodelays_echo_delay_ms_obj ) },
224
259
{ MP_ROM_QSTR (MP_QSTR_decay ), MP_ROM_PTR (& audiodelays_echo_decay_obj ) },
260
+ { MP_ROM_QSTR (MP_QSTR_mix ), MP_ROM_PTR (& audiodelays_echo_mix_obj ) },
225
261
};
226
262
static MP_DEFINE_CONST_DICT (audiodelays_echo_locals_dict , audiodelays_echo_locals_dict_table ) ;
227
263
0 commit comments