summaryrefslogtreecommitdiff
path: root/project/Core/Src/Project/player.c
diff options
context:
space:
mode:
authorsowgro <tpoke.ferrari@gmail.com>2025-12-13 22:13:27 -0500
committersowgro <tpoke.ferrari@gmail.com>2025-12-13 22:13:27 -0500
commit519f868c445a86b988772307ea1f1e2fc95fe54a (patch)
tree3a73eb27a5473fc68e0cc8900fb29f05e13771f1 /project/Core/Src/Project/player.c
parent2fe47fb3bd700acebf07cd777e3a1ecb49fb9f46 (diff)
download340-repo-Sowgro-519f868c445a86b988772307ea1f1e2fc95fe54a.tar.gz
340-repo-Sowgro-519f868c445a86b988772307ea1f1e2fc95fe54a.tar.bz2
340-repo-Sowgro-519f868c445a86b988772307ea1f1e2fc95fe54a.zip
all player code written but untested
Diffstat (limited to '')
-rw-r--r--project/Core/Src/Project/player.c34
1 files changed, 29 insertions, 5 deletions
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;
}