Swadge 2024 2.0.0
APIs to develop games for the Magfest Swadge
All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
midiFileParser.h
Go to the documentation of this file.
1#pragma once
2
3//==============================================================================
4// Includes
5//==============================================================================
6
7#include <stdint.h>
8#include <stdbool.h>
9#include <stddef.h>
10
11#include "cnfs_image.h"
12
13//==============================================================================
14// Enums
15//==============================================================================
16
29
33typedef enum
34{
36 TEXT = 0x01,
37 COPYRIGHT = 0x02,
40 LYRIC = 0x05,
41 MARKER = 0x06,
42 CUE_POINT = 0x07,
43 // I'm not sure these are real???
44 // PROGRAM_NAME,
45 // DEVICE_NAME,
49 TEMPO = 0x51,
55
66
67//==============================================================================
68// Structs
69//==============================================================================
70
74typedef struct
75{
77 uint32_t length;
78
80 uint8_t* data;
82
86typedef struct
87{
89 uint8_t* data;
90
92 uint32_t length;
93
96
98 uint16_t timeDivision;
99
101 uint16_t trackCount;
102
105} midiFile_t;
106
108
109typedef struct
110{
113
116
118 uint16_t division;
119
121 uint8_t stateCount;
122
126
130typedef struct
131{
133 uint8_t status;
134
137 uint8_t data[2];
139
154
158typedef struct
159{
162
164 uint32_t length;
165
166 union
167 {
170 const char* text;
171
173 const uint8_t* data;
174
176 uint32_t tempo;
177
179 uint16_t sequenceNumber;
180
182 uint8_t prefix;
183
185 struct
186 {
187 uint8_t hour;
188 uint8_t min;
189 uint8_t sec;
190 uint8_t frame;
191 uint8_t frameHundredths;
192 } startTime;
193
195 midiTimeSignature_t timeSignature;
196
199 struct
200 {
202 uint8_t flats;
203
205 uint8_t sharps;
206
208 bool minor;
209 } keySignature;
210 };
212
216typedef struct
217{
221
223 uint32_t length;
224
226 uint8_t prefix;
227
229 const uint8_t* data;
231
235typedef struct
236{
238 uint32_t deltaTime;
239
241 uint32_t absTime;
242
245
247 uint8_t track;
248
259
260//==============================================================================
261// Function Declarations
262//==============================================================================
263
273bool loadMidiData(uint8_t* data, size_t size, midiFile_t* file);
274
284bool loadMidiFile(cnfsFileIdx_t fIdx, midiFile_t* file, bool spiRam);
285
291void unloadMidiFile(midiFile_t* file);
292
301bool initMidiParser(midiFileReader_t* reader, const midiFile_t* file);
302
309void midiParserSetFile(midiFileReader_t* reader, const midiFile_t* file);
310
319
326
334
343bool midiNextEvent(midiFileReader_t* reader, midiEvent_t* event);
344
353int midiWriteEvent(uint8_t* out, int max, const midiEvent_t* event);
Contains all track-specific parsing state.
Definition midiFileParser.c:26
void midiParserSetFile(midiFileReader_t *reader, const midiFile_t *file)
Set a new file for the MIDI file reader. The reader's state will be reset.
Definition midiFileParser.c:906
struct midiTrackState midiTrackState_t
Definition midiFileParser.h:107
midiTrackState_t * states
An array containing the internal parser state for each track.
Definition midiFileParser.h:124
uint8_t flats
The number of flats in the key.
uint32_t deltaTime
The time between this event and the previous event.
Definition midiFileParser.h:238
uint16_t sequenceNumber
Contains a sequence number for this track, when type is SEQUENCE_NUMBER.
const char * text
Contains text data, when {type <= 0x0F}.
uint8_t data[2]
The data bytes of the MIDI status event. The meaning of these bytes depends on the status value.
Definition midiFileParser.h:137
uint8_t midiClocksPerMetronomeTick
The number of MIDI clocks per metronome tick.
Definition midiFileParser.h:150
midiTrack_t * tracks
An array of MIDI tracks.
Definition midiFileParser.h:104
midiFileFormat_t format
The MIDI file format which defines how this file's tracks are interpreted.
Definition midiFileParser.h:95
metaEventType_t type
The type of this MIDI meta-event.
Definition midiFileParser.h:161
midiFileFormat_t
The MIDI file format, which determines how to interpret the track or tracks it contains.
Definition midiFileParser.h:58
@ MIDI_FORMAT_0
One track only containing all MIDI data for any number of channels.
Definition midiFileParser.h:60
@ MIDI_FORMAT_2
Multiple MIDI tracks, played sequentially.
Definition midiFileParser.h:64
@ MIDI_FORMAT_1
Multiple MIDI tracks, played simultaneously.
Definition midiFileParser.h:62
uint8_t num32ndNotesPerBeat
Number of 32nd notes per 24 MIDI clocks (= 1 beat)
Definition midiFileParser.h:152
int midiWriteEvent(uint8_t *out, int max, const midiEvent_t *event)
Writes a MIDI event to a byte buffer.
Definition midiFileParser.c:1091
const uint8_t * data
A pointer to the data for this SysEx event.
Definition midiFileParser.h:229
midiEventType_t
The possible sub-types of MIDI events.
Definition midiFileParser.h:21
@ META_EVENT
A non-MIDI meta-event from a MIDI file, such as tempo or lyrics.
Definition midiFileParser.h:25
@ MIDI_EVENT
A normal MIDI status event, such as note on or off.
Definition midiFileParser.h:23
@ SYSEX_EVENT
A system-exclusive MIDI event.
Definition midiFileParser.h:27
uint8_t stateCount
The number of track states allocated.
Definition midiFileParser.h:121
void resetMidiParser(midiFileReader_t *reader)
Reset the state of the MIDI parser without deinitializing it or changing the file.
Definition midiFileParser.c:930
midiSysexEvent_t sysex
The MIDI System Exclusive event data, when type is SYSEX_EVENT.
uint8_t denominator
The power of two of the time signature denominator (e.g. 2 for 4/4, 3 for 4/8)
Definition midiFileParser.h:148
bool midiNextEvent(midiFileReader_t *reader, midiEvent_t *event)
Process and retrieve the next MIDI event in the file.
Definition midiFileParser.c:971
uint8_t prefix
Contains a channel or port prefix, when type is CHANNEL_PREFIX or PORT_PREFIX respectively.
uint16_t timeDivision
The time division of MIDI frames, either ticks per frame or ticks per quarter note.
Definition midiFileParser.h:98
bool loadMidiFile(cnfsFileIdx_t fIdx, midiFile_t *file, bool spiRam)
Load a MIDI file from the filesystem.
Definition midiFileParser.c:821
const uint8_t * data
Contains binary data, when type is PROPRIETARY.
metaEventType_t
The possible types of meta-events.
Definition midiFileParser.h:34
@ TIME_SIGNATURE
Definition midiFileParser.h:51
@ SEQUENCE_NUMBER
Definition midiFileParser.h:35
@ KEY_SIGNATURE
Definition midiFileParser.h:52
@ LYRIC
Definition midiFileParser.h:40
@ MARKER
Definition midiFileParser.h:41
@ PORT_PREFIX
Definition midiFileParser.h:47
@ CUE_POINT
Definition midiFileParser.h:42
@ SEQUENCE_OR_TRACK_NAME
Definition midiFileParser.h:38
@ TEXT
Definition midiFileParser.h:36
@ COPYRIGHT
Definition midiFileParser.h:37
@ CHANNEL_PREFIX
Definition midiFileParser.h:46
@ INSTRUMENT_NAME
Definition midiFileParser.h:39
@ PROPRIETARY
Definition midiFileParser.h:53
@ SMPTE_OFFSET
Definition midiFileParser.h:50
@ TEMPO
Definition midiFileParser.h:49
@ END_OF_TRACK
Definition midiFileParser.h:48
uint16_t trackCount
The number of tracks in this file.
Definition midiFileParser.h:101
const midiFile_t * file
A pointer to the MIDI file currently loaded into the reader, if any.
Definition midiFileParser.h:112
void deinitMidiParser(midiFileReader_t *reader)
Deinitialize the MIDI file reader and free any memory it has allocated.
Definition midiFileParser.c:957
midiStatusEvent_t midi
The MIDI status event data, when type is MIDI_EVENT.
uint8_t track
The index of the track which contains this event.
Definition midiFileParser.h:247
bool loadMidiData(uint8_t *data, size_t size, midiFile_t *file)
Load a MIDI file from raw data, without copying it.
Definition midiFileParser.c:795
bool minor
True for a minor key, false for a major key.
uint8_t numerator
The numerator of the time signature.
Definition midiFileParser.h:146
uint8_t * data
Pointer to the start of this chunk's data.
Definition midiFileParser.h:80
void unloadMidiFile(midiFile_t *file)
Free the data associated with the given MIDI file.
Definition midiFileParser.c:883
uint32_t absTime
The absolute timestamp of this event in ticks.
Definition midiFileParser.h:241
uint8_t prefix
A byte to prefix to the actual data, if non-zero.
Definition midiFileParser.h:226
uint8_t status
The MIDI status byte.
Definition midiFileParser.h:133
midiEventType_t type
The overall event type – MIDI, Meta, or SysEx.
Definition midiFileParser.h:244
uint32_t tempo
Contains a tempo, in microseconds per quarter note, when type is TEMPO.
midiMetaEvent_t meta
The non-MIDI meta-event data, when type is META_EVENT.
uint32_t length
Total chunk length.
Definition midiFileParser.h:77
uint16_t manufacturerId
The manufacturer ID embedded in the SysEx event.
Definition midiFileParser.h:220
bool handleMetaEvents
If true, text meta-events will be handled and sent to the MIDI player.
Definition midiFileParser.h:115
uint8_t sharps
The number of sharps in the key.
bool initMidiParser(midiFileReader_t *reader, const midiFile_t *file)
Initialize or reset the MIDI file reader with a particular file.
Definition midiFileParser.c:890
uint32_t midiNextEventTime(midiFileReader_t *reader)
Return the start time of the next event in the MIDI file being read.
uint16_t division
The number of divisions per midi tick.
Definition midiFileParser.h:118
Contains information for an entire MIDI event or non-MIDI meta-event.
Definition midiFileParser.h:236
Definition midiFileParser.h:110
Contains information which applies to the entire MIDI file.
Definition midiFileParser.h:87
Contains information for a non-MIDI meta-event from a MIDI file.
Definition midiFileParser.h:159
Data for a normal MIDI status event.
Definition midiFileParser.h:131
Contains information for a MIDI System Exclusive event.
Definition midiFileParser.h:217
Data for a MIDI time signature definition.
Definition midiFileParser.h:144
Contains basic information pointing to a MIDI track within its file data.
Definition midiFileParser.h:75