Skip to content

Commit

Permalink
VST3: Include header/footer sysex bytes when converting with DataEvent
Browse files Browse the repository at this point in the history
  • Loading branch information
reuk committed Nov 23, 2023
1 parent e2ecbde commit 123576b
Showing 1 changed file with 28 additions and 4 deletions.
32 changes: 28 additions & 4 deletions modules/juce_audio_processors/format_types/juce_VST3Common.h
Expand Up @@ -1490,12 +1490,14 @@ class MidiEventList : public Steinberg::Vst::IEventList
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;
}
Expand Down Expand Up @@ -1649,6 +1651,28 @@ class MidiEventList : public Steinberg::Vst::IEventList
}
}

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)
Expand All @@ -1669,7 +1693,7 @@ class MidiEventList : public Steinberg::Vst::IEventList
(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);
Expand Down

0 comments on commit 123576b

Please sign in to comment.