@@ -73,17 +73,23 @@ enum {
7373STATIC uint32_t start_note(const char *note_str, size_t note_len);
7474
7575static inline void music_output_amplitude (uint32_t amplitude) {
76- pwm_set_duty_cycle (music_data->async_pin ->name , amplitude);
76+ if (music_data->async_pin != NULL ) {
77+ pwm_set_duty_cycle (music_data->async_pin ->name , amplitude);
78+ }
7779}
7880
7981static inline int music_output_period_us (uint32_t period) {
8082 return pwm_set_period_us (period);
8183}
8284
8385STATIC void microbit_pin_audio_select (mp_obj_t select) {
84- const microbit_pin_obj_t *pin = microbit_obj_get_pin (select);
85- microbit_obj_pin_acquire (pin, microbit_pin_mode_music);
86- music_data->async_pin = pin;
86+ if (select == mp_const_none) {
87+ music_data->async_pin = NULL ;
88+ } else {
89+ const microbit_pin_obj_t *pin = microbit_obj_get_pin (select);
90+ microbit_obj_pin_acquire (pin, microbit_pin_mode_music);
91+ music_data->async_pin = pin;
92+ }
8793}
8894
8995STATIC void microbit_pin_audio_free (void ) {
@@ -389,13 +395,14 @@ STATIC mp_obj_t microbit_music_pitch(mp_uint_t n_args, const mp_obj_t *pos_args,
389395
390396 bool wait = args[3 ].u_bool ;
391397 music_output_amplitude (MUSIC_OUTPUT_AMPLITUDE_ON);
392- if (frequency == 0 ) {
393- pwm_release (music_data->async_pin ->name );
394- music_data->async_pin = NULL ;
395- } else if (music_output_period_us (1000000 /frequency)) {
396- pwm_release (music_data->async_pin ->name );
397- music_data->async_pin = NULL ;
398- mp_raise_ValueError (" invalid pitch" );
398+ if (frequency == 0 || music_output_period_us (1000000 / frequency)) {
399+ if (music_data->async_pin != NULL ) {
400+ pwm_release (music_data->async_pin ->name );
401+ music_data->async_pin = NULL ;
402+ }
403+ if (frequency != 0 ) {
404+ mp_raise_ValueError (" invalid pitch" );
405+ }
399406 }
400407 if (duration >= 0 ) {
401408 // use async machinery to stop the pitch after the duration
0 commit comments