Signed-off-by: falkTX <falktx@falktx.com>tags/v2.1-rc1
| @@ -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); | |||
| } | |||
| @@ -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<float>::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 | |||
| @@ -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) | |||
| }; | |||
| @@ -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); | |||
| } | |||
| @@ -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); | |||
| } | |||
| @@ -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); | |||
| } | |||
| @@ -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); | |||
| } | |||
| @@ -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); | |||
| } | |||
| @@ -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); | |||
| } | |||