/* * 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" uint8_t get_song_info(uint8_t *p_song, song_info_t *ret) { ret->copyright = 0; ret->tempo = 0; ret->title = 0; 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 p_song; }