diff --git a/quantum/audio/audio_arm.c b/quantum/audio/audio_arm.c index ea21d6d500..5d25083f44 100644 --- a/quantum/audio/audio_arm.c +++ b/quantum/audio/audio_arm.c @@ -48,7 +48,7 @@ float note_frequency = 0; float note_length = 0; uint8_t note_tempo = TEMPO_DEFAULT; float note_timbre = TIMBRE_DEFAULT; -uint16_t note_position = 0; +uint32_t note_position = 0; float (* notes_pointer)[][2]; uint16_t notes_count; bool notes_repeat; @@ -235,6 +235,31 @@ static void end_cb1(DACDriver * dacp, dacsample_t * samples, size_t rows) { samples[s] = DAC_OFF_VALUE; } } + + if (playing_notes) { + note_position += rows; + + // end of the note + if ((note_position >= (note_length*420))) { + stop_note((*notes_pointer)[current_note][0]); + current_note++; + if (current_note >= notes_count) { + if (notes_repeat) { + current_note = 0; + } else { + playing_notes = false; + return; + } + } + play_note((*notes_pointer)[current_note][0], 15); + envelope_index = 0; + note_length = ((*notes_pointer)[current_note][1] / 4) * (((float)note_tempo) / 100); + + note_position = note_position - (note_length*420); + // note_position = 0; + } + } + } /* @@ -394,9 +419,9 @@ void play_note(float freq, int vol) { if (audio_config.enable && voices < 8) { // Cancel notes if notes are playing - if (playing_notes) { - stop_all_notes(); - } + // if (playing_notes) { + // stop_all_notes(); + // } playing_note = true; @@ -419,11 +444,6 @@ void play_notes(float (*np)[][2], uint16_t n_count, bool n_repeat) { if (audio_config.enable) { - // Cancel note if a note is playing - if (playing_note) { - stop_all_notes(); - } - playing_notes = true; notes_pointer = np; @@ -433,10 +453,11 @@ void play_notes(float (*np)[][2], uint16_t n_count, bool n_repeat) { place = 0; current_note = 0; - note_frequency = (*notes_pointer)[current_note][0]; note_length = ((*notes_pointer)[current_note][1] / 4) * (((float)note_tempo) / 100); note_position = 0; + play_note((*notes_pointer)[current_note][0], 15); + } }