From b96cdbe82fa6cb51ac91072ad86e084d739fd9be Mon Sep 17 00:00:00 2001 From: Simon Howard Date: Sat, 28 Mar 2009 00:24:50 +0000 Subject: Initial MIDI file parsing code. Subversion-branch: /branches/opl-branch Subversion-revision: 1489 --- src/midifile.h | 135 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 135 insertions(+) create mode 100644 src/midifile.h (limited to 'src/midifile.h') diff --git a/src/midifile.h b/src/midifile.h new file mode 100644 index 00000000..d7df8b86 --- /dev/null +++ b/src/midifile.h @@ -0,0 +1,135 @@ +// Emacs style mode select -*- C++ -*- +//----------------------------------------------------------------------------- +// +// Copyright(C) 2009 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. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +// 02111-1307, USA. +// +// DESCRIPTION: +// MIDI file parsing. +// +//----------------------------------------------------------------------------- + +#ifndef MIDIFILE_H +#define MIDIFILE_H + +typedef struct midi_file_s midi_file_t; + +typedef enum +{ + MIDI_EVENT_NOTE_OFF = 0x8, + MIDI_EVENT_NOTE_ON = 0x9, + MIDI_EVENT_AFTERTOUCH = 0xa, + MIDI_EVENT_CONTROLLER = 0xb, + MIDI_EVENT_PROGRAM_CHANGE = 0xc, + MIDI_EVENT_CHAN_AFTERTOUCH = 0xd, + MIDI_EVENT_PITCH_BEND = 0xe, + + 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_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 = 0x8, + MIDI_META_END_OF_TRACK = 0x9, + MIDI_META_SET_TEMPO = 0xa, + MIDI_META_SMPTE_OFFSET = 0xb, + MIDI_META_TIME_SIGNATURE = 0xc, + MIDI_META_KEY_SIGNATURE = 0xd, + MIDI_META_SEQUENCER_SPECIFIC = 0xe, +} 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; + +midi_file_t *MIDI_OpenFile(char *filename); +void MIDI_CloseFile(midi_file_t *file); + +#endif /* #ifndef MIDIFILE_H */ + -- cgit v1.2.3 From 9b192c44f932542ccd835936d593c43ce3e9e9e3 Mon Sep 17 00:00:00 2001 From: Simon Howard Date: Fri, 3 Apr 2009 19:58:08 +0000 Subject: Fix up MIDI reading code; add test code. Subversion-branch: /branches/opl-branch Subversion-revision: 1494 --- src/midifile.h | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) (limited to 'src/midifile.h') diff --git a/src/midifile.h b/src/midifile.h index d7df8b86..7928fdda 100644 --- a/src/midifile.h +++ b/src/midifile.h @@ -65,13 +65,14 @@ typedef enum MIDI_META_MARKER = 0x6, MIDI_META_CUE_POINT = 0x7, - MIDI_META_CHANNEL_PREFIX = 0x8, - MIDI_META_END_OF_TRACK = 0x9, - MIDI_META_SET_TEMPO = 0xa, - MIDI_META_SMPTE_OFFSET = 0xb, - MIDI_META_TIME_SIGNATURE = 0xc, - MIDI_META_KEY_SIGNATURE = 0xd, - MIDI_META_SEQUENCER_SPECIFIC = 0xe, + 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 -- cgit v1.2.3 From 3dd7e1db9bf26e1e50bc13f6b176e54d63f2da85 Mon Sep 17 00:00:00 2001 From: Simon Howard Date: Mon, 13 Apr 2009 22:23:05 +0000 Subject: Extend MIDI file code to support reading multi-track files. Subversion-branch: /branches/opl-branch Subversion-revision: 1498 --- src/midifile.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/midifile.h') diff --git a/src/midifile.h b/src/midifile.h index 7928fdda..16f911e7 100644 --- a/src/midifile.h +++ b/src/midifile.h @@ -130,7 +130,7 @@ typedef struct } midi_event_t; midi_file_t *MIDI_OpenFile(char *filename); -void MIDI_CloseFile(midi_file_t *file); +void MIDI_FreeFile(midi_file_t *file); #endif /* #ifndef MIDIFILE_H */ -- cgit v1.2.3 From d8ada5c41da3eec5ef163d9efac9cb5dbdc2cb6b Mon Sep 17 00:00:00 2001 From: Simon Howard Date: Wed, 15 Apr 2009 19:00:25 +0000 Subject: Parse MIDI events that reuse the event type from the previous event. Subversion-branch: /branches/opl-branch Subversion-revision: 1499 --- src/midifile.h | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) (limited to 'src/midifile.h') diff --git a/src/midifile.h b/src/midifile.h index 16f911e7..490b0171 100644 --- a/src/midifile.h +++ b/src/midifile.h @@ -30,13 +30,13 @@ typedef struct midi_file_s midi_file_t; typedef enum { - MIDI_EVENT_NOTE_OFF = 0x8, - MIDI_EVENT_NOTE_ON = 0x9, - MIDI_EVENT_AFTERTOUCH = 0xa, - MIDI_EVENT_CONTROLLER = 0xb, - MIDI_EVENT_PROGRAM_CHANGE = 0xc, - MIDI_EVENT_CHAN_AFTERTOUCH = 0xd, - MIDI_EVENT_PITCH_BEND = 0xe, + 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, -- cgit v1.2.3 From 324c1d8776054394d30ea987f84c1ba2f1b1ff6f Mon Sep 17 00:00:00 2001 From: Simon Howard Date: Sat, 29 Aug 2009 21:05:36 +0000 Subject: Rename MIDI_OpenFile to MIDI_LoadFile, remove unneeded structure packing. Subversion-branch: /branches/opl-branch Subversion-revision: 1636 --- src/midifile.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/midifile.h') diff --git a/src/midifile.h b/src/midifile.h index 490b0171..f9acea35 100644 --- a/src/midifile.h +++ b/src/midifile.h @@ -129,7 +129,7 @@ typedef struct } data; } midi_event_t; -midi_file_t *MIDI_OpenFile(char *filename); +midi_file_t *MIDI_LoadFile(char *filename); void MIDI_FreeFile(midi_file_t *file); #endif /* #ifndef MIDIFILE_H */ -- cgit v1.2.3 From ca23c95db8053b82fb817241e5de83a881f931e5 Mon Sep 17 00:00:00 2001 From: Simon Howard Date: Sun, 30 Aug 2009 21:34:12 +0000 Subject: Initial/basic MIDI track playback. Subversion-branch: /branches/opl-branch Subversion-revision: 1643 --- src/midifile.h | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) (limited to 'src/midifile.h') diff --git a/src/midifile.h b/src/midifile.h index f9acea35..a1ab4976 100644 --- a/src/midifile.h +++ b/src/midifile.h @@ -27,6 +27,9 @@ #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 { @@ -129,8 +132,33 @@ typedef struct } 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); + +// 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); + #endif /* #ifndef MIDIFILE_H */ -- cgit v1.2.3 From 1d045ed19c58abff063ac69db24a2e73d62ef530 Mon Sep 17 00:00:00 2001 From: Simon Howard Date: Sun, 30 Aug 2009 22:03:20 +0000 Subject: Initial, broken, volume level setting. Subversion-branch: /branches/opl-branch Subversion-revision: 1644 --- src/midifile.h | 3 +++ 1 file changed, 3 insertions(+) (limited to 'src/midifile.h') diff --git a/src/midifile.h b/src/midifile.h index a1ab4976..faef549c 100644 --- a/src/midifile.h +++ b/src/midifile.h @@ -54,6 +54,9 @@ typedef enum 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_t; typedef enum -- cgit v1.2.3 From 556f7291ea0199144794166af2757aa7ad832a7a Mon Sep 17 00:00:00 2001 From: Simon Howard Date: Tue, 1 Sep 2009 18:17:11 +0000 Subject: Loop songs (when appropriate) Subversion-branch: /branches/opl-branch Subversion-revision: 1654 --- src/midifile.h | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'src/midifile.h') diff --git a/src/midifile.h b/src/midifile.h index faef549c..4ee0ddb2 100644 --- a/src/midifile.h +++ b/src/midifile.h @@ -155,6 +155,10 @@ unsigned int MIDI_NumTracks(midi_file_t *file); 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); @@ -163,5 +167,9 @@ unsigned int MIDI_GetDeltaTime(midi_track_iter_t *iter); 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 */ -- cgit v1.2.3