/* * song_info.c * * Created on: Oct 9, 2025 * Author: sowgro */ #include "song.h" #include "activity4.h" #include #include "song_info.h" #include "endian_converters.h" song_info_t get_song_info(uint8_t *p_song) { song_info_t ret = {0, 0, 0}; // header_t *header = (header_t *) p_song; p_song += sizeof(header_t) - 2; // move pointer past header p_song += 4; // move past MTrk label uint32_t MTrk_len = convert_to_uint32(p_song); // read in size of MTrk p_song += sizeof(MTrk_len); for (uint8_t *p_end = p_song + MTrk_len; p_song != p_end; p_song++) { // FF 02 - copyright if (convert_to_uint16(p_song) == 0xFF02) { p_song += sizeof(uint16_t); uint8_t ev_len = *(uint8_t *) p_song; p_song += sizeof(ev_len); ret.copyright = (char *) p_song; ret.copyright[ev_len] = 0; } // FF 03 - title if (convert_to_uint16(p_song) == 0xFF03) { p_song += sizeof(uint16_t); uint8_t ev_len = *(uint8_t *) p_song; p_song += sizeof(ev_len); ret.title = (char *) p_song; ret.title[ev_len] = 0; } // FF 51 - tempo if (convert_to_uint16(p_song) == 0xFF51) { p_song += sizeof(uint16_t); p_song += sizeof(uint8_t); // skip length, always 03 ret.tempo = convert_to_uint24(p_song); } } return ret; }