diff --git a/source/backend/plugin/CarlaPluginFluidSynth.cpp b/source/backend/plugin/CarlaPluginFluidSynth.cpp index bf73854f0..ecce3b337 100644 --- a/source/backend/plugin/CarlaPluginFluidSynth.cpp +++ b/source/backend/plugin/CarlaPluginFluidSynth.cpp @@ -1191,12 +1191,12 @@ public: case kEngineControlEventTypeParameter: { -#ifndef BUILD_BRIDGE + float value; + +#ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH // Control backend stuff if (event.channel == pData->ctrlChannel) { - float value; - if (MIDI_IS_CONTROL_BREATH_CONTROLLER(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_DRYWET) != 0) { value = ctrlEvent.value; @@ -1247,23 +1247,7 @@ public: if ((pData->param.data[k].hints & PARAMETER_IS_AUTOMABLE) == 0) continue; - float value; - - if (pData->param.data[k].hints & PARAMETER_IS_BOOLEAN) - { - value = (ctrlEvent.value < 0.5f) ? pData->param.ranges[k].min : pData->param.ranges[k].max; - } - else - { - if (pData->param.data[k].hints & PARAMETER_IS_LOGARITHMIC) - value = pData->param.ranges[k].getUnnormalizedLogValue(ctrlEvent.value); - else - value = pData->param.ranges[k].getUnnormalizedValue(ctrlEvent.value); - - if (pData->param.data[k].hints & PARAMETER_IS_INTEGER) - value = std::rint(value); - } - + value = pData->param.getFinalUnnormalizedValue(k, ctrlEvent.value); setParameterValueRT(k, value, true); } diff --git a/source/backend/plugin/CarlaPluginInternal.cpp b/source/backend/plugin/CarlaPluginInternal.cpp index 2de1a7482..78f54b2dd 100644 --- a/source/backend/plugin/CarlaPluginInternal.cpp +++ b/source/backend/plugin/CarlaPluginInternal.cpp @@ -280,6 +280,67 @@ float PluginParameterData::getFixedValue(const uint32_t parameterId, float value return paramRanges.getFixedValue(value); } +// copied from ParameterRanges::getUnnormalizedValue +static float _getUnnormalizedValue(const float min, const float max, const float value) noexcept +{ + if (value <= 0.0f) + return min; + if (value >= 1.0f) + return max; + + return value * (max - min) + min; +} + +// copied from ParameterRanges::getUnnormalizedLogValue +static float _getUnnormalizedLogValue(const float min, const float max, const float value) noexcept +{ + if (value <= 0.0f) + return min; + if (value >= 1.0f) + return max; + + float rmin = min; + + if (std::abs(min) < std::numeric_limits::epsilon()) + rmin = 0.00001f; + + return rmin * std::pow(max/rmin, value); +} + +float PluginParameterData::getFinalUnnormalizedValue(const uint32_t parameterId, float value) const noexcept +{ + float min, max; + + if (data[parameterId].mappedControlIndex != CONTROL_INDEX_CV + && (data[parameterId].hints & PARAMETER_MAPPED_RANGES_SET) != 0x0) + { + min = data[parameterId].mappedMinimum; + max = data[parameterId].mappedMaximum; + } + else + { + min = ranges[parameterId].min; + max = ranges[parameterId].max; + } + + if (data[parameterId].hints & PARAMETER_IS_BOOLEAN) + { + value = (value < 0.5f) ? min : max; + } + else + { + if (data[parameterId].hints & PARAMETER_IS_LOGARITHMIC) + value = _getUnnormalizedLogValue(min, max, value); + else + value = _getUnnormalizedValue(min, max, value); + + if (data[parameterId].hints & PARAMETER_IS_INTEGER) + value = std::rint(value); + } + + return value; +} + // ----------------------------------------------------------------------- // PluginProgramData diff --git a/source/backend/plugin/CarlaPluginInternal.hpp b/source/backend/plugin/CarlaPluginInternal.hpp index 46d061cbc..ef1a9bec9 100644 --- a/source/backend/plugin/CarlaPluginInternal.hpp +++ b/source/backend/plugin/CarlaPluginInternal.hpp @@ -181,6 +181,7 @@ struct PluginParameterData { void createNew(uint32_t newCount, bool withSpecial); void clear() noexcept; float getFixedValue(uint32_t parameterId, float value) const noexcept; + float getFinalUnnormalizedValue(uint32_t parameterId, float value) const noexcept; CARLA_DECLARE_NON_COPY_STRUCT(PluginParameterData) }; diff --git a/source/backend/plugin/CarlaPluginJuce.cpp b/source/backend/plugin/CarlaPluginJuce.cpp index 83f699acc..d18e30c5e 100644 --- a/source/backend/plugin/CarlaPluginJuce.cpp +++ b/source/backend/plugin/CarlaPluginJuce.cpp @@ -837,12 +837,23 @@ public: break; case kEngineControlEventTypeParameter: { -#ifndef BUILD_BRIDGE + float value; + +#ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH + // non-midi + if (event.channel == kEngineEventNonMidiChannel) + { + const uint32_t k = ctrlEvent.param; + CARLA_SAFE_ASSERT_CONTINUE(k < pData->param.count); + + value = pData->param.getFinalUnnormalizedValue(k, ctrlEvent.value); + setParameterValueRT(k, value, true); + continue; + } + // Control backend stuff if (event.channel == pData->ctrlChannel) { - float value; - if (MIDI_IS_CONTROL_BREATH_CONTROLLER(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_DRYWET) != 0) { value = ctrlEvent.value; @@ -894,23 +905,7 @@ public: if ((pData->param.data[k].hints & PARAMETER_IS_AUTOMABLE) == 0) continue; - float value; - - if (pData->param.data[k].hints & PARAMETER_IS_BOOLEAN) - { - value = (ctrlEvent.value < 0.5f) ? pData->param.ranges[k].min : pData->param.ranges[k].max; - } - else - { - if (pData->param.data[k].hints & PARAMETER_IS_LOGARITHMIC) - value = pData->param.ranges[k].getUnnormalizedLogValue(ctrlEvent.value); - else - value = pData->param.ranges[k].getUnnormalizedValue(ctrlEvent.value); - - if (pData->param.data[k].hints & PARAMETER_IS_INTEGER) - value = std::rint(value); - } - + value = pData->param.getFinalUnnormalizedValue(k, ctrlEvent.value); setParameterValueRT(k, value, true); } diff --git a/source/backend/plugin/CarlaPluginLADSPADSSI.cpp b/source/backend/plugin/CarlaPluginLADSPADSSI.cpp index bc0c6f5ec..63f14ea12 100644 --- a/source/backend/plugin/CarlaPluginLADSPADSSI.cpp +++ b/source/backend/plugin/CarlaPluginLADSPADSSI.cpp @@ -1637,21 +1637,7 @@ public: const uint32_t k = ctrlEvent.param; CARLA_SAFE_ASSERT_CONTINUE(k < pData->param.count); - if (pData->param.data[k].hints & PARAMETER_IS_BOOLEAN) - { - value = (ctrlEvent.value < 0.5f) ? pData->param.ranges[k].min : pData->param.ranges[k].max; - } - else - { - if (pData->param.data[k].hints & PARAMETER_IS_LOGARITHMIC) - value = pData->param.ranges[k].getUnnormalizedLogValue(ctrlEvent.value); - else - value = pData->param.ranges[k].getUnnormalizedValue(ctrlEvent.value); - - if (pData->param.data[k].hints & PARAMETER_IS_INTEGER) - value = std::rint(value); - } - + value = pData->param.getFinalUnnormalizedValue(k, ctrlEvent.value); setParameterValueRT(k, value, true); continue; } @@ -1709,21 +1695,7 @@ public: if ((pData->param.data[k].hints & PARAMETER_IS_AUTOMABLE) == 0) continue; - if (pData->param.data[k].hints & PARAMETER_IS_BOOLEAN) - { - value = (ctrlEvent.value < 0.5f) ? pData->param.ranges[k].min : pData->param.ranges[k].max; - } - else - { - if (pData->param.data[k].hints & PARAMETER_IS_LOGARITHMIC) - value = pData->param.ranges[k].getUnnormalizedLogValue(ctrlEvent.value); - else - value = pData->param.ranges[k].getUnnormalizedValue(ctrlEvent.value); - - if (pData->param.data[k].hints & PARAMETER_IS_INTEGER) - value = std::rint(value); - } - + value = pData->param.getFinalUnnormalizedValue(k, ctrlEvent.value); setParameterValueRT(k, value, true); } diff --git a/source/backend/plugin/CarlaPluginLV2.cpp b/source/backend/plugin/CarlaPluginLV2.cpp index 644af6002..3f0fe9598 100644 --- a/source/backend/plugin/CarlaPluginLV2.cpp +++ b/source/backend/plugin/CarlaPluginLV2.cpp @@ -2581,8 +2581,17 @@ public: { pData->param.data[j].hints |= PARAMETER_IS_ENABLED; pData->param.data[j].hints |= PARAMETER_IS_AUTOMABLE; - pData->param.data[j].hints |= PARAMETER_CAN_BE_CV_CONTROLLED; needsCtrlIn = true; + + if (! LV2_IS_PORT_CAUSES_ARTIFACTS(portProps) && + ! LV2_IS_PORT_ENUMERATION(portProps) && + ! LV2_IS_PORT_EXPENSIVE(portProps) && + ! LV2_IS_PORT_NOT_AUTOMATIC(portProps) && + ! LV2_IS_PORT_NOT_ON_GUI(portProps) && + ! LV2_IS_PORT_TRIGGER(portProps)) + { + pData->param.data[j].hints |= PARAMETER_CAN_BE_CV_CONTROLLED; + } } // MIDI CC value @@ -3630,21 +3639,7 @@ public: const uint32_t k = ctrlEvent.param; CARLA_SAFE_ASSERT_CONTINUE(k < pData->param.count); - if (pData->param.data[k].hints & PARAMETER_IS_BOOLEAN) - { - value = (ctrlEvent.value < 0.5f) ? pData->param.ranges[k].min : pData->param.ranges[k].max; - } - else - { - if (pData->param.data[k].hints & PARAMETER_IS_LOGARITHMIC) - value = pData->param.ranges[k].getUnnormalizedLogValue(ctrlEvent.value); - else - value = pData->param.ranges[k].getUnnormalizedValue(ctrlEvent.value); - - if (pData->param.data[k].hints & PARAMETER_IS_INTEGER) - value = std::rint(value); - } - + value = pData->param.getFinalUnnormalizedValue(k, ctrlEvent.value); setParameterValueRT(k, value, true); continue; } @@ -3703,21 +3698,7 @@ public: if ((pData->param.data[k].hints & PARAMETER_IS_AUTOMABLE) == 0) continue; - if (pData->param.data[k].hints & PARAMETER_IS_BOOLEAN) - { - value = (ctrlEvent.value < 0.5f) ? pData->param.ranges[k].min : pData->param.ranges[k].max; - } - else - { - if (pData->param.data[k].hints & PARAMETER_IS_LOGARITHMIC) - value = pData->param.ranges[k].getUnnormalizedLogValue(ctrlEvent.value); - else - value = pData->param.ranges[k].getUnnormalizedValue(ctrlEvent.value); - - if (pData->param.data[k].hints & PARAMETER_IS_INTEGER) - value = std::rint(value); - } - + value = pData->param.getFinalUnnormalizedValue(k, ctrlEvent.value); setParameterValueRT(k, value, true); } diff --git a/source/backend/plugin/CarlaPluginNative.cpp b/source/backend/plugin/CarlaPluginNative.cpp index f799a4997..09d6e1d92 100644 --- a/source/backend/plugin/CarlaPluginNative.cpp +++ b/source/backend/plugin/CarlaPluginNative.cpp @@ -1931,12 +1931,23 @@ public: break; case kEngineControlEventTypeParameter: { -#ifndef BUILD_BRIDGE + float value; + +#ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH + // non-midi + if (event.channel == kEngineEventNonMidiChannel) + { + const uint32_t k = ctrlEvent.param; + CARLA_SAFE_ASSERT_CONTINUE(k < pData->param.count); + + value = pData->param.getFinalUnnormalizedValue(k, ctrlEvent.value); + setParameterValueRT(k, value, true); + continue; + } + // Control backend stuff if (event.channel == pData->ctrlChannel) { - float value; - if (MIDI_IS_CONTROL_BREATH_CONTROLLER(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_DRYWET) > 0) { value = ctrlEvent.value; @@ -1987,23 +1998,7 @@ public: if ((pData->param.data[k].hints & PARAMETER_IS_AUTOMABLE) == 0) continue; - float value; - - if (pData->param.data[k].hints & PARAMETER_IS_BOOLEAN) - { - value = (ctrlEvent.value < 0.5f) ? pData->param.ranges[k].min : pData->param.ranges[k].max; - } - else - { - if (pData->param.data[k].hints & PARAMETER_IS_LOGARITHMIC) - value = pData->param.ranges[k].getUnnormalizedLogValue(ctrlEvent.value); - else - value = pData->param.ranges[k].getUnnormalizedValue(ctrlEvent.value); - - if (pData->param.data[k].hints & PARAMETER_IS_INTEGER) - value = std::rint(value); - } - + value = pData->param.getFinalUnnormalizedValue(k, ctrlEvent.value); setParameterValueRT(k, value, true); } diff --git a/source/backend/plugin/CarlaPluginSFZero.cpp b/source/backend/plugin/CarlaPluginSFZero.cpp index 901e4b2c6..35ed5c18b 100644 --- a/source/backend/plugin/CarlaPluginSFZero.cpp +++ b/source/backend/plugin/CarlaPluginSFZero.cpp @@ -408,12 +408,12 @@ public: case kEngineControlEventTypeParameter: { + float value; + #ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH // Control backend stuff if (event.channel == pData->ctrlChannel) { - float value; - if (MIDI_IS_CONTROL_BREATH_CONTROLLER(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_DRYWET) != 0) { value = ctrlEvent.value; @@ -464,20 +464,7 @@ public: if ((pData->param.data[k].hints & PARAMETER_IS_AUTOMABLE) == 0) continue; - float value; - - if (pData->param.data[k].hints & PARAMETER_IS_BOOLEAN) - { - value = (ctrlEvent.value < 0.5f) ? pData->param.ranges[k].min : pData->param.ranges[k].max; - } - else - { - value = pData->param.ranges[k].getUnnormalizedValue(ctrlEvent.value); - - if (pData->param.data[k].hints & PARAMETER_IS_INTEGER) - value = std::rint(value); - } - + value = pData->param.getFinalUnnormalizedValue(k, ctrlEvent.value); setParameterValueRT(k, value, true); } diff --git a/source/backend/plugin/CarlaPluginVST2.cpp b/source/backend/plugin/CarlaPluginVST2.cpp index 8349d78f0..c8ddc1f13 100644 --- a/source/backend/plugin/CarlaPluginVST2.cpp +++ b/source/backend/plugin/CarlaPluginVST2.cpp @@ -839,7 +839,9 @@ public: pData->param.data[j].hints |= PARAMETER_IS_ENABLED; pData->param.data[j].hints |= PARAMETER_USES_CUSTOM_TEXT; - pData->param.data[j].hints |= PARAMETER_CAN_BE_CV_CONTROLLED; + + if ((prop.flags & (kVstParameterIsSwitch|kVstParameterUsesIntStep)) == 0x0) + pData->param.data[j].hints |= PARAMETER_CAN_BE_CV_CONTROLLED; if ((pData->hints & PLUGIN_USES_OLD_VSTSDK) != 0 || dispatcher(effCanBeAutomated, ij) == 1) pData->param.data[j].hints |= PARAMETER_IS_AUTOMABLE; @@ -1323,21 +1325,7 @@ public: const uint32_t k = ctrlEvent.param; CARLA_SAFE_ASSERT_CONTINUE(k < pData->param.count); - if (pData->param.data[k].hints & PARAMETER_IS_BOOLEAN) - { - value = (ctrlEvent.value < 0.5f) ? pData->param.ranges[k].min : pData->param.ranges[k].max; - } - else - { - if (pData->param.data[k].hints & PARAMETER_IS_LOGARITHMIC) - value = pData->param.ranges[k].getUnnormalizedLogValue(ctrlEvent.value); - else - value = pData->param.ranges[k].getUnnormalizedValue(ctrlEvent.value); - - if (pData->param.data[k].hints & PARAMETER_IS_INTEGER) - value = std::rint(value); - } - + value = pData->param.getFinalUnnormalizedValue(k, ctrlEvent.value); setParameterValueRT(k, value, true); continue; } @@ -1396,21 +1384,7 @@ public: if ((pData->param.data[k].hints & PARAMETER_IS_AUTOMABLE) == 0) continue; - if (pData->param.data[k].hints & PARAMETER_IS_BOOLEAN) - { - value = (ctrlEvent.value < 0.5f) ? pData->param.ranges[k].min : pData->param.ranges[k].max; - } - else - { - if (pData->param.data[k].hints & PARAMETER_IS_LOGARITHMIC) - value = pData->param.ranges[k].getUnnormalizedLogValue(ctrlEvent.value); - else - value = pData->param.ranges[k].getUnnormalizedValue(ctrlEvent.value); - - if (pData->param.data[k].hints & PARAMETER_IS_INTEGER) - value = std::rint(value); - } - + value = pData->param.getFinalUnnormalizedValue(k, ctrlEvent.value); setParameterValueRT(k, value, true); }