summaryrefslogtreecommitdiff
path: root/src/midifile.c
diff options
context:
space:
mode:
authorSimon Howard2009-08-30 21:34:12 +0000
committerSimon Howard2009-08-30 21:34:12 +0000
commitca23c95db8053b82fb817241e5de83a881f931e5 (patch)
tree37f743003e234f65540fa5e0e31b2bf774cf4df3 /src/midifile.c
parent076adeb0aa24e9bdc677435ddb6e444db58d5436 (diff)
downloadchocolate-doom-ca23c95db8053b82fb817241e5de83a881f931e5.tar.gz
chocolate-doom-ca23c95db8053b82fb817241e5de83a881f931e5.tar.bz2
chocolate-doom-ca23c95db8053b82fb817241e5de83a881f931e5.zip
Initial/basic MIDI track playback.
Subversion-branch: /branches/opl-branch Subversion-revision: 1643
Diffstat (limited to 'src/midifile.c')
-rw-r--r--src/midifile.c69
1 files changed, 69 insertions, 0 deletions
diff --git a/src/midifile.c b/src/midifile.c
index 61e06463..f1d8bb93 100644
--- a/src/midifile.c
+++ b/src/midifile.c
@@ -26,6 +26,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <assert.h>
#include "doomdef.h"
#include "doomtype.h"
@@ -62,6 +63,12 @@ typedef struct
int num_events;
} midi_track_t;
+struct midi_track_iter_s
+{
+ midi_track_t *track;
+ unsigned int position;
+};
+
struct midi_file_s
{
midi_header_t header;
@@ -626,6 +633,68 @@ midi_file_t *MIDI_LoadFile(char *filename)
return file;
}
+// Get the number of tracks in a MIDI file.
+
+unsigned int MIDI_NumTracks(midi_file_t *file)
+{
+ return file->num_tracks;
+}
+
+// Start iterating over the events in a track.
+
+midi_track_iter_t *MIDI_IterateTrack(midi_file_t *file, unsigned int track)
+{
+ midi_track_iter_t *iter;
+
+ assert(track < file->num_tracks);
+
+ iter = malloc(sizeof(*iter));
+ iter->track = &file->tracks[track];
+ iter->position = 0;
+
+ return iter;
+}
+
+// Get the time until the next MIDI event in a track.
+
+unsigned int MIDI_GetDeltaTime(midi_track_iter_t *iter)
+{
+ if (iter->position < iter->track->num_events)
+ {
+ midi_event_t *next_event;
+
+ next_event = &iter->track->events[iter->position];
+
+ return next_event->delta_time;
+ }
+ else
+ {
+ return 0;
+ }
+}
+
+// Get a pointer to the next MIDI event.
+
+int MIDI_GetNextEvent(midi_track_iter_t *iter, midi_event_t **event)
+{
+ if (iter->position < iter->track->num_events)
+ {
+ *event = &iter->track->events[iter->position];
+ ++iter->position;
+
+ return 1;
+ }
+ else
+ {
+ return 0;
+ }
+}
+
+unsigned int MIDI_GetFileTimeDivision(midi_file_t *file)
+{
+ return file->header.time_division;
+}
+
#ifdef TEST
static char *MIDI_EventTypeToString(midi_event_type_t event_type)