|
|
|
@@ -1490,12 +1490,14 @@ private: |
|
|
|
return e;
|
|
|
|
}
|
|
|
|
|
|
|
|
static Steinberg::Vst::Event createSysExEvent (const MidiMessage& msg, const uint8* midiEventData) noexcept
|
|
|
|
static Steinberg::Vst::Event createSysExEvent (const MidiMessage& msg, const uint8* data) noexcept
|
|
|
|
{
|
|
|
|
jassert (msg.isSysEx());
|
|
|
|
|
|
|
|
Steinberg::Vst::Event e{};
|
|
|
|
e.type = Steinberg::Vst::Event::kDataEvent;
|
|
|
|
e.data.bytes = midiEventData + 1;
|
|
|
|
e.data.size = (uint32) msg.getSysExDataSize();
|
|
|
|
e.data.bytes = data;
|
|
|
|
e.data.size = (uint32) msg.getRawDataSize();
|
|
|
|
e.data.type = Steinberg::Vst::DataEvent::kMidiSysEx;
|
|
|
|
return e;
|
|
|
|
}
|
|
|
|
@@ -1649,6 +1651,28 @@ private: |
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static Optional<MidiMessage> toMidiMessage (const Steinberg::Vst::DataEvent& e)
|
|
|
|
{
|
|
|
|
if (e.type != Steinberg::Vst::DataEvent::kMidiSysEx || e.size < 2)
|
|
|
|
{
|
|
|
|
// Only sysex data messages can be converted to MIDI
|
|
|
|
jassertfalse;
|
|
|
|
return {};
|
|
|
|
}
|
|
|
|
|
|
|
|
const auto header = e.bytes[0];
|
|
|
|
const auto footer = e.bytes[e.size - 1];
|
|
|
|
|
|
|
|
if (header != 0xf0 || footer != 0xf7)
|
|
|
|
{
|
|
|
|
// The sysex header/footer bytes are missing
|
|
|
|
jassertfalse;
|
|
|
|
return {};
|
|
|
|
}
|
|
|
|
|
|
|
|
return MidiMessage::createSysExMessage (e.bytes + 1, (int) e.size - 2);
|
|
|
|
}
|
|
|
|
|
|
|
|
static Optional<MidiMessage> toMidiMessage (const Steinberg::Vst::Event& e)
|
|
|
|
{
|
|
|
|
switch (e.type)
|
|
|
|
@@ -1669,7 +1693,7 @@ private: |
|
|
|
(Steinberg::uint8) denormaliseToMidiValue (e.polyPressure.pressure));
|
|
|
|
|
|
|
|
case Steinberg::Vst::Event::kDataEvent:
|
|
|
|
return MidiMessage::createSysExMessage (e.data.bytes, (int) e.data.size);
|
|
|
|
return toMidiMessage (e.data);
|
|
|
|
|
|
|
|
case Steinberg::Vst::Event::kLegacyMIDICCOutEvent:
|
|
|
|
return toMidiMessage (e.midiCCOut);
|
|
|
|
|