From 519f868c445a86b988772307ea1f1e2fc95fe54a Mon Sep 17 00:00:00 2001 From: sowgro Date: Sat, 13 Dec 2025 22:13:27 -0500 Subject: all player code written but untested --- project/Core/Src/Project/player.c | 34 +++++++++++++++++++++++++++++----- 1 file changed, 29 insertions(+), 5 deletions(-) (limited to 'project/Core/Src/Project/player.c') diff --git a/project/Core/Src/Project/player.c b/project/Core/Src/Project/player.c index f9ffbce..53ae0f8 100644 --- a/project/Core/Src/Project/player.c +++ b/project/Core/Src/Project/player.c @@ -12,11 +12,34 @@ #include "activity4.h" #include "song_info.h" #include "player.h" +#include "systick.h" +#include "tone.h" #define NOTE_OFF_EVENT (0) #define NOTE_ON_EVENT (1) #define KEY_PRESSURE (2) +static track_t tracks[16]; +static int nTracks; +static int startTime; + +void play_notes(int count) { + int curAbsTime = count - startTime; + for (int i = 0; i < nTracks; i++) { + note_event_t curEvent = tracks[i].events[tracks[i].curEventIndex]; + if (curEvent.abs_time >= curAbsTime) { + switch (curEvent.ev_type) { + case NOTE_OFF_EVENT: + remove_tone(curEvent.key_number); break; + case NOTE_ON_EVENT: + add_tone(curEvent.key_number, curEvent.value); break; + } + } + tracks[i].curEventIndex++; + } + play_tones(); +} + void parse_song(uint8_t *p_song) { header_t header; header = get_header(p_song); @@ -25,13 +48,13 @@ void parse_song(uint8_t *p_song) { song_info_t song_info; p_song = get_song_info(p_song, &song_info); - note_event_t trackEvents[header.ntrcks][1024]; for(int i = 0; i < header.ntrcks; i++){ - p_song = parse_track(p_song, trackEvents[i]); + p_song = parse_track(p_song, &tracks[i]); } + nTracks = header.ntrcks; } -uint8_t *parse_track(uint8_t *p_song, note_event_t *events) { +uint8_t *parse_track(uint8_t *p_song, track_t *track) { p_song += 4; // skip MTrk uint32_t MTrk_len = convert_to_uint32(p_song); p_song += 4; @@ -68,9 +91,10 @@ uint8_t *parse_track(uint8_t *p_song, note_event_t *events) { note.value = *p_song; p_song++; - events[curEvent++] = note; + track->events[curEvent++] = note; } - events[curEvent] = NULL_EVENT; // null terminate array + track->nEvents = curEvent; + track->curEventIndex = 0; return p_song; } -- cgit v1.2.3