aboutsummaryrefslogtreecommitdiff
path: root/src/midi_sequencer_impl.hpp
diff options
context:
space:
mode:
authorJP Cimalando <jpcima@users.noreply.github.com>2018-07-09 20:20:55 +0200
committerJP Cimalando <jpcima@users.noreply.github.com>2018-07-09 20:58:43 +0200
commit9fdaf5361c57438bf7f5bafaf6bb9a79b6bb7493 (patch)
tree5226a20603b6b60ee05dc2d74e7474d62012948b /src/midi_sequencer_impl.hpp
parent2a33defa5770a585f26c35ea731904859afd4ea6 (diff)
downloadlibADLMIDI-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.hpp36
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)