diff options
author | JP Cimalando <jpcima@users.noreply.github.com> | 2018-07-09 20:20:55 +0200 |
---|---|---|
committer | JP Cimalando <jpcima@users.noreply.github.com> | 2018-07-09 20:58:43 +0200 |
commit | 9fdaf5361c57438bf7f5bafaf6bb9a79b6bb7493 (patch) | |
tree | 5226a20603b6b60ee05dc2d74e7474d62012948b /src/midi_sequencer_impl.hpp | |
parent | 2a33defa5770a585f26c35ea731904859afd4ea6 (diff) | |
download | libADLMIDI-9fdaf5361c57438bf7f5bafaf6bb9a79b6bb7493.tar.gz libADLMIDI-9fdaf5361c57438bf7f5bafaf6bb9a79b6bb7493.tar.bz2 libADLMIDI-9fdaf5361c57438bf7f5bafaf6bb9a79b6bb7493.zip |
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) |