@@ -21,12 +21,15 @@ if [ "${USER}" = "cameron" ]; then | |||
CPU_ARCH=skylake-avx512 | |||
fi | |||
# Extra compiler flags (C and C++) | |||
#EXTRA_FLAGS=-DUSE_LOG_PRINTF | |||
EXTRA_FLAGS="" | |||
# Extra C compiler flags | |||
export EXTRA_CFLAGS=-march=${CPU_ARCH} | |||
#-DUSE_LOG_PRINTF | |||
export EXTRA_CFLAGS="-march=${CPU_ARCH} ${EXTRA_FLAGS}" | |||
# Extra C++ compiler flags | |||
export EXTRA_CPPFLAGS=-march=${CPU_ARCH} | |||
export EXTRA_CPPFLAGS="-march=${CPU_ARCH} ${EXTRA_FLAGS}" | |||
# Extra optimization flags (C/C++) | |||
export EXTRA_OPTFLAGS= | |||
@@ -39,5 +42,5 @@ export VST2_SDK_DIR=/mnt/dev/vstsdk2.4/pluginterfaces/vst2.x/ | |||
# n = build the plugin w/o 3rd party modules (only useful for debugging purposes) | |||
# y = statically link 3rd party modules | |||
#export RACK_STATIC_MODULES=y | |||
export RACK_STATIC_MODULES=n | |||
export RACK_STATIC_MODULES=y | |||
#export RACK_STATIC_MODULES=n |
@@ -13,6 +13,15 @@ | |||
#endif // USE_VST2 | |||
#ifdef USE_LOG_PRINTF | |||
extern void log_printf(const char *logData, ...); | |||
#undef Dprintf | |||
#define Dprintf log_printf | |||
#else | |||
#define Dprintf printf | |||
#endif // USE_LOG_PRINTF | |||
namespace rack { | |||
@@ -185,6 +194,7 @@ void ModuleWidget::fromJson(json_t *rootJ) { | |||
if (!paramIdJ) | |||
continue; | |||
int paramId = json_integer_value(paramIdJ); | |||
// Dprintf("fromJson: paramId=%d\n", paramId); | |||
// Find ParamWidget(s) with paramId | |||
for (ParamWidget *paramWidget : params) { | |||
if (paramWidget->paramId == paramId) | |||
@@ -4,6 +4,14 @@ | |||
#include "global.hpp" | |||
#include "global_ui.hpp" | |||
#ifdef USE_LOG_PRINTF | |||
extern void log_printf(const char *logData, ...); | |||
#undef Dprintf | |||
#define Dprintf log_printf | |||
#else | |||
#define Dprintf printf | |||
#endif // USE_LOG_PRINTF | |||
namespace rack { | |||
@@ -21,7 +29,11 @@ json_t *ParamWidget::toJson() { | |||
void ParamWidget::fromJson(json_t *rootJ) { | |||
json_t *valueJ = json_object_get(rootJ, "value"); | |||
if (valueJ) | |||
setValue(json_number_value(valueJ)); | |||
{ | |||
float numberVal = json_number_value(valueJ); | |||
// Dprintf("ParamWidget::fromJson: numberVal=%f\n", numberVal); | |||
setValue(numberVal); | |||
} | |||
} | |||
void ParamWidget::reset() { | |||
@@ -21,6 +21,14 @@ | |||
#include <fenv.h> | |||
#endif | |||
#ifdef USE_LOG_PRINTF | |||
extern void log_printf(const char *logData, ...); | |||
#undef Dprintf | |||
#define Dprintf log_printf | |||
#else | |||
#define Dprintf printf | |||
#endif // USE_LOG_PRINTF | |||
namespace rack { | |||
@@ -369,6 +377,7 @@ void vst2_handle_queued_params(void) { | |||
if(paramRange > 0.0f) | |||
{ | |||
float value = (qp.value * paramRange) + paramWidget->minValue; | |||
// Dprintf("vst2_handle_queued_params: paramId=%d value=%f min=%f max=%f\n", paramId, value, paramWidget->minValue, paramWidget->maxValue); | |||
engineSetParam(module, paramId, value, false/*bVSTAutomate*/); | |||
// Update UI widget | |||
@@ -405,7 +414,21 @@ float vst2_get_param(int uniqueParamId) { | |||
{ | |||
if(sUI(paramId) < sUI(module->params.size())) // paranoia | |||
{ | |||
return module->params[paramId].value; | |||
ModuleWidget *moduleWidget = global_ui->app.gRackWidget->findModuleWidgetByModule(module); | |||
if(NULL != moduleWidget) | |||
{ | |||
// Find | |||
ParamWidget *paramWidget = moduleWidget->findParamWidgetByParamId(paramId); | |||
if(NULL != paramWidget) | |||
{ | |||
if(isfinite(paramWidget->minValue) && isfinite(paramWidget->maxValue)) | |||
{ | |||
float value = module->params[paramId].value; | |||
value = (value - paramWidget->minValue) / (paramWidget->maxValue - paramWidget->minValue); | |||
return value; | |||
} | |||
} | |||
} | |||
} | |||
} | |||
return 0.0f; | |||
@@ -1983,6 +1983,11 @@ VstIntPtr VSTPluginDispatcher(VSTPlugin *vstPlugin, | |||
} | |||
break; | |||
case 56: | |||
case 66: | |||
// (todo) what are these ? Bitwig (Linux) sends a lot of them | |||
break; | |||
default: | |||
// ignoring all other opcodes | |||
Dprintf("vstrack_plugin:dispatcher: unhandled opCode %d [ignored] \n", opCode); | |||
@@ -1,5 +1,13 @@ | |||
#include "widgets.hpp" | |||
#ifdef USE_LOG_PRINTF | |||
extern void log_printf(const char *logData, ...); | |||
#undef Dprintf | |||
#define Dprintf log_printf | |||
#else | |||
#define Dprintf printf | |||
#endif // USE_LOG_PRINTF | |||
namespace rack { | |||
@@ -9,21 +17,23 @@ QuantityWidget::QuantityWidget() { | |||
} | |||
void QuantityWidget::setValue(float value) { | |||
// printf("xxx QuantityWidget::setValue: value=%f\n", value); | |||
// Dprintf("xxx QuantityWidget::setValue: value=%f\n", value); | |||
if(isfinite(minValue) && isfinite(maxValue)) | |||
{ | |||
// Dprintf("xxx QuantityWidget::setValue: isfinite value=%f\n", value); | |||
this->value = clamp(value, fminf(minValue, maxValue), fmaxf(minValue, maxValue)); | |||
EventChange e; | |||
onChange(e); | |||
} | |||
else | |||
{ | |||
// Dprintf("xxx QuantityWidget::setValue: !isfinite value=%f\n", value); | |||
// Rotary knob | |||
this->value = value; | |||
EventChange e; | |||
onChange(e); | |||
} | |||
// printf("xxx QuantityWidget::setValue: LEAVE value=%f\n", value); | |||
// Dprintf("xxx QuantityWidget::setValue: LEAVE value=%f\n", value); | |||
} | |||
void QuantityWidget::setLimits(float minValue, float maxValue) { | |||