Browse Source

Cleanup and merge common code; Implement custom MIDI CC ranges

Signed-off-by: falkTX <falktx@falktx.com>
tags/v2.1-rc1
falkTX 6 years ago
parent
commit
3b86fc2f42
Signed by: falkTX <falktx@falktx.com> GPG Key ID: CDBAA37ABC74FBA0
9 changed files with 118 additions and 168 deletions
  1. +4
    -20
      source/backend/plugin/CarlaPluginFluidSynth.cpp
  2. +61
    -0
      source/backend/plugin/CarlaPluginInternal.cpp
  3. +1
    -0
      source/backend/plugin/CarlaPluginInternal.hpp
  4. +15
    -20
      source/backend/plugin/CarlaPluginJuce.cpp
  5. +2
    -30
      source/backend/plugin/CarlaPluginLADSPADSSI.cpp
  6. +12
    -31
      source/backend/plugin/CarlaPluginLV2.cpp
  7. +15
    -20
      source/backend/plugin/CarlaPluginNative.cpp
  8. +3
    -16
      source/backend/plugin/CarlaPluginSFZero.cpp
  9. +5
    -31
      source/backend/plugin/CarlaPluginVST2.cpp

+ 4
- 20
source/backend/plugin/CarlaPluginFluidSynth.cpp View File

@@ -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);
}



+ 61
- 0
source/backend/plugin/CarlaPluginInternal.cpp View File

@@ -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



+ 1
- 0
source/backend/plugin/CarlaPluginInternal.hpp View File

@@ -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)
};


+ 15
- 20
source/backend/plugin/CarlaPluginJuce.cpp View File

@@ -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);
}



+ 2
- 30
source/backend/plugin/CarlaPluginLADSPADSSI.cpp View File

@@ -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);
}



+ 12
- 31
source/backend/plugin/CarlaPluginLV2.cpp View File

@@ -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);
}



+ 15
- 20
source/backend/plugin/CarlaPluginNative.cpp View File

@@ -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);
}



+ 3
- 16
source/backend/plugin/CarlaPluginSFZero.cpp View File

@@ -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);
}



+ 5
- 31
source/backend/plugin/CarlaPluginVST2.cpp View File

@@ -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);
}



Loading…
Cancel
Save