diff --git a/firmware/include/pentabug/music.h b/firmware/include/pentabug/music.h index ea0b103..7937412 100644 --- a/firmware/include/pentabug/music.h +++ b/firmware/include/pentabug/music.h @@ -19,6 +19,7 @@ #define NOTE_B 16198 // note B #define MLDY_PAUSE 0xfffe // user defined pause for melody, the next value is the amount of ms to wait +#define MLDY_LENGTH 0xfffd // user defined note length for melody, the next value is the "shortness" of the note (1/n) // plays the note (see defines above) at the given octave until another note is played or the note is stopped void set_note(uint16_t note, uint8_t octave); diff --git a/firmware/lib/music.c b/firmware/lib/music.c index 71b3e54..fb22a20 100644 --- a/firmware/lib/music.c +++ b/firmware/lib/music.c @@ -23,6 +23,7 @@ void stop_note(void) { void play_melody(uint16_t notes[], size_t len, uint8_t octave, int speed) { int pause = speed / 20; + uint8_t length = 4; size_t i; @@ -30,15 +31,20 @@ void play_melody(uint16_t notes[], size_t len, uint8_t octave, int speed) { for(i = 0; i < len; ++i) { if(notes[i] == MLDY_PAUSE) { ++i; - _delay_ms(notes[i]); + wait_ms(notes[i] * 4 / length); + } else if(notes[i] == MLDY_LENGTH) { + ++i; + length = notes[i]; } else { set_note(notes[i], octave); test_stop_app(); - _delay_ms(speed); + wait_ms(speed * 4 / length); stop_note(); test_stop_app(); - _delay_ms(pause); + wait_ms(pause); + + length = 4; } } } diff --git a/firmware/main.c b/firmware/main.c index 0eb4494..2ceac37 100644 --- a/firmware/main.c +++ b/firmware/main.c @@ -8,8 +8,8 @@ #include #include -static uint16_t up_mldy[] = { NOTE_C, NOTE_D, NOTE_F, NOTE_PAUSE }; -static uint16_t down_mldy[] = { NOTE_F, NOTE_E, NOTE_C, NOTE_PAUSE }; +static uint16_t up_mldy[] = { NOTE_C, NOTE_D, MLDY_LENGTH, 2, NOTE_F, NOTE_PAUSE }; +static uint16_t down_mldy[] = { NOTE_F, NOTE_E, MLDY_LENGTH, 2, NOTE_C, NOTE_PAUSE }; static inline void run_app(struct app_t* app) { app_should_stop = 0; @@ -51,7 +51,7 @@ int main(void) { reset_hw(); if(app_direction > 0) { - play_melody(up_mldy, ARRAY_SIZE(up_mldy), 4, 60); + play_melody(up_mldy, ARRAY_SIZE(up_mldy), 4, 100); app_index++; @@ -59,7 +59,7 @@ int main(void) { app_index = 0; } } else { - play_melody(down_mldy, ARRAY_SIZE(down_mldy), 4, 60); + play_melody(down_mldy, ARRAY_SIZE(down_mldy), 4, 100); if(app_index == 0) { app_index = MAX_APPS - 1;