Loading...
Searching...
No Matches
score-plugin-vst/Vst/MidiEvents.hpp
1#pragma once
2#include <Process/Dataflow/MidiSysexArena.hpp>
3
4#include <Vst/vst-compat.hpp>
5
6#include <libremidi/cmidi2.hpp>
7#include <libremidi/ump.hpp>
8
9#include <cstdint>
10#include <cstring>
11
12namespace vst
13{
24inline VstEvent* toVstEvent(
25 const libremidi::ump& mess, int32_t deltaFrames, VstMidiEvent& midi,
26 VstMidiSysexEvent* sysex, Process::MidiSysexArena& arena,
27 Process::MidiSysexArena::stream& stream) noexcept
28{
29 switch(mess.get_type())
30 {
31 case libremidi::midi2::message_type::SYSEX7: {
32 const auto bytes = arena.feed(stream, mess);
33 if(bytes.empty() || !sysex)
34 return nullptr;
35
36 std::memset(sysex, 0, sizeof(VstMidiSysexEvent));
37 sysex->type = kVstSysExType;
38 sysex->byteSize = sizeof(VstMidiSysexEvent);
39 sysex->deltaFrames = deltaFrames;
40 sysex->dumpBytes = int32_t(bytes.size());
41 sysex->sysexDump = reinterpret_cast<char*>(const_cast<uint8_t*>(bytes.data()));
42 return reinterpret_cast<VstEvent*>(sysex);
43 }
44 case libremidi::midi2::message_type::SYSEX8_MDS:
45 return nullptr;
46 default: {
47 std::memset(&midi, 0, sizeof(VstMidiEvent));
48 midi.type = kVstMidiType;
49 midi.byteSize = sizeof(VstMidiEvent);
50 midi.deltaFrames = deltaFrames;
51 midi.flags = kVstMidiEventIsRealtime;
52 if(cmidi2_convert_single_ump_to_midi1(
53 (uint8_t*)midi.midiData, 4, (cmidi2_ump*)mess.data)
54 <= 0)
55 return nullptr;
56 return reinterpret_cast<VstEvent*>(&midi);
57 }
58 }
59}
60}
Definition MidiSysexArena.hpp:30