diff --git a/source/backend/engine/CarlaEngineNative.cpp b/source/backend/engine/CarlaEngineNative.cpp index 18987a7bf0..70e31f1e46 100644 --- a/source/backend/engine/CarlaEngineNative.cpp +++ b/source/backend/engine/CarlaEngineNative.cpp @@ -589,6 +589,11 @@ class CarlaEngineNative : public CarlaEngine CARLA_SAFE_ASSERT_RETURN(fUiServer.writeEmptyMessage(),); } + std::snprintf(tmpBuf, STR_MAX, "PARAMETER_SCALEPOINT_COUNT_%i:%i\n", pluginId, i); + CARLA_SAFE_ASSERT_RETURN(fUiServer.writeMessage(tmpBuf),); + std::snprintf(tmpBuf, STR_MAX, "%i\n", plugin->getParameterScalePointCount(i)); + CARLA_SAFE_ASSERT_RETURN(fUiServer.writeMessage(tmpBuf),); + std::snprintf(tmpBuf, STR_MAX, "PARAMETER_RANGES_%i:%i\n", pluginId, i); CARLA_SAFE_ASSERT_RETURN(fUiServer.writeMessage(tmpBuf),); @@ -606,6 +611,20 @@ class CarlaEngineNative : public CarlaEngine std::snprintf(tmpBuf, STR_MAX, "%.12g\n", static_cast(plugin->getParameterValue(i))); CARLA_SAFE_ASSERT_RETURN(fUiServer.writeMessage(tmpBuf),); + + for (uint32_t p = 0; p < plugin->getParameterScalePointCount(i); p++) { + std::snprintf(tmpBuf, STR_MAX, "PARAMETER_SCALEPOINT_%i:%i:%i\n", pluginId, i, p); + CARLA_SAFE_ASSERT_RETURN(fUiServer.writeMessage(tmpBuf),); + + std::snprintf(tmpBuf, STR_MAX, "%.12g\n", plugin->getParameterScalePointValue(i, p)); + CARLA_SAFE_ASSERT_RETURN(fUiServer.writeMessage(tmpBuf),); + + if (plugin->getParameterScalePointLabel(i, p, tmpBuf)) { + CARLA_SAFE_ASSERT_RETURN(fUiServer.writeAndFixMessage(tmpBuf),); + } else { + CARLA_SAFE_ASSERT_RETURN(fUiServer.writeEmptyMessage(),); + } + } } fUiServer.syncMessages(); diff --git a/source/frontend/carla-plugin b/source/frontend/carla-plugin index a3850b9156..42e94d8fe3 100755 --- a/source/frontend/carla-plugin +++ b/source/frontend/carla-plugin @@ -317,6 +317,17 @@ class CarlaMiniW(ExternalUI, HostWindow): } self.host._set_parameterRanges(pluginId, paramId, paramRanges) + elif msg.startswith("PARAMETER_SCALEPOINT_COUNT_"): + pluginId, paramId = [int(i) for i in msg.replace("PARAMETER_SCALEPOINT_COUNT_", "").split(":")] + scalePointCount = int(self.readlineblock()) + self.host._set_parameterScalePointCount(pluginId, paramId, scalePointCount) + + elif msg.startswith("PARAMETER_SCALEPOINT_"): + pluginId, param, point = [int(i) for i in msg.replace("PARAMETER_SCALEPOINT_", "").split(":")] + value = float(self.readlineblock()) + label = self.readlineblock() + self.host._set_parameterScalePoint(pluginId, param, point, value, label) + elif msg.startswith("PROGRAM_COUNT_"): pluginId, count, current = [int(i) for i in msg.replace("PROGRAM_COUNT_", "").split(":")] self.host._set_programCount(pluginId, count) diff --git a/source/frontend/carla_backend.py b/source/frontend/carla_backend.py index 49c41f2aef..b64f29bc45 100644 --- a/source/frontend/carla_backend.py +++ b/source/frontend/carla_backend.py @@ -3272,6 +3272,7 @@ def clear(self): self.parameterData = [] self.parameterRanges = [] self.parameterValues = [] + self.parameterScalePoints = [] self.programCount = 0 self.programCurrent = -1 self.programNames = [] @@ -3484,7 +3485,7 @@ def get_parameter_info(self, pluginId, parameterId): return self.fPluginsInfo.get(pluginId, self.fFallbackPluginInfo).parameterInfo[parameterId] def get_parameter_scalepoint_info(self, pluginId, parameterId, scalePointId): - return PyCarlaScalePointInfo + return self.fPluginsInfo.get(pluginId, self.fFallbackPluginInfo).parameterScalePoints[parameterId][scalePointId] def get_parameter_data(self, pluginId, parameterId): return self.fPluginsInfo.get(pluginId, self.fFallbackPluginInfo).parameterData[parameterId] @@ -3765,6 +3766,7 @@ def _set_parameterCountInfo(self, pluginId, count, info): plugin.parameterData = [] plugin.parameterRanges = [] plugin.parameterValues = [] + plugin.parameterScalePoints = [] # add placeholders for _ in range(count): @@ -3772,6 +3774,26 @@ def _set_parameterCountInfo(self, pluginId, count, info): plugin.parameterData.append(PyParameterData.copy()) plugin.parameterRanges.append(PyParameterRanges.copy()) plugin.parameterValues.append(0.0) + plugin.parameterScalePoints.append([]) + + def _set_parameterScalePoint(self, pluginId, param, point, value, label): + plugin = self.fPluginsInfo.get(pluginId, None) + if plugin is None: + print("_set_parameterScalePoint failed for", pluginId) + return + + if param < 0 or param >= plugin.parameterCount: + print("_set_parameterScalePoint failed for parameter", param) + return + + if point < 0 or point >= plugin.parameterInfo[param]["scalePointCount"]: + print("_set_parameterScalePoint failed for scale point", point) + return + + plugin.parameterScalePoints[param][point] = { + "value": value, + "label": label, + } def _set_programCount(self, pluginId, count): plugin = self.fPluginsInfo.get(pluginId, None) @@ -3810,6 +3832,21 @@ def _set_parameterInfo(self, pluginId, paramIndex, info): else: print("_set_parameterInfo failed for", pluginId, "and index", paramIndex) + def _set_parameterScalePointCount(self, pluginId, paramIndex, count): + plugin = self.fPluginsInfo.get(pluginId, None) + if plugin is None: + print("_set_parameterScalePointCount failed for", pluginId) + return + if paramIndex < plugin.parameterCount and paramIndex < len(plugin.parameterInfo): + plugin.parameterInfo[paramIndex]["scalePointCount"] = count + + # add placeholders + plugin.parameterScalePoints[paramIndex] = [] + for _ in range(count): + plugin.parameterScalePoints[paramIndex].append({}) + else: + print("_set_parameterScalePointCount failed for", pluginId, "and index", paramIndex) + def _set_parameterData(self, pluginId, paramIndex, data): plugin = self.fPluginsInfo.get(pluginId, None) if plugin is None: