@@ -73,17 +73,23 @@ enum {
73
73
STATIC uint32_t start_note(const char *note_str, size_t note_len);
74
74
75
75
static 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
+ }
77
79
}
78
80
79
81
static inline int music_output_period_us (uint32_t period) {
80
82
return pwm_set_period_us (period);
81
83
}
82
84
83
85
STATIC 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
+ }
87
93
}
88
94
89
95
STATIC 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,
389
395
390
396
bool wait = args[3 ].u_bool ;
391
397
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
+ }
399
406
}
400
407
if (duration >= 0 ) {
401
408
// use async machinery to stop the pitch after the duration
0 commit comments