From 9db025199644833d70e729d03e6151f8cce58ed5 Mon Sep 17 00:00:00 2001 From: sowgro Date: Tue, 9 Dec 2025 14:41:02 -0500 Subject: Parser for one track working --- project/Core/Src/Project/player.c | 67 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 project/Core/Src/Project/player.c (limited to 'project/Core/Src/Project/player.c') diff --git a/project/Core/Src/Project/player.c b/project/Core/Src/Project/player.c new file mode 100644 index 0000000..71531a8 --- /dev/null +++ b/project/Core/Src/Project/player.c @@ -0,0 +1,67 @@ +/* + * player.c + * + * Created on: Nov 25, 2025 + * Author: sowgro + */ + +#include "endian_converters.h" +#include +#include "endian_converters.h" +#include "hw8.h" + +#define NOTE_OFF_EVENT (0) +#define NOTE_ON_EVENT (1) +#define KEY_PRESSURE (2) + +typedef struct { + uint8_t ev_type; + uint32_t abs_time; + uint8_t key_number; + uint8_t value; +} note_event_t; + +void parse_song(uint8_t *p_song) { + p_song += 4; // skip MTrk + uint32_t MTrk_len = convert_to_uint32(p_song); + p_song += 4; + + note_event_t events[1/*track*/][1024/*event*/]; + int curEvent = 0; + uint32_t prev_abs_time = 0; + + for (uint8_t *p_end = p_song + MTrk_len; p_song != p_end; p_song++) { + note_event_t note; + + parseDelay_result_t delay_result = parseDelay(p_song); + uint32_t abs_time = prev_abs_time + delay_result.value; + note.abs_time = abs_time; + prev_abs_time = abs_time; + p_song += delay_result.bytes_used; + + + if (*p_song >> 4 == 0b1000) { + note.ev_type = NOTE_OFF_EVENT; + } else if (*p_song >> 4 == 0b1001) { + note.ev_type = NOTE_ON_EVENT; + } else if (*p_song >> 4 == 0b1010) { + note.ev_type = KEY_PRESSURE; + } else { + continue; + } + +// size_t channelNumber = *p_song && 0b00001111; + p_song++; + + note.key_number = *p_song; + p_song++; + + note.value = *p_song; + p_song++; + + events[0][curEvent++] = note; + } + events[0][curEvent] = 0; + + printf("done %p", events); +} -- cgit v1.2.3