diff options
author | Simon Howard | 2009-08-30 21:34:12 +0000 |
---|---|---|
committer | Simon Howard | 2009-08-30 21:34:12 +0000 |
commit | ca23c95db8053b82fb817241e5de83a881f931e5 (patch) | |
tree | 37f743003e234f65540fa5e0e31b2bf774cf4df3 /src/midifile.c | |
parent | 076adeb0aa24e9bdc677435ddb6e444db58d5436 (diff) | |
download | chocolate-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.c | 69 |
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) |