From 6c3b410e6f6ca47b7ae4b424921490c7dc1875e0 Mon Sep 17 00:00:00 2001 From: reuk Date: Tue, 30 Aug 2022 16:12:06 +0100 Subject: [PATCH] VST3 Client: When emulating MIDI CCs with parameters, generate a MIDI event for each parameter event Based on a similar patch in the Surge-XT fork of JUCE. Co-authored-by: Paul Walker --- .../VST3/juce_VST3_Wrapper.cpp | 44 ++++++++++++------- 1 file changed, 29 insertions(+), 15 deletions(-) diff --git a/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.cpp b/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.cpp index e54935a679..3d33c26a3e 100644 --- a/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.cpp +++ b/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.cpp @@ -3347,31 +3347,45 @@ public: { jassert (pluginInstance != nullptr); - auto numParamsChanged = paramChanges.getParameterCount(); + struct ParamChangeInfo + { + Steinberg::int32 offsetSamples = 0; + double value = 0.0; + }; + + const auto getPointFromQueue = [] (Steinberg::Vst::IParamValueQueue* queue, Steinberg::int32 index) + { + ParamChangeInfo result; + return queue->getPoint (index, result.offsetSamples, result.value) == kResultTrue + ? makeOptional (result) + : nullopt; + }; + + const auto numParamsChanged = paramChanges.getParameterCount(); for (Steinberg::int32 i = 0; i < numParamsChanged; ++i) { if (auto* paramQueue = paramChanges.getParameterData (i)) { - auto numPoints = paramQueue->getPointCount(); + const auto vstParamID = paramQueue->getParameterId(); + const auto numPoints = paramQueue->getPointCount(); - Steinberg::int32 offsetSamples = 0; - double value = 0.0; - - if (paramQueue->getPoint (numPoints - 1, offsetSamples, value) == kResultTrue) + #if JUCE_VST3_EMULATE_MIDI_CC_WITH_PARAMETERS + if (juceVST3EditController != nullptr && juceVST3EditController->isMidiControllerParamID (vstParamID)) { - auto vstParamID = paramQueue->getParameterId(); - - #if JUCE_VST3_EMULATE_MIDI_CC_WITH_PARAMETERS - if (juceVST3EditController != nullptr && juceVST3EditController->isMidiControllerParamID (vstParamID)) - addParameterChangeToMidiBuffer (offsetSamples, vstParamID, value); - else - #endif + for (Steinberg::int32 point = 0; point < numPoints; ++point) { - if (auto* param = comPluginInstance->getParamForVSTParamID (vstParamID)) - setValueAndNotifyIfChanged (*param, (float) value); + if (const auto change = getPointFromQueue (paramQueue, point)) + addParameterChangeToMidiBuffer (change->offsetSamples, vstParamID, change->value); } } + else + #endif + if (const auto change = getPointFromQueue (paramQueue, numPoints - 1)) + { + if (auto* param = comPluginInstance->getParamForVSTParamID (vstParamID)) + setValueAndNotifyIfChanged (*param, (float) change->value); + } } } }