Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit fcc72cf

Browse files
committed
Merge remote-tracking branch 'origin/main'
2 parents 87db7f9 + 670d046 commit fcc72cf

File tree

8 files changed

+890
-1
lines changed

8 files changed

+890
-1
lines changed

locale/circuitpython.pot

+7-1
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

ports/unix/variants/coverage/mpconfigvariant.mk

+2
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ SRC_BITMAP := \
3636
shared-bindings/audiodelays/Echo.c \
3737
shared-bindings/audiodelays/Chorus.c \
3838
shared-bindings/audiodelays/PitchShift.c \
39+
shared-bindings/audiodelays/MultiTapDelay.c \
3940
shared-bindings/audiodelays/__init__.c \
4041
shared-bindings/audiofilters/Distortion.c \
4142
shared-bindings/audiofilters/Filter.c \
@@ -80,6 +81,7 @@ SRC_BITMAP := \
8081
shared-module/audiodelays/Echo.c \
8182
shared-module/audiodelays/Chorus.c \
8283
shared-module/audiodelays/PitchShift.c \
84+
shared-module/audiodelays/MultiTapDelay.c \
8385
shared-module/audiodelays/__init__.c \
8486
shared-module/audiofilters/Distortion.c \
8587
shared-module/audiofilters/Filter.c \

py/circuitpy_defns.mk

+1
Original file line numberDiff line numberDiff line change
@@ -666,6 +666,7 @@ SRC_SHARED_MODULE_ALL = \
666666
audiodelays/Echo.c \
667667
audiodelays/Chorus.c \
668668
audiodelays/PitchShift.c \
669+
audiodelays/MultiTapDelay.c \
669670
audiodelays/__init__.c \
670671
audiofilters/Distortion.c \
671672
audiofilters/Filter.c \
+306
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,306 @@
1+
// This file is part of the CircuitPython project: https://circuitpython.org
2+
//
3+
// SPDX-FileCopyrightText: Copyright (c) 2025 Cooper Dalrymple
4+
//
5+
// SPDX-License-Identifier: MIT
6+
7+
#include <stdint.h>
8+
9+
#include "shared-bindings/audiodelays/MultiTapDelay.h"
10+
#include "shared-bindings/audiocore/__init__.h"
11+
#include "shared-module/audiodelays/MultiTapDelay.h"
12+
13+
#include "shared/runtime/context_manager_helpers.h"
14+
#include "py/binary.h"
15+
#include "py/objproperty.h"
16+
#include "py/runtime.h"
17+
#include "shared-bindings/util.h"
18+
#include "shared-module/synthio/block.h"
19+
20+
//| class MultiTapDelay:
21+
//| """A delay with multiple buffer positions to create a rhythmic effect."""
22+
//|
23+
//| def __init__(
24+
//| self,
25+
//| max_delay_ms: int = 500,
26+
//| delay_ms: synthio.BlockInput = 250.0,
27+
//| decay: synthio.BlockInput = 0.7,
28+
//| mix: synthio.BlockInput = 0.25,
29+
//| taps: Optional[Tuple[float|Tuple[float, float], ...]] = None,
30+
//| buffer_size: int = 512,
31+
//| sample_rate: int = 8000,
32+
//| bits_per_sample: int = 16,
33+
//| samples_signed: bool = True,
34+
//| channel_count: int = 1,
35+
//| ) -> None:
36+
//| """Create a delay effect where you hear the original sample play back at varying times, or "taps".
37+
//| These tap positions and levels can be used to create rhythmic effects.
38+
//| The timing of the delay can be changed at runtime with the delay_ms parameter but the delay can
39+
//| never exceed the max_delay_ms parameter. The maximum delay you can set is limited by available
40+
//| memory.
41+
//|
42+
//| Each time the delay plays back the volume is reduced by the decay setting (delay * decay).
43+
//|
44+
//| The mix parameter allows you to change how much of the unchanged sample passes through to
45+
//| the output to how much of the effect audio you hear as the output.
46+
//|
47+
//| :param int max_delay_ms: The maximum time the delay can be in milliseconds.
48+
//| :param float delay_ms: The current time of the delay in milliseconds. Must be less than max_delay_ms.
49+
//| :param synthio.BlockInput decay: The rate the delay fades. 0.0 = instant; 1.0 = never.
50+
//| :param synthio.BlockInput mix: The mix as a ratio of the sample (0.0) to the effect (1.0).
51+
//| :param tuple taps: The positions and levels to tap into the delay buffer.
52+
//| :param int buffer_size: The total size in bytes of each of the two playback buffers to use.
53+
//| :param int sample_rate: The sample rate to be used.
54+
//| :param int channel_count: The number of channels the source samples contain. 1 = mono; 2 = stereo.
55+
//| :param int bits_per_sample: The bits per sample of the effect.
56+
//| :param bool samples_signed: Effect is signed (True) or unsigned (False).
57+
//|
58+
//| Playing adding a multi-tap delay to a synth::
59+
//|
60+
//| import time
61+
//| import board
62+
//| import audiobusio
63+
//| import synthio
64+
//| import audiodelays
65+
//|
66+
//| audio = audiobusio.I2SOut(bit_clock=board.GP20, word_select=board.GP21, data=board.GP22)
67+
//| synth = synthio.Synthesizer(channel_count=1, sample_rate=44100)
68+
//| effect = audiodelays.MultiTapDelay(max_delay_ms=500, delay_ms=500, decay=0.65, mix=0.5, taps=((2/3, 0.7), 1), buffer_size=1024, channel_count=1, sample_rate=44100)
69+
//| effect.play(synth)
70+
//| audio.play(effect)
71+
//|
72+
//| note = synthio.Note(261)
73+
//| while True:
74+
//| synth.press(note)
75+
//| time.sleep(0.05)
76+
//| synth.release(note)
77+
//| time.sleep(5)"""
78+
//| ...
79+
//|
80+
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) {
81+
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, };
82+
static const mp_arg_t allowed_args[] = {
83+
{ MP_QSTR_max_delay_ms, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 500 } },
84+
{ MP_QSTR_delay_ms, MP_ARG_OBJ | MP_ARG_KW_ONLY, {.u_obj = MP_ROM_INT(250) } },
85+
{ MP_QSTR_decay, MP_ARG_OBJ | MP_ARG_KW_ONLY, {.u_obj = MP_OBJ_NULL} },
86+
{ MP_QSTR_mix, MP_ARG_OBJ | MP_ARG_KW_ONLY, {.u_obj = MP_OBJ_NULL} },
87+
{ MP_QSTR_taps, MP_ARG_OBJ | MP_ARG_KW_ONLY, {.u_obj = mp_const_none} },
88+
{ MP_QSTR_buffer_size, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 512} },
89+
{ MP_QSTR_sample_rate, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 8000} },
90+
{ MP_QSTR_bits_per_sample, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 16} },
91+
{ MP_QSTR_samples_signed, MP_ARG_BOOL | MP_ARG_KW_ONLY, {.u_bool = true} },
92+
{ MP_QSTR_channel_count, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 1 } },
93+
};
94+
95+
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
96+
mp_arg_parse_all_kw_array(n_args, n_kw, all_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
97+
98+
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);
99+
100+
mp_int_t channel_count = mp_arg_validate_int_range(args[ARG_channel_count].u_int, 1, 2, MP_QSTR_channel_count);
101+
mp_int_t sample_rate = mp_arg_validate_int_min(args[ARG_sample_rate].u_int, 1, MP_QSTR_sample_rate);
102+
mp_int_t bits_per_sample = args[ARG_bits_per_sample].u_int;
103+
if (bits_per_sample != 8 && bits_per_sample != 16) {
104+
mp_raise_ValueError(MP_ERROR_TEXT("bits_per_sample must be 8 or 16"));
105+
}
106+
107+
audiodelays_multi_tap_delay_obj_t *self = mp_obj_malloc(audiodelays_multi_tap_delay_obj_t, &audiodelays_multi_tap_delay_type);
108+
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);
109+
110+
return MP_OBJ_FROM_PTR(self);
111+
}
112+
113+
//| def deinit(self) -> None:
114+
//| """Deinitialises the MultiTapDelay."""
115+
//| ...
116+
//|
117+
static mp_obj_t audiodelays_multi_tap_delay_deinit(mp_obj_t self_in) {
118+
audiodelays_multi_tap_delay_obj_t *self = MP_OBJ_TO_PTR(self_in);
119+
common_hal_audiodelays_multi_tap_delay_deinit(self);
120+
return mp_const_none;
121+
}
122+
static MP_DEFINE_CONST_FUN_OBJ_1(audiodelays_multi_tap_delay_deinit_obj, audiodelays_multi_tap_delay_deinit);
123+
124+
static void check_for_deinit(audiodelays_multi_tap_delay_obj_t *self) {
125+
audiosample_check_for_deinit(&self->base);
126+
}
127+
128+
//| def __enter__(self) -> MultiTapDelay:
129+
//| """No-op used by Context Managers."""
130+
//| ...
131+
//|
132+
// Provided by context manager helper.
133+
134+
//| def __exit__(self) -> None:
135+
//| """Automatically deinitializes when exiting a context. See
136+
//| :ref:`lifetime-and-contextmanagers` for more info."""
137+
//| ...
138+
//|
139+
// Provided by context manager helper.
140+
141+
142+
//| delay_ms: float
143+
//| """Time to delay the incoming signal in milliseconds. Must be less than max_delay_ms."""
144+
//|
145+
static mp_obj_t audiodelays_multi_tap_delay_obj_get_delay_ms(mp_obj_t self_in) {
146+
audiodelays_multi_tap_delay_obj_t *self = MP_OBJ_TO_PTR(self_in);
147+
return mp_obj_new_float(common_hal_audiodelays_multi_tap_delay_get_delay_ms(self));
148+
}
149+
MP_DEFINE_CONST_FUN_OBJ_1(audiodelays_multi_tap_delay_get_delay_ms_obj, audiodelays_multi_tap_delay_obj_get_delay_ms);
150+
151+
static mp_obj_t audiodelays_multi_tap_delay_obj_set_delay_ms(mp_obj_t self_in, mp_obj_t delay_ms_in) {
152+
audiodelays_multi_tap_delay_obj_t *self = MP_OBJ_TO_PTR(self_in);
153+
common_hal_audiodelays_multi_tap_delay_set_delay_ms(self, delay_ms_in);
154+
return mp_const_none;
155+
}
156+
MP_DEFINE_CONST_FUN_OBJ_2(audiodelays_multi_tap_delay_set_delay_ms_obj, audiodelays_multi_tap_delay_obj_set_delay_ms);
157+
158+
MP_PROPERTY_GETSET(audiodelays_multi_tap_delay_delay_ms_obj,
159+
(mp_obj_t)&audiodelays_multi_tap_delay_get_delay_ms_obj,
160+
(mp_obj_t)&audiodelays_multi_tap_delay_set_delay_ms_obj);
161+
162+
//| decay: synthio.BlockInput
163+
//| """The rate the echo fades between 0 and 1 where 0 is instant and 1 is never."""
164+
static mp_obj_t audiodelays_multi_tap_delay_obj_get_decay(mp_obj_t self_in) {
165+
return common_hal_audiodelays_multi_tap_delay_get_decay(self_in);
166+
}
167+
MP_DEFINE_CONST_FUN_OBJ_1(audiodelays_multi_tap_delay_get_decay_obj, audiodelays_multi_tap_delay_obj_get_decay);
168+
169+
static mp_obj_t audiodelays_multi_tap_delay_obj_set_decay(mp_obj_t self_in, mp_obj_t decay_in) {
170+
audiodelays_multi_tap_delay_obj_t *self = MP_OBJ_TO_PTR(self_in);
171+
common_hal_audiodelays_multi_tap_delay_set_decay(self, decay_in);
172+
return mp_const_none;
173+
}
174+
MP_DEFINE_CONST_FUN_OBJ_2(audiodelays_multi_tap_delay_set_decay_obj, audiodelays_multi_tap_delay_obj_set_decay);
175+
176+
MP_PROPERTY_GETSET(audiodelays_multi_tap_delay_decay_obj,
177+
(mp_obj_t)&audiodelays_multi_tap_delay_get_decay_obj,
178+
(mp_obj_t)&audiodelays_multi_tap_delay_set_decay_obj);
179+
180+
//| mix: synthio.BlockInput
181+
//| """The mix of the effect between 0 and 1 where 0 is only sample, 0.5 is an equal mix of the sample and the effect and 1 is all effect."""
182+
static mp_obj_t audiodelays_multi_tap_delay_obj_get_mix(mp_obj_t self_in) {
183+
return common_hal_audiodelays_multi_tap_delay_get_mix(self_in);
184+
}
185+
MP_DEFINE_CONST_FUN_OBJ_1(audiodelays_multi_tap_delay_get_mix_obj, audiodelays_multi_tap_delay_obj_get_mix);
186+
187+
static mp_obj_t audiodelays_multi_tap_delay_obj_set_mix(mp_obj_t self_in, mp_obj_t mix_in) {
188+
audiodelays_multi_tap_delay_obj_t *self = MP_OBJ_TO_PTR(self_in);
189+
common_hal_audiodelays_multi_tap_delay_set_mix(self, mix_in);
190+
return mp_const_none;
191+
}
192+
MP_DEFINE_CONST_FUN_OBJ_2(audiodelays_multi_tap_delay_set_mix_obj, audiodelays_multi_tap_delay_obj_set_mix);
193+
194+
MP_PROPERTY_GETSET(audiodelays_multi_tap_delay_mix_obj,
195+
(mp_obj_t)&audiodelays_multi_tap_delay_get_mix_obj,
196+
(mp_obj_t)&audiodelays_multi_tap_delay_set_mix_obj);
197+
198+
//| taps: Tuple[float|int|Tuple[float|int, float|int], ...]
199+
//| """The position or position and level of delay taps.
200+
//| The position is a number from 0 (start) to 1 (end) as a relative position in the delay buffer.
201+
//| The level is a number from 0 (silence) to 1 (full volume).
202+
//| If only a float or integer is provided as an element of the tuple, the level is assumed to be 1.
203+
//| When retrieving the value of this property, the level will always be included."""
204+
//|
205+
static mp_obj_t audiodelays_multi_tap_delay_obj_get_taps(mp_obj_t self_in) {
206+
return common_hal_audiodelays_multi_tap_delay_get_taps(self_in);
207+
}
208+
MP_DEFINE_CONST_FUN_OBJ_1(audiodelays_multi_tap_delay_get_taps_obj, audiodelays_multi_tap_delay_obj_get_taps);
209+
210+
static mp_obj_t audiodelays_multi_tap_delay_obj_set_taps(mp_obj_t self_in, mp_obj_t taps_in) {
211+
audiodelays_multi_tap_delay_obj_t *self = MP_OBJ_TO_PTR(self_in);
212+
common_hal_audiodelays_multi_tap_delay_set_taps(self, taps_in);
213+
return mp_const_none;
214+
}
215+
MP_DEFINE_CONST_FUN_OBJ_2(audiodelays_multi_tap_delay_set_taps_obj, audiodelays_multi_tap_delay_obj_set_taps);
216+
217+
MP_PROPERTY_GETSET(audiodelays_multi_tap_delay_taps_obj,
218+
(mp_obj_t)&audiodelays_multi_tap_delay_get_taps_obj,
219+
(mp_obj_t)&audiodelays_multi_tap_delay_set_taps_obj);
220+
221+
222+
223+
//| playing: bool
224+
//| """True when the effect is playing a sample. (read-only)"""
225+
//|
226+
static mp_obj_t audiodelays_multi_tap_delay_obj_get_playing(mp_obj_t self_in) {
227+
audiodelays_multi_tap_delay_obj_t *self = MP_OBJ_TO_PTR(self_in);
228+
check_for_deinit(self);
229+
return mp_obj_new_bool(common_hal_audiodelays_multi_tap_delay_get_playing(self));
230+
}
231+
MP_DEFINE_CONST_FUN_OBJ_1(audiodelays_multi_tap_delay_get_playing_obj, audiodelays_multi_tap_delay_obj_get_playing);
232+
233+
MP_PROPERTY_GETTER(audiodelays_multi_tap_delay_playing_obj,
234+
(mp_obj_t)&audiodelays_multi_tap_delay_get_playing_obj);
235+
236+
//| def play(self, sample: circuitpython_typing.AudioSample, *, loop: bool = False) -> None:
237+
//| """Plays the sample once when loop=False and continuously when loop=True.
238+
//| Does not block. Use `playing` to block.
239+
//|
240+
//| The sample must match the encoding settings given in the constructor."""
241+
//| ...
242+
//|
243+
static mp_obj_t audiodelays_multi_tap_delay_obj_play(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
244+
enum { ARG_sample, ARG_loop };
245+
static const mp_arg_t allowed_args[] = {
246+
{ MP_QSTR_sample, MP_ARG_OBJ | MP_ARG_REQUIRED, {} },
247+
{ MP_QSTR_loop, MP_ARG_BOOL | MP_ARG_KW_ONLY, {.u_bool = false} },
248+
};
249+
audiodelays_multi_tap_delay_obj_t *self = MP_OBJ_TO_PTR(pos_args[0]);
250+
check_for_deinit(self);
251+
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
252+
mp_arg_parse_all(n_args - 1, pos_args + 1, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
253+
254+
255+
mp_obj_t sample = args[ARG_sample].u_obj;
256+
common_hal_audiodelays_multi_tap_delay_play(self, sample, args[ARG_loop].u_bool);
257+
258+
return mp_const_none;
259+
}
260+
MP_DEFINE_CONST_FUN_OBJ_KW(audiodelays_multi_tap_delay_play_obj, 1, audiodelays_multi_tap_delay_obj_play);
261+
262+
//| def stop(self) -> None:
263+
//| """Stops playback of the sample. The echo continues playing."""
264+
//| ...
265+
//|
266+
//|
267+
static mp_obj_t audiodelays_multi_tap_delay_obj_stop(mp_obj_t self_in) {
268+
audiodelays_multi_tap_delay_obj_t *self = MP_OBJ_TO_PTR(self_in);
269+
270+
common_hal_audiodelays_multi_tap_delay_stop(self);
271+
return mp_const_none;
272+
}
273+
MP_DEFINE_CONST_FUN_OBJ_1(audiodelays_multi_tap_delay_stop_obj, audiodelays_multi_tap_delay_obj_stop);
274+
275+
static const mp_rom_map_elem_t audiodelays_multi_tap_delay_locals_dict_table[] = {
276+
// Methods
277+
{ MP_ROM_QSTR(MP_QSTR_deinit), MP_ROM_PTR(&audiodelays_multi_tap_delay_deinit_obj) },
278+
{ MP_ROM_QSTR(MP_QSTR___enter__), MP_ROM_PTR(&default___enter___obj) },
279+
{ MP_ROM_QSTR(MP_QSTR___exit__), MP_ROM_PTR(&default___exit___obj) },
280+
{ MP_ROM_QSTR(MP_QSTR_play), MP_ROM_PTR(&audiodelays_multi_tap_delay_play_obj) },
281+
{ MP_ROM_QSTR(MP_QSTR_stop), MP_ROM_PTR(&audiodelays_multi_tap_delay_stop_obj) },
282+
283+
// Properties
284+
{ MP_ROM_QSTR(MP_QSTR_playing), MP_ROM_PTR(&audiodelays_multi_tap_delay_playing_obj) },
285+
{ MP_ROM_QSTR(MP_QSTR_delay_ms), MP_ROM_PTR(&audiodelays_multi_tap_delay_delay_ms_obj) },
286+
{ MP_ROM_QSTR(MP_QSTR_decay), MP_ROM_PTR(&audiodelays_multi_tap_delay_decay_obj) },
287+
{ MP_ROM_QSTR(MP_QSTR_mix), MP_ROM_PTR(&audiodelays_multi_tap_delay_mix_obj) },
288+
{ MP_ROM_QSTR(MP_QSTR_taps), MP_ROM_PTR(&audiodelays_multi_tap_delay_taps_obj) },
289+
AUDIOSAMPLE_FIELDS,
290+
};
291+
static MP_DEFINE_CONST_DICT(audiodelays_multi_tap_delay_locals_dict, audiodelays_multi_tap_delay_locals_dict_table);
292+
293+
static const audiosample_p_t audiodelays_multi_tap_delay_proto = {
294+
MP_PROTO_IMPLEMENT(MP_QSTR_protocol_audiosample)
295+
.reset_buffer = (audiosample_reset_buffer_fun)audiodelays_multi_tap_delay_reset_buffer,
296+
.get_buffer = (audiosample_get_buffer_fun)audiodelays_multi_tap_delay_get_buffer,
297+
};
298+
299+
MP_DEFINE_CONST_OBJ_TYPE(
300+
audiodelays_multi_tap_delay_type,
301+
MP_QSTR_MultiTapDelay,
302+
MP_TYPE_FLAG_HAS_SPECIAL_ACCESSORS,
303+
make_new, audiodelays_multi_tap_delay_make_new,
304+
locals_dict, &audiodelays_multi_tap_delay_locals_dict,
305+
protocol, &audiodelays_multi_tap_delay_proto
306+
);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
// This file is part of the CircuitPython project: https://circuitpython.org
2+
//
3+
// SPDX-FileCopyrightText: Copyright (c) 2025 Cooper Dalrymple
4+
//
5+
// SPDX-License-Identifier: MIT
6+
7+
#pragma once
8+
9+
#include "shared-module/audiodelays/MultiTapDelay.h"
10+
11+
extern const mp_obj_type_t audiodelays_multi_tap_delay_type;
12+
13+
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, mp_obj_t taps,
15+
uint32_t buffer_size, uint8_t bits_per_sample, bool samples_signed,
16+
uint8_t channel_count, uint32_t sample_rate);
17+
18+
void common_hal_audiodelays_multi_tap_delay_deinit(audiodelays_multi_tap_delay_obj_t *self);
19+
20+
mp_float_t common_hal_audiodelays_multi_tap_delay_get_delay_ms(audiodelays_multi_tap_delay_obj_t *self);
21+
void common_hal_audiodelays_multi_tap_delay_set_delay_ms(audiodelays_multi_tap_delay_obj_t *self, mp_obj_t delay_ms);
22+
23+
mp_obj_t common_hal_audiodelays_multi_tap_delay_get_decay(audiodelays_multi_tap_delay_obj_t *self);
24+
void common_hal_audiodelays_multi_tap_delay_set_decay(audiodelays_multi_tap_delay_obj_t *self, mp_obj_t decay);
25+
26+
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 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);
31+
32+
bool common_hal_audiodelays_multi_tap_delay_get_playing(audiodelays_multi_tap_delay_obj_t *self);
33+
void common_hal_audiodelays_multi_tap_delay_play(audiodelays_multi_tap_delay_obj_t *self, mp_obj_t sample, bool loop);
34+
void common_hal_audiodelays_multi_tap_delay_stop(audiodelays_multi_tap_delay_obj_t *self);

0 commit comments

Comments
 (0)