diff options
author | Vitaly Novichkov <Wohlstand@users.noreply.github.com> | 2018-07-09 22:39:09 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-07-09 22:39:09 +0300 |
commit | 4ac22738e50e20cf00e5b2d0efead4ba3aadb04e (patch) | |
tree | ac3869a8eb7a1daa8d74f3e40e7d73d90c6f7eb8 /src/midi_sequencer_impl.hpp | |
parent | e1593b483c84fc46c4e1b3fabe03a2fe6f6be266 (diff) | |
parent | 9fdaf5361c57438bf7f5bafaf6bb9a79b6bb7493 (diff) | |
download | libADLMIDI-4ac22738e50e20cf00e5b2d0efead4ba3aadb04e.tar.gz libADLMIDI-4ac22738e50e20cf00e5b2d0efead4ba3aadb04e.tar.bz2 libADLMIDI-4ac22738e50e20cf00e5b2d0efead4ba3aadb04e.zip |
Merge pull request #133 from jpcima/ail-callback
xmi: handle AIL callback trigger
Diffstat (limited to 'src/midi_sequencer_impl.hpp')
-rw-r--r-- | src/midi_sequencer_impl.hpp | 36 |
1 files changed, 31 insertions, 5 deletions
diff --git a/src/midi_sequencer_impl.hpp b/src/midi_sequencer_impl.hpp index 2749e26..bd0a226 100644 --- a/src/midi_sequencer_impl.hpp +++ b/src/midi_sequencer_impl.hpp @@ -277,7 +277,9 @@ BW_MidiSequencer::BW_MidiSequencer() : m_loopEndTime(-1.0), m_tempoMultiplier(1.0), m_atEnd(false), - m_trackSolo(~(size_t)0) + m_trackSolo(~(size_t)0), + m_triggerHandler(NULL), + m_triggerUserData(NULL) { m_loop.reset(); m_loop.invalidLoop = false; @@ -335,6 +337,12 @@ void BW_MidiSequencer::setSoloTrack(size_t track) m_trackSolo = track; } +void BW_MidiSequencer::setTriggerHandler(TriggerHandler handler, void *userData) +{ + m_triggerHandler = handler; + m_triggerUserData = userData; +} + const std::vector<BW_MidiSequencer::CmfInstrument> BW_MidiSequencer::getRawCmfInstruments() { return m_cmfInstruments; @@ -1345,8 +1353,9 @@ BW_MidiSequencer::MidiEvent BW_MidiSequencer::parseEvent(const uint8_t **pptr, c if(m_format == Format_XMIDI) { - if(evt.data[0] == 116) + switch(evt.data[0]) { + case 116: // For Loop Controller evt.type = MidiEvent::T_SPECIAL; evt.subtype = MidiEvent::ST_LOOPSTACK_BEGIN; evt.data[0] = evt.data[1]; @@ -1362,10 +1371,9 @@ BW_MidiSequencer::MidiEvent BW_MidiSequencer::parseEvent(const uint8_t **pptr, c evt.data[0] ); } - } + break; - if(evt.data[0] == 117) - { + case 117: // Next/Break Loop Controller evt.type = MidiEvent::T_SPECIAL; evt.subtype = evt.data[1] < 64 ? MidiEvent::ST_LOOPSTACK_BREAK : @@ -1382,6 +1390,13 @@ BW_MidiSequencer::MidiEvent BW_MidiSequencer::parseEvent(const uint8_t **pptr, c m_loop.stackLevel - 1 ); } + break; + + case 119: // Callback Trigger + evt.type = MidiEvent::T_SPECIAL; + evt.subtype = MidiEvent::ST_CALLBACK_TRIGGER; + evt.data.assign(1, evt.data[1]); + break; } } } @@ -1518,6 +1533,17 @@ void BW_MidiSequencer::handleEvent(size_t track, const BW_MidiSequencer::MidiEve } } + if(evtype == MidiEvent::ST_CALLBACK_TRIGGER) + { +#if 0 /* Print all callback triggers events */ + if(m_interface->onDebugMessage) + m_interface->onDebugMessage(m_interface->onDebugMessage_userData, "Callback Trigger: %02X", evt.data[0]); +#endif + if(m_triggerHandler) + m_triggerHandler(m_triggerUserData, data[0], track); + return; + } + if(evtype == MidiEvent::ST_RAWOPL) // Special non-spec ADLMIDI special for IMF playback: Direct poke to AdLib { if(m_interface->rt_rawOPL) |