From 123576bb2c9d089949e3392338f8c36c764567fb Mon Sep 17 00:00:00 2001 From: reuk Date: Mon, 20 Nov 2023 15:17:03 +0000 Subject: [PATCH] VST3: Include header/footer sysex bytes when converting with DataEvent --- .../format_types/juce_VST3Common.h | 32 ++++++++++++++++--- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/modules/juce_audio_processors/format_types/juce_VST3Common.h b/modules/juce_audio_processors/format_types/juce_VST3Common.h index 48e2286a8a..2e05413509 100644 --- a/modules/juce_audio_processors/format_types/juce_VST3Common.h +++ b/modules/juce_audio_processors/format_types/juce_VST3Common.h @@ -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 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 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);