| @@ -1490,12 +1490,14 @@ private: | |||||
| return e; | 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{}; | Steinberg::Vst::Event e{}; | ||||
| e.type = Steinberg::Vst::Event::kDataEvent; | 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; | e.data.type = Steinberg::Vst::DataEvent::kMidiSysEx; | ||||
| return e; | 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) | static Optional<MidiMessage> toMidiMessage (const Steinberg::Vst::Event& e) | ||||
| { | { | ||||
| switch (e.type) | switch (e.type) | ||||
| @@ -1669,7 +1693,7 @@ private: | |||||
| (Steinberg::uint8) denormaliseToMidiValue (e.polyPressure.pressure)); | (Steinberg::uint8) denormaliseToMidiValue (e.polyPressure.pressure)); | ||||
| case Steinberg::Vst::Event::kDataEvent: | case Steinberg::Vst::Event::kDataEvent: | ||||
| return MidiMessage::createSysExMessage (e.data.bytes, (int) e.data.size); | |||||
| return toMidiMessage (e.data); | |||||
| case Steinberg::Vst::Event::kLegacyMIDICCOutEvent: | case Steinberg::Vst::Event::kLegacyMIDICCOutEvent: | ||||
| return toMidiMessage (e.midiCCOut); | return toMidiMessage (e.midiCCOut); | ||||