10000 microbit: Factor out setting of music amplitude/period to helper funcs. · bbcmicrobit/micropython@525f262 · GitHub
[go: up one dir, main page]

Skip to content

Commit 525f262

Browse files
committed
microbit: Factor out setting of music amplitude/period to helper funcs.
To align with the micro:bit v2 implementation. Signed-off-by: Damien George <damien@micropython.org>
1 parent b467b46 commit 525f262

File tree

1 file changed

+30
-15
lines changed

1 file changed

+30
-15
lines changed

source/microbit/modmusic.cpp

Lines changed: 30 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,10 @@ extern "C" {
4040
#define DEFAULT_DURATION 4 // Crotchet
4141
#define ARTICULATION_MS 10 // articulation between notes in milliseconds
4242

43+
#define MUSIC_OUTPUT_DEFAULT_PIN (&microbit_p0_obj)
44+
#define MUSIC_OUTPUT_AMPLITUDE_OFF (0)
45+
#define MUSIC_OUTPUT_AMPLITUDE_ON (128)
46+
4347
typedef struct _music_data_t {
4448
uint16_t bpm;
4549
uint16_t ticks;
@@ -66,7 +70,15 @@ enum {
6670

6771
#define music_data MP_STATE_PORT(music_data)
6872

69-
STATIC uint32_t start_note(const char *note_str, size_t note_len, const microbit_pin_obj_t *pin);
73+
STATIC uint32_t start_note(const char *note_str, size_t note_len);
74+
75+
static inline void music_output_amplitude(uint32_t amplitude) {
76+
pwm_set_duty_cycle(music_data->async_pin->name, amplitude);
77+
}
78+
79+
static inline int music_output_period_us(uint32_t period) {
80+
return pwm_set_period_us(period);
81+
}
7082

7183
void microbit_music_tick(void) {
7284
if (music_data == NULL) {
@@ -86,7 +98,7 @@ void microbit_music_tick(void) {
8698

8799
if (music_data->async_state == ASYNC_MUSIC_STATE_ARTICULATE) {
88100
// turn off output and rest
89-
pwm_set_duty_cycle(music_data->async_pin->name, 0);
101+
music_output_amplitude(MUSIC_OUTPUT_AMPLITUDE_OFF);
90102
music_data->async_wait_ticks = ticker_ticks_ms + ARTICULATION_MS;
91103
music_data->async_state = ASYNC_MUSIC_STATE_NEXT_NOTE;
92104
} else if (music_data->async_state == ASYNC_MUSIC_STATE_NEXT_NOTE) {
@@ -109,14 +121,14 @@ void microbit_music_tick(void) {
109121
}
110122
if (note == mp_const_none) {
111123
// a rest (is this even used anymore?)
112-
pwm_set_duty_cycle(music_data->async_pin->name, 0);
124+
music_output_amplitude(MUSIC_OUTPUT_AMPLITUDE_OFF);
113125
music_data->async_wait_ticks = 60000 / music_data->bpm;
114126
music_data->async_state = ASYNC_MUSIC_STATE_NEXT_NOTE;
115127
} else {
116128
// a note
117129
mp_uint_t note_len;
118130
const char *note_str = mp_obj_str_get_data(note, &note_len);
119-
uint32_t delay_on = start_note(note_str, note_len, music_data->async_pin);
131+
uint32_t delay_on = start_note(note_str, note_len);
120132
music_data->async_wait_ticks = ticker_ticks_ms + delay_on;
121133
music_data->async_notes_index += 1;
122134
music_data->async_state = ASYNC_MUSIC_STATE_ARTICULATE;
@@ -130,14 +142,14 @@ STATIC void wait_async_music_idle(void) {
130142
// allow CTRL-C to stop the music
131143
if (MP_STATE_VM(mp_pending_exception) != MP_OBJ_NULL) {
132144
music_data->async_state = ASYNC_MUSIC_STATE_IDLE;
133-
pwm_set_duty_cycle(music_data->async_pin->name, 0);
145+
music_output_amplitude(MUSIC_OUTPUT_AMPLITUDE_OFF);
134146
break;
135147
}
136148
}
137149
}
138150

139-
STATIC uint32_t start_note(const char *note_str, size_t note_len, const microbit_pin_obj_t *pin) {
140-
pwm_set_duty_cycle(pin->name, 128);
151+
STATIC uint32_t start_note(const char *note_str, size_t note_len) {
152+
music_output_amplitude(MUSIC_OUTPUT_AMPLITUDE_ON);
141153

142154
// [NOTE](#|b)(octave)(:length)
143155
// technically, c4 is middle c, so we'll go with that...
@@ -233,9 +245,9 @@ STATIC uint32_t start_note(const char *note_str, size_t note_len, const microbit
233245
period = periods_us[note_index] << -octave;
234246
}
235247
}
236-
pwm_set_period_us(period);
248+
music_output_period_us(period);
237249
} else {
238-
pwm_set_duty_cycle(pin->name, 0);
250+
music_output_amplitude(MUSIC_OUTPUT_AMPLITUDE_OFF);
239251
}
240252

241253
// Cut off a short time from end of note so we hear articulation.
@@ -269,13 +281,14 @@ MP_DEFINE_CONST_FUN_OBJ_0(microbit_music_get_tempo_obj, microbit_music_get_tempo
269281
STATIC mp_obj_t microbit_music_stop(mp_uint_t n_args, const mp_obj_t *args) {
270282
const microbit_pin_obj_t *pin;
271283
if (n_args == 0) {
272-
pin = &microbit_p0_obj;
284+
pin = MUSIC_OUTPUT_DEFAULT_PIN;
273285
} else {
274286
pin = microbit_obj_get_pin(args[0]);
275287
}
276288
// Raise exception if the pin we are trying to stop is not in a compatible mode.
277289
microbit_obj_pin_acquire(pin, microbit_pin_mode_music);
278-
pwm_set_duty_cycle(pin->name, 0);
290+
music_data->async_pin = pin;
291+
music_output_amplitude(MUSIC_OUTPUT_AMPLITUDE_OFF);
279292
microbit_obj_pin_free(pin);
280293
music_data->async_pin = NULL;
281294
music_data->async_state = ASYNC_MUSIC_STATE_IDLE;
@@ -287,7 +300,7 @@ MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(microbit_music_stop_obj, 0, 1, microbit_musi
287300
STATIC mp_obj_t microbit_music_play(mp_uint_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
288301
static const mp_arg_t allowed_args[] = {
289302
{ MP_QSTR_music, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} },
290-
{ MP_QSTR_pin, MP_ARG_OBJ, {.u_obj = (mp_obj_t)&microbit_p0_obj} },
303+
{ MP_QSTR_pin, MP_ARG_OBJ, {.u_obj = (mp_obj_t)MUSIC_OUTPUT_DEFAULT_PIN} },
291304
{ MP_QSTR_wait, MP_ARG_BOOL, {.u_bool = true} },
292305
{ MP_QSTR_loop, MP_ARG_BOOL, {.u_bool = false} },
293306
};
@@ -348,7 +361,7 @@ STATIC mp_obj_t microbit_music_pitch(mp_uint_t n_args, const mp_obj_t *pos_args,
348361
static const mp_arg_t allowed_args[] = {
349362
{ MP_QSTR_frequency, MP_ARG_REQUIRED | MP_ARG_INT, {.u_int = 0} },
350363
{ MP_QSTR_duration, MP_ARG_INT, {.u_int = -1} },
351-
{ MP_QSTR_pin, MP_ARG_OBJ, {.u_obj = (mp_obj_t)&microbit_p0_obj} },
364+
{ MP_QSTR_pin, MP_ARG_OBJ, {.u_obj = (mp_obj_t)MUSIC_OUTPUT_DEFAULT_PIN} },
352365
{ MP_QSTR_wait, MP_ARG_BOOL, {.u_bool = true} },
353366
};
354367

@@ -366,10 +379,12 @@ STATIC mp_obj_t microbit_music_pitch(mp_uint_t n_args, const mp_obj_t *pos_args,
366379
music_data->async_pin = NULL;
367380
microbit_obj_pin_acquire(pin, microbit_pin_mode_music);
368381
bool wait = args[3].u_bool;
369-
pwm_set_duty_cycle(pin->name, 128);
382+
music_data->async_pin = pin;
383+
music_output_amplitude(MUSIC_OUTPUT_AMPLITUDE_ON);
384+
music_data->async_pin = NULL;
370385
if (frequency == 0) {
371386
pwm_release(pin->name);
372-
} else if (pwm_set_period_us(1000000/frequency)) {
387+
} else if (music_output_period_us(1000000/frequency)) {
373388
pwm_release(pin->name);
374389
mp_raise_ValueError("invalid pitch");
375390
}

0 commit comments

Comments
 (0)
0