24 #ifndef AUDIO_MIDIPARSER_H 25 #define AUDIO_MIDIPARSER_H 27 #include "common/scummsys.h" 28 #include "common/endian.h" 29 #include "common/stream.h" 111 EventInfo() : start(0), delta(0), event(0), length(0), loop(
false), noop(
false) { basic.param1 = 0; basic.param2 = 0; ext.type = 0; ext.data = 0; }
125 NoteTimer() : channel(0), note(0), timeLeft(0) {}
291 static const uint8 MAXIMUM_TRACKS = 120;
293 uint16 _activeNotes[128];
295 byte _hangingNotesCount;
310 byte *_tracks[MAXIMUM_TRACKS];
333 static uint32 readVLQ(byte * &data);
334 virtual void resetTracking();
335 virtual void allNotesOff();
336 virtual void parseNextEvent(
EventInfo &info) = 0;
337 virtual bool processEvent(
const EventInfo &info,
bool fireEvents =
true);
339 void activeNote(byte channel, byte note,
bool active);
340 void hangingNote(byte channel, byte note, uint32 ticksLeft,
bool recycle =
true);
341 void hangAllActiveNotes();
350 virtual void sendToDriver(uint32 b);
351 void sendToDriver(byte status, byte firstOp, byte secondOp) {
352 sendToDriver(status | ((uint32)firstOp << 8) | ((uint32)secondOp << 16));
354 virtual void sendMetaEventToDriver(byte type, byte *data, uint16 length);
363 uint32 val = READ_BE_UINT32(data);
375 uint16 val = READ_LE_UINT16(data);
403 mpCenterPitchWheelOnUnload = 4,
409 mpSendSustainOffOnNotesOff = 5,
419 mpDisableAllNotesOffMidiEvents = 6,
426 mpDisableAutoStartPlayback = 7
430 typedef void (*XMidiCallbackProc)(byte eventData,
void *refCon);
435 virtual bool loadMusic(byte *data, uint32 size) = 0;
436 virtual void unloadMusic();
437 virtual void property(
int prop,
int value);
446 virtual void setMidiDriver(
MidiDriver_BASE *driver) { _driver = driver; }
447 void setTimerRate(uint32 rate) { _timerRate = rate; }
448 virtual void setTempo(uint32 tempo);
449 virtual void onTimer();
451 bool isPlaying()
const {
return (_position.
_playPos != 0 && _doParse); }
480 void resumePlaying();
482 bool setTrack(
int track);
483 bool jumpToTick(uint32 tick,
bool fireEvents =
false,
bool stopNotes =
true,
bool dontSendNoteOn =
false);
497 virtual bool jumpToIndex(uint8 index,
bool stopNotes =
true) {
return false; }
499 uint32 getPPQN() {
return _ppqn; }
500 virtual uint32 getTick() {
return _position.
_playTick; }
502 static void defaultXMidiCallback(byte eventData,
void *refCon);
504 static MidiParser *createParser_SMF(int8 source = -1);
505 static MidiParser *createParser_XMIDI(XMidiCallbackProc proc = defaultXMidiCallback,
void *refCon = 0,
int source = -1);
506 static MidiParser *createParser_QT(int8 source = -1);
507 static void timerCallback(
void *data) { ((
MidiParser *) data)->onTimer(); }
uint32 _sysExDelay
Number of microseconds until the next SysEx event can be sent.
Definition: midiparser.h:303
Definition: midiparser.h:121
uint32 length
Definition: midiparser.h:100
uint32 _playTick
Current MIDI tick; may be in between event ticks.
Definition: midiparser.h:61
byte type
For META events, this indicates the META type.
Definition: midiparser.h:96
int8 _source
Definition: midiparser.h:330
bool _autoLoop
For lightweight clients that don't provide their own flow control.
Definition: midiparser.h:304
Definition: midiparser.h:58
byte _activeTrack
Keeps track of the currently active track, in multi-track formats.
Definition: midiparser.h:312
byte _runningStatus
Cached MIDI command, for MIDI streams that rely on implied event codes.
Definition: midiparser.h:64
bool _smartJump
Support smart expiration of hanging notes when jumping.
Definition: midiparser.h:305
bool _disableAutoStartPlayback
Do not automatically start playback after parsing MIDI data or setting the track. ...
Definition: midiparser.h:309
Tracker _position
The current time/position in the active track.
Definition: midiparser.h:314
uint32 _ppqn
Pulses Per Quarter Note. (We refer to "pulses" as "ticks".)
Definition: midiparser.h:300
virtual bool jumpToIndex(uint8 index, bool stopNotes=true)
Definition: midiparser.h:497
virtual bool hasJumpIndex(uint8 index)
Definition: midiparser.h:490
byte note
The note number for the active note.
Definition: midiparser.h:123
bool _doParse
True if the parser should be parsing; false if it should not be active.
Definition: midiparser.h:320
uint32 _lastEventTime
The time, in microseconds, of the last event that was parsed.
Definition: midiparser.h:62
byte param2
The second parameter in a simple MIDI message.
Definition: midiparser.h:93
byte channel() const
Separates the MIDI channel from the event.
Definition: midiparser.h:108
uint32 _timerRate
The time in microseconds between onTimer() calls. Obtained from the MidiDriver.
Definition: midiparser.h:299
uint32 read4high(byte *&data)
Definition: midiparser.h:362
bool _centerPitchWheelOnUnload
Center the pitch wheels when unloading a song.
Definition: midiparser.h:306
Definition: midiparser.h:84
EventInfo _nextEvent
Definition: midiparser.h:315
virtual void onTrackStart(uint8 track)
Definition: midiparser.h:348
bool _pause
True if the parser has paused parsing.
Definition: midiparser.h:321
byte * data
For META and SysEx events, this points to the start of the data.
Definition: midiparser.h:97
byte _numTracks
Count of total tracks for multi-track MIDI formats. 1 for single-track formats.
Definition: midiparser.h:311
virtual int32 determineDataSize(Common::SeekableReadStream *stream)
Definition: midiparser.h:444
void clear()
Clears all data; used by the constructor for initialization.
Definition: midiparser.h:69
byte param1
The first parameter in a simple MIDI message.
Definition: midiparser.h:92
uint32 _psecPerTick
Microseconds per tick (_tempo / _ppqn).
Definition: midiparser.h:302
uint32 _playTime
Current time in microseconds; may be in between event times.
Definition: midiparser.h:60
Definition: mididrv.h:112
MidiDriver_BASE * _driver
The device to which all events will be transmitted.
Definition: midiparser.h:298
uint32 _tempo
Microseconds per quarter note.
Definition: midiparser.h:301
uint16 read2low(byte *&data)
Definition: midiparser.h:374
uint32 _lastEventTick
The tick at which the last parsed event occurs.
Definition: midiparser.h:63
byte event
Definition: midiparser.h:88
byte * _playPos
A pointer to the next event to be parsed.
Definition: midiparser.h:59
byte * start
Definition: midiparser.h:85
byte channel
The MIDI channel on which the note was played.
Definition: midiparser.h:122
bool _sendSustainOffOnNotesOff
Send a sustain off on a notes off event, stopping hanging notes.
Definition: midiparser.h:307
bool _jumpingToTick
True if currently inside jumpToTick.
Definition: midiparser.h:319
bool _disableAllNotesOffMidiEvents
Don't send All Notes Off MIDI messages.
Definition: midiparser.h:308
byte command() const
Separates the command code from the event.
Definition: midiparser.h:109
uint32 timeLeft
The time, in microseconds, remaining before the note should be turned off.
Definition: midiparser.h:124
Definition: midiparser.h:289
bool noop
Definition: midiparser.h:105