diff --git a/libs/ardour/session_vst.cc b/libs/ardour/session_vst.cc index d82ebf9003..2374ccf4d9 100644 --- a/libs/ardour/session_vst.cc +++ b/libs/ardour/session_vst.cc @@ -27,6 +27,8 @@ #endif #include +#include "evoral/midi_util.h" + #include "ardour/audioengine.h" #include "ardour/debug.h" #include "ardour/session.h" @@ -300,8 +302,14 @@ intptr_t Session::vst_callback ( VstEvents* v = (VstEvents*)ptr; for (int n = 0 ; n < v->numEvents; ++n) { VstMidiEvent *vme = (VstMidiEvent*) (v->events[n]->dump); - if (vme->type == kVstMidiType) { - plug->midi_buffer()->push_back(vme->deltaSamples, Evoral::MIDI_EVENT, 3, (uint8_t*)vme->midiData); + int size = Evoral::midi_event_size((uint8_t)vme->midiData[0]); + if (vme->type == kVstMidiType && size > 0) { + plug->midi_buffer()->push_back( + vme->deltaSamples, + Evoral::MIDI_EVENT, + size, + (uint8_t*)vme->midiData + ); } } } diff --git a/libs/ardour/vst3_plugin.cc b/libs/ardour/vst3_plugin.cc index d688902d3b..238ccf4870 100644 --- a/libs/ardour/vst3_plugin.cc +++ b/libs/ardour/vst3_plugin.cc @@ -647,36 +647,44 @@ VST3PI::vst3_to_midi_buffers (BufferSet& bufs, ChanMapping const& out_map) data[2] = vst_to_midi (e.polyPressure.pressure); mb.push_back (e.sampleOffset, Evoral::MIDI_EVENT, 3, data); break; - case Vst::Event::kLegacyMIDICCOutEvent: + case Vst::Event::kLegacyMIDICCOutEvent: { + size_t size = 0; + switch (e.midiCCOut.controlNumber) { case Vst::kCtrlPolyPressure: + size = 3; data[0] = MIDI_CMD_NOTE_PRESSURE | e.midiCCOut.channel; data[1] = e.midiCCOut.value; data[2] = e.midiCCOut.value2; break; default: /* Control Change */ + size = 3; data[0] = MIDI_CMD_CONTROL | e.midiCCOut.channel; data[1] = e.midiCCOut.controlNumber; data[2] = e.midiCCOut.value; break; case Vst::kCtrlProgramChange: + size = 2; data[0] = MIDI_CMD_PGM_CHANGE | e.midiCCOut.channel; data[1] = e.midiCCOut.value; data[2] = e.midiCCOut.value2; break; case Vst::kAfterTouch: + size = 2; data[0] = MIDI_CMD_CHANNEL_PRESSURE | e.midiCCOut.channel; data[1] = e.midiCCOut.value; data[2] = e.midiCCOut.value2; break; case Vst::kPitchBend: + size = 3; data[0] = MIDI_CMD_BENDER | e.midiCCOut.channel; data[1] = e.midiCCOut.value; data[2] = e.midiCCOut.value2; break; } - mb.push_back (e.sampleOffset, Evoral::MIDI_EVENT, e.midiCCOut.controlNumber == Vst::kCtrlProgramChange ? 2 : 3, data); + mb.push_back (e.sampleOffset, Evoral::MIDI_EVENT, size, data); break; + } case Vst::Event::kNoteExpressionValueEvent: case Vst::Event::kNoteExpressionTextEvent: diff --git a/share/patchfiles/Kurzweil_K2700.midnam b/share/patchfiles/Kurzweil_K2700.midnam index e10787e033..6c50554dfd 100644 --- a/share/patchfiles/Kurzweil_K2700.midnam +++ b/share/patchfiles/Kurzweil_K2700.midnam @@ -1,7 +1,7 @@ - + Nikolaos Strikos strikosn@gmail.com Kurzweil K2700