Skip to content

Commit 59d48c8

Browse files
committed
Add mutli-tap functionality.
1 parent 1bf769a commit 59d48c8

File tree

5 files changed

+222
-31
lines changed

5 files changed

+222
-31
lines changed

locale/circuitpython.pot

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,10 @@ msgstr ""
102102
msgid "%q failure: %d"
103103
msgstr ""
104104

105+
#: shared-module/audiodelays/MultiTapDelay.c
106+
msgid "%q in %q must be of type %q or %q, not %q"
107+
msgstr ""
108+
105109
#: py/argcheck.c shared-module/audiofilters/Filter.c
106110
msgid "%q in %q must be of type %q, not %q"
107111
msgstr ""
@@ -224,7 +228,8 @@ msgid "%q must be of type %q, %q, or %q, not %q"
224228
msgstr ""
225229

226230
#: py/argcheck.c py/runtime.c shared-bindings/bitmapfilter/__init__.c
227-
#: shared-module/synthio/Note.c shared-module/synthio/__init__.c
231+
#: shared-module/audiodelays/MultiTapDelay.c shared-module/synthio/Note.c
232+
#: shared-module/synthio/__init__.c
228233
msgid "%q must be of type %q, not %q"
229234
msgstr ""
230235

@@ -2587,6 +2592,7 @@ msgid "bits must be 32 or less"
25872592
msgstr ""
25882593

25892594
#: shared-bindings/audiodelays/Chorus.c shared-bindings/audiodelays/Echo.c
2595+
#: shared-bindings/audiodelays/MultiTapDelay.c
25902596
#: shared-bindings/audiodelays/PitchShift.c
25912597
#: shared-bindings/audiofilters/Distortion.c
25922598
#: shared-bindings/audiofilters/Filter.c shared-bindings/audiomixer/Mixer.c

shared-bindings/audiodelays/MultiTapDelay.c

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
//| delay_ms: synthio.BlockInput = 250.0,
2727
//| decay: synthio.BlockInput = 0.7,
2828
//| mix: synthio.BlockInput = 0.25,
29+
//| taps: Tuple[float|Tuple[float, float], ...] = None,
2930
//| buffer_size: int = 512,
3031
//| sample_rate: int = 8000,
3132
//| bits_per_sample: int = 16,
@@ -46,6 +47,7 @@
4647
//| :param float delay_ms: The current time of the echo delay in milliseconds. Must be less the max_delay_ms
4748
//| :param synthio.BlockInput decay: The rate the echo fades. 0.0 = instant; 1.0 = never.
4849
//| :param synthio.BlockInput mix: The mix as a ratio of the sample (0.0) to the effect (1.0).
50+
//| :param tuple taps: The positions and levels to tap into the delay buffer.
4951
//| :param int buffer_size: The total size in bytes of each of the two playback buffers to use
5052
//| :param int sample_rate: The sample rate to be used
5153
//| :param int channel_count: The number of channels the source samples contain. 1 = mono; 2 = stereo.
@@ -75,12 +77,13 @@
7577
//| ...
7678
//|
7779
static mp_obj_t audiodelays_multi_tap_delay_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *all_args) {
78-
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, ARG_freq_shift, };
80+
enum { ARG_max_delay_ms, ARG_delay_ms, ARG_decay, ARG_mix, ARG_taps, ARG_buffer_size, ARG_sample_rate, ARG_bits_per_sample, ARG_samples_signed, ARG_channel_count, };
7981
static const mp_arg_t allowed_args[] = {
8082
{ MP_QSTR_max_delay_ms, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 500 } },
8183
{ MP_QSTR_delay_ms, MP_ARG_OBJ | MP_ARG_KW_ONLY, {.u_obj = MP_ROM_INT(250) } },
8284
{ MP_QSTR_decay, MP_ARG_OBJ | MP_ARG_KW_ONLY, {.u_obj = MP_OBJ_NULL} },
8385
{ MP_QSTR_mix, MP_ARG_OBJ | MP_ARG_KW_ONLY, {.u_obj = MP_OBJ_NULL} },
86+
{ MP_QSTR_taps, MP_ARG_OBJ | MP_ARG_KW_ONLY, {.u_obj = mp_const_none} },
8487
{ MP_QSTR_buffer_size, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 512} },
8588
{ MP_QSTR_sample_rate, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 8000} },
8689
{ MP_QSTR_bits_per_sample, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 16} },
@@ -101,7 +104,7 @@ static mp_obj_t audiodelays_multi_tap_delay_make_new(const mp_obj_type_t *type,
101104
}
102105

103106
audiodelays_multi_tap_delay_obj_t *self = mp_obj_malloc(audiodelays_multi_tap_delay_obj_t, &audiodelays_multi_tap_delay_type);
104-
common_hal_audiodelays_multi_tap_delay_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);
107+
common_hal_audiodelays_multi_tap_delay_construct(self, max_delay_ms, args[ARG_delay_ms].u_obj, args[ARG_decay].u_obj, args[ARG_mix].u_obj, args[ARG_taps].u_obj, args[ARG_buffer_size].u_int, bits_per_sample, args[ARG_samples_signed].u_bool, channel_count, sample_rate);
105108

106109
return MP_OBJ_FROM_PTR(self);
107110
}
@@ -191,6 +194,29 @@ MP_PROPERTY_GETSET(audiodelays_multi_tap_delay_mix_obj,
191194
(mp_obj_t)&audiodelays_multi_tap_delay_get_mix_obj,
192195
(mp_obj_t)&audiodelays_multi_tap_delay_set_mix_obj);
193196

197+
//| taps: Tuple[float|Tuple[float, float], ...]
198+
//| """The position or position and level of delay taps.
199+
//| The position is a number from 0.0 (start) to 1.0 (end) as a relative position in the delay buffer.
200+
//| The level is a number from 0.0 (silence) to 1.0 (full volume).
201+
//| If only a float is provided as an element of the tuple, the level is assumed to be 1.0.
202+
//| When retrieving the value of this property, the level will always be included."""
203+
//|
204+
static mp_obj_t audiodelays_multi_tap_delay_obj_get_taps(mp_obj_t self_in) {
205+
return common_hal_audiodelays_multi_tap_delay_get_taps(self_in);
206+
}
207+
MP_DEFINE_CONST_FUN_OBJ_1(audiodelays_multi_tap_delay_get_taps_obj, audiodelays_multi_tap_delay_obj_get_taps);
208+
209+
static mp_obj_t audiodelays_multi_tap_delay_obj_set_taps(mp_obj_t self_in, mp_obj_t taps_in) {
210+
audiodelays_multi_tap_delay_obj_t *self = MP_OBJ_TO_PTR(self_in);
211+
common_hal_audiodelays_multi_tap_delay_set_taps(self, taps_in);
212+
return mp_const_none;
213+
}
214+
MP_DEFINE_CONST_FUN_OBJ_2(audiodelays_multi_tap_delay_set_taps_obj, audiodelays_multi_tap_delay_obj_set_taps);
215+
216+
MP_PROPERTY_GETSET(audiodelays_multi_tap_delay_taps_obj,
217+
(mp_obj_t)&audiodelays_multi_tap_delay_get_taps_obj,
218+
(mp_obj_t)&audiodelays_multi_tap_delay_set_taps_obj);
219+
194220

195221

196222
//| playing: bool
@@ -258,6 +284,7 @@ static const mp_rom_map_elem_t audiodelays_multi_tap_delay_locals_dict_table[] =
258284
{ MP_ROM_QSTR(MP_QSTR_delay_ms), MP_ROM_PTR(&audiodelays_multi_tap_delay_delay_ms_obj) },
259285
{ MP_ROM_QSTR(MP_QSTR_decay), MP_ROM_PTR(&audiodelays_multi_tap_delay_decay_obj) },
260286
{ MP_ROM_QSTR(MP_QSTR_mix), MP_ROM_PTR(&audiodelays_multi_tap_delay_mix_obj) },
287+
{ MP_ROM_QSTR(MP_QSTR_taps), MP_ROM_PTR(&audiodelays_multi_tap_delay_taps_obj) },
261288
AUDIOSAMPLE_FIELDS,
262289
};
263290
static MP_DEFINE_CONST_DICT(audiodelays_multi_tap_delay_locals_dict, audiodelays_multi_tap_delay_locals_dict_table);

shared-bindings/audiodelays/MultiTapDelay.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
extern const mp_obj_type_t audiodelays_multi_tap_delay_type;
1212

1313
void common_hal_audiodelays_multi_tap_delay_construct(audiodelays_multi_tap_delay_obj_t *self, uint32_t max_delay_ms,
14-
mp_obj_t delay_ms, mp_obj_t decay, mp_obj_t mix,
14+
mp_obj_t delay_ms, mp_obj_t decay, mp_obj_t mix, mp_obj_t taps,
1515
uint32_t buffer_size, uint8_t bits_per_sample, bool samples_signed,
1616
uint8_t channel_count, uint32_t sample_rate);
1717

@@ -24,7 +24,10 @@ mp_obj_t common_hal_audiodelays_multi_tap_delay_get_decay(audiodelays_multi_tap_
2424
void common_hal_audiodelays_multi_tap_delay_set_decay(audiodelays_multi_tap_delay_obj_t *self, mp_obj_t decay);
2525

2626
mp_obj_t common_hal_audiodelays_multi_tap_delay_get_mix(audiodelays_multi_tap_delay_obj_t *self);
27-
void common_hal_audiodelays_multi_tap_delay_set_mix(audiodelays_multi_tap_delay_obj_t *self, mp_obj_t arg);
27+
void common_hal_audiodelays_multi_tap_delay_set_mix(audiodelays_multi_tap_delay_obj_t *self, mp_obj_t mix);
28+
29+
mp_obj_t common_hal_audiodelays_multi_tap_delay_get_taps(audiodelays_multi_tap_delay_obj_t *self);
30+
void common_hal_audiodelays_multi_tap_delay_set_taps(audiodelays_multi_tap_delay_obj_t *self, mp_obj_t taps);
2831

2932
bool common_hal_audiodelays_multi_tap_delay_get_playing(audiodelays_multi_tap_delay_obj_t *self);
3033
void common_hal_audiodelays_multi_tap_delay_play(audiodelays_multi_tap_delay_obj_t *self, mp_obj_t sample, bool loop);

0 commit comments

Comments
 (0)