diff --git a/libs/ardour/ardour/vst3_plugin.h b/libs/ardour/ardour/vst3_plugin.h index e09be135c1..1a1dffff4e 100644 --- a/libs/ardour/ardour/vst3_plugin.h +++ b/libs/ardour/ardour/vst3_plugin.h @@ -156,6 +156,7 @@ private: void set_parameter_internal (Vst::ParamID id, float& value, int32 sample_off, bool normalized); bool midi_controller (int32_t, int16_t, Vst::CtrlNumber, Vst::ParamID &id); + bool live_midi_cc (int32_t, int16_t, Vst::CtrlNumber); boost::shared_ptr _module; diff --git a/libs/ardour/vst3_host.cc b/libs/ardour/vst3_host.cc index f7503c78f7..47816fc796 100644 --- a/libs/ardour/vst3_host.cc +++ b/libs/ardour/vst3_host.cc @@ -46,6 +46,7 @@ DEF_CLASS_IID (Vst::IEventList) DEF_CLASS_IID (Vst::IHostApplication) DEF_CLASS_IID (Vst::IMessage) DEF_CLASS_IID (Vst::IMidiMapping) +DEF_CLASS_IID (Vst::IMidiLearn) DEF_CLASS_IID (Vst::IParameterChanges) DEF_CLASS_IID (Vst::IParamValueQueue) DEF_CLASS_IID (Vst::IPlugInterfaceSupport) @@ -315,8 +316,8 @@ PlugInterfaceSupport::PlugInterfaceSupport () addPlugInterfaceSupported (INoteExpressionPhysicalUIMapping::iid); //---VST 3.6.12-------------------------------- - addPlugInterfaceSupported (IMidiLearn::iid); #endif + addPlugInterfaceSupported (IMidiLearn::iid); } tresult diff --git a/libs/ardour/vst3_plugin.cc b/libs/ardour/vst3_plugin.cc index f832655c6c..f0cbcd1108 100644 --- a/libs/ardour/vst3_plugin.cc +++ b/libs/ardour/vst3_plugin.cc @@ -316,6 +316,9 @@ VST3PI::evoral_to_vst3 (Vst::Event& e, Evoral::Event const& ev, int e.polyPressure.noteId = -1; return true; case MIDI_CMD_CONTROL: + if (ev.is_live_midi ()/* live input -- no playback */) { + live_midi_cc (bus, channel, data1); + } if (midi_controller (bus, channel, data1, id)) { set_parameter_by_id (id, data2 / 127.f, ev.time ()); } @@ -1631,6 +1634,16 @@ VST3PI::get_parameter (uint32_t p) const return _controller->normalizedParamToPlain (id, _shadow_data[p]); } +bool +VST3PI::live_midi_cc (int32_t bus, int16_t channel, Vst::CtrlNumber ctrl) +{ + FUnknownPtr midiLearn (_controller); + if (!midiLearn) { + return false; + } + return kResultOk == midiLearn->onLiveMIDIControllerInput (bus, channel, ctrl); +} + bool VST3PI::midi_controller (int32_t bus, int16_t channel, Vst::CtrlNumber ctrl, Vst::ParamID &id) { @@ -1653,7 +1666,7 @@ VST3PI::add_event (Evoral::Event const& ev, int32_t bus) { Vst::Event e; e.busIndex = bus; - e.flags = Vst::Event::kIsLive; + e.flags = ev.is_live_midi () ? Vst::Event::kIsLive : 0; e.sampleOffset = ev.time(); e.ppqPosition = _context.projectTimeMusic; if (evoral_to_vst3 (e, ev, bus)) { diff --git a/libs/vst3/vst3.h b/libs/vst3/vst3.h index c5f6878d51..cd7764401a 100644 --- a/libs/vst3/vst3.h +++ b/libs/vst3/vst3.h @@ -39,7 +39,7 @@ //#include "pluginterfaces/vst/ivstinterappaudio.h" #include "pluginterfaces/vst/ivstmessage.h" #include "pluginterfaces/vst/ivstmidicontrollers.h" -//#include "pluginterfaces/vst/ivstmidilearn.h" +#include "pluginterfaces/vst/ivstmidilearn.h" //#include "pluginterfaces/vst/ivstnoteexpression.h" #include "pluginterfaces/vst/ivstparameterchanges.h" //#include "pluginterfaces/vst/ivstphysicalui.h"