ref: 51ab62f6fb06b42c80c98ea71ab29d208d10e422
dir: /src/midifile.h/
//
// Copyright(C) 2005-2014 Simon Howard
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 2
// of the License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// DESCRIPTION:
// MIDI file parsing.
//
#ifndef MIDIFILE_H
#define MIDIFILE_H
typedef struct midi_file_s midi_file_t;
typedef struct midi_track_iter_s midi_track_iter_t;
#define MIDI_CHANNELS_PER_TRACK 16
typedef enum
{
MIDI_EVENT_NOTE_OFF = 0x80,
MIDI_EVENT_NOTE_ON = 0x90,
MIDI_EVENT_AFTERTOUCH = 0xa0,
MIDI_EVENT_CONTROLLER = 0xb0,
MIDI_EVENT_PROGRAM_CHANGE = 0xc0,
MIDI_EVENT_CHAN_AFTERTOUCH = 0xd0,
MIDI_EVENT_PITCH_BEND = 0xe0,
MIDI_EVENT_SYSEX = 0xf0,
MIDI_EVENT_SYSEX_SPLIT = 0xf7,
MIDI_EVENT_META = 0xff,
} midi_event_type_t;
typedef enum
{
MIDI_CONTROLLER_BANK_SELECT = 0x0,
MIDI_CONTROLLER_MODULATION = 0x1,
MIDI_CONTROLLER_BREATH_CONTROL = 0x2,
MIDI_CONTROLLER_FOOT_CONTROL = 0x3,
MIDI_CONTROLLER_PORTAMENTO = 0x4,
MIDI_CONTROLLER_DATA_ENTRY = 0x5,
MIDI_CONTROLLER_MAIN_VOLUME = 0x7,
MIDI_CONTROLLER_PAN = 0xa,
MIDI_CONTROLLER_ALL_NOTES_OFF = 0x7b,
} midi_controller_t;
typedef enum
{
MIDI_META_SEQUENCE_NUMBER = 0x0,
MIDI_META_TEXT = 0x1,
MIDI_META_COPYRIGHT = 0x2,
MIDI_META_TRACK_NAME = 0x3,
MIDI_META_INSTR_NAME = 0x4,
MIDI_META_LYRICS = 0x5,
MIDI_META_MARKER = 0x6,
MIDI_META_CUE_POINT = 0x7,
MIDI_META_CHANNEL_PREFIX = 0x20,
MIDI_META_END_OF_TRACK = 0x2f,
MIDI_META_SET_TEMPO = 0x51,
MIDI_META_SMPTE_OFFSET = 0x54,
MIDI_META_TIME_SIGNATURE = 0x58,
MIDI_META_KEY_SIGNATURE = 0x59,
MIDI_META_SEQUENCER_SPECIFIC = 0x7f,
} midi_meta_event_type_t;
typedef struct
{
// Meta event type:
unsigned int type;
// Length:
unsigned int length;
// Meta event data:
byte *data;
} midi_meta_event_data_t;
typedef struct
{
// Length:
unsigned int length;
// Event data:
byte *data;
} midi_sysex_event_data_t;
typedef struct
{
// The channel number to which this applies:
unsigned int channel;
// Extra parameters:
unsigned int param1;
unsigned int param2;
} midi_channel_event_data_t;
typedef struct
{
// Time between the previous event and this event.
unsigned int delta_time;
// Type of event:
midi_event_type_t event_type;
union
{
midi_channel_event_data_t channel;
midi_meta_event_data_t meta;
midi_sysex_event_data_t sysex;
} data;
} midi_event_t;
// Load a MIDI file.
midi_file_t *MIDI_LoadFile(char *filename);
// Free a MIDI file.
void MIDI_FreeFile(midi_file_t *file);
// Get the time division value from the MIDI header.
unsigned int MIDI_GetFileTimeDivision(midi_file_t *file);
// Get the number of tracks in a MIDI file.
unsigned int MIDI_NumTracks(midi_file_t *file);
// Start iterating over the events in a track.
midi_track_iter_t *MIDI_IterateTrack(midi_file_t *file, unsigned int track_num);
// Free an iterator.
void MIDI_FreeIterator(midi_track_iter_t *iter);
// Get the time until the next MIDI event in a track.
unsigned int MIDI_GetDeltaTime(midi_track_iter_t *iter);
// Get a pointer to the next MIDI event.
int MIDI_GetNextEvent(midi_track_iter_t *iter, midi_event_t **event);
// Reset an iterator to the beginning of a track.
void MIDI_RestartIterator(midi_track_iter_t *iter);
#endif /* #ifndef MIDIFILE_H */