#include <midiparser_m.h>
Classes | |
struct | LoopData |
Public Member Functions | |
MidiParser_M (int8 source=-1) | |
bool | loadMusic (byte *data, uint32 size) override |
void | unloadMusic () override |
void | onTimer () override |
![]() | |
MidiParser (int8 source=-1) | |
virtual void | property (int prop, int value) |
virtual int32 | determineDataSize (Common::SeekableReadStream *stream) |
virtual void | setMidiDriver (MidiDriver_BASE *driver) |
void | setTimerRate (uint32 rate) |
virtual void | setTempo (uint32 tempo) |
bool | isPlaying () const |
bool | startPlaying () |
void | stopPlaying () |
void | pausePlaying () |
void | resumePlaying () |
bool | setTrack (int track) |
bool | jumpToTick (uint32 tick, bool fireEvents=false, bool stopNotes=true, bool dontSendNoteOn=false) |
virtual bool | hasJumpIndex (uint8 index) |
virtual bool | jumpToIndex (uint8 index, bool stopNotes=true) |
uint32 | getPPQN () |
virtual uint32 | getTick () |
Protected Member Functions | |
bool | processEvent (const EventInfo &info, bool fireEvents=true) override |
void | parseNextEvent (EventInfo &info) override |
void | allNotesOff () override |
![]() | |
virtual void | resetTracking () |
virtual void | determineNextEvent () |
virtual void | rebaseTracking () |
void | activeNote (byte channel, byte note, bool active) |
void | hangingNote (byte channel, byte note, uint32 ticksLeft, bool recycle=true) |
void | hangAllActiveNotes () |
virtual void | onTrackStart (uint8 track) |
virtual void | sendToDriver (uint32 b) |
void | sendToDriver (byte status, byte firstOp, byte secondOp) |
virtual void | sendMetaEventToDriver (byte type, byte *data, uint16 length) |
uint32 | read4high (byte *&data) |
uint16 | read2low (byte *&data) |
Protected Attributes | |
uint32 | _trackLength |
byte * | _loopPoint |
Common::FixedStack< LoopData, 16 > * | _loopStack |
![]() | |
uint16 | _activeNotes [128] |
Each uint16 is a bit mask for channels that have that note on. | |
NoteTimer | _hangingNotes [32] |
Used for "Smart Jump" and MIDI formats that do not include explicit Note Off events. More... | |
byte | _hangingNotesCount |
Count of hanging notes, used to optimize expiration. | |
MidiDriver_BASE * | _driver |
The device to which all events will be transmitted. | |
uint32 | _timerRate |
The time in microseconds between onTimer() calls. Obtained from the MidiDriver. | |
uint32 | _ppqn |
Pulses Per Quarter Note. (We refer to "pulses" as "ticks".) | |
uint32 | _tempo |
Microseconds per quarter note. | |
uint32 | _psecPerTick |
Microseconds per tick (_tempo / _ppqn). | |
uint32 | _sysExDelay |
Number of microseconds until the next SysEx event can be sent. | |
bool | _autoLoop |
For lightweight clients that don't provide their own flow control. | |
bool | _smartJump |
Support smart expiration of hanging notes when jumping. | |
bool | _centerPitchWheelOnUnload |
Center the pitch wheels when unloading a song. | |
bool | _sendSustainOffOnNotesOff |
Send a sustain off on a notes off event, stopping hanging notes. | |
bool | _disableAllNotesOffMidiEvents |
Don't send All Notes Off MIDI messages. | |
bool | _disableAutoStartPlayback |
Do not automatically start playback after parsing MIDI data or setting the track. | |
byte * | _tracks [MAXIMUM_TRACKS][MAXIMUM_SUBTRACKS] |
Multi-track MIDI formats are supported, up to 120 tracks with 20 subtracks each. | |
byte | _numTracks |
Count of total tracks for multi-track MIDI formats. 1 for single-track formats. | |
byte | _numSubtracks [MAXIMUM_TRACKS] |
The number of subtracks for each track. | |
byte | _activeTrack |
Keeps track of the currently active track, in multi-track formats. | |
Tracker | _position |
The current time/position in the active track. | |
EventInfo * | _nextEvent |
EventInfo | _nextSubtrackEvents [MAXIMUM_SUBTRACKS] |
bool | _abortParse |
If a jump or other operation interrupts parsing, flag to abort. | |
bool | _jumpingToTick |
True if currently inside jumpToTick. | |
bool | _doParse |
True if the parser should be parsing; false if it should not be active. | |
bool | _pause |
True if the parser has paused parsing. | |
int8 | _source |
Additional Inherited Members | |
![]() | |
enum | { mpAutoLoop = 2, mpSmartJump = 3, mpCenterPitchWheelOnUnload = 4, mpSendSustainOffOnNotesOff = 5, mpDisableAllNotesOffMidiEvents = 6, mpDisableAutoStartPlayback = 7 } |
typedef void(* | XMidiCallbackProc) (byte eventData, void *refCon) |
![]() | |
static void | defaultXMidiCallback (byte eventData, void *refCon) |
static MidiParser * | createParser_SMF (int8 source=-1) |
static MidiParser * | createParser_XMIDI (XMidiCallbackProc proc=defaultXMidiCallback, void *refCon=0, int source=-1) |
static MidiParser * | createParser_QT (int8 source=-1) |
static void | timerCallback (void *data) |
![]() | |
static uint32 | readVLQ (byte *&data) |
![]() | |
static const uint8 | MAXIMUM_TRACKS = 120 |
static const uint8 | MAXIMUM_SUBTRACKS = 20 |
A parser for the music format M, used by Times Of Lore, Bad Blood and Ultima 6. This format is not really a MIDI format; it targets the OPL2 chip. However, it has several things in common with MIDI: it is a stream of events, it has note on and note off events and events similar to MIDI controllers, the high nibble of the first event byte is the command while the low nibble is usually the channel. The commands are different. M does not use the status byte / data byte convention and delta times are specified using a wait command. It uses channels 0-8, corresponding to the 9 OPL2 channels. OPL rhythm mode is not used.