@@ -10,7 +10,6 @@ namespace rack { | |||||
static const float KNOB_SENSITIVITY = 0.0015f; | static const float KNOB_SENSITIVITY = 0.0015f; | ||||
Knob::Knob() { | Knob::Knob() { | ||||
// smooth = true; | // smooth = true; | ||||
smooth = false; // xxx | smooth = false; // xxx | ||||
@@ -18,30 +17,54 @@ Knob::Knob() { | |||||
void Knob::onDragStart(EventDragStart &e) { | void Knob::onDragStart(EventDragStart &e) { | ||||
windowCursorLock(); | windowCursorLock(); | ||||
dragValue = value; | |||||
// printf("xxx Knob::onDragStart: value=%f\n", value); | |||||
dragValue = value; | |||||
randomizable = false; | randomizable = false; | ||||
} | } | ||||
void Knob::onDragMove(EventDragMove &e) { | void Knob::onDragMove(EventDragMove &e) { | ||||
float range; | float range; | ||||
// printf("xxx Knob::onDragMove: minValue=%f maxValue=%f\n", minValue, maxValue); | |||||
if (isfinite(minValue) && isfinite(maxValue)) { | if (isfinite(minValue) && isfinite(maxValue)) { | ||||
// Regular knob | |||||
range = maxValue - minValue; | range = maxValue - minValue; | ||||
float delta = KNOB_SENSITIVITY * -e.mouseRel.y * speed * range; | |||||
// Drag slower if Mod is held | |||||
if (windowIsModPressed()) | |||||
delta /= 16.f; | |||||
dragValue += delta; | |||||
dragValue = clamp2(dragValue, minValue, maxValue); | |||||
if (snap) | |||||
setValue(roundf(dragValue)); | |||||
else | |||||
setValue(dragValue); | |||||
// printf("xxx Knob::onDragMove: dragValue=%f delta=%f value=%f snap=%d\n", dragValue, delta, value, snap); | |||||
} | } | ||||
else { | else { | ||||
// Continuous encoders scale as if their limits are +/-1 | // Continuous encoders scale as if their limits are +/-1 | ||||
range = 1.f - (-1.f); | range = 1.f - (-1.f); | ||||
// printf("xxx Knob::onDragMove: range=inf (+-1)\n"); | |||||
float delta = KNOB_SENSITIVITY * -e.mouseRel.y * speed * range; | |||||
// Drag slower if Mod is held | |||||
if (windowIsModPressed()) | |||||
delta /= 16.f; | |||||
dragValue += delta; | |||||
this->value = dragValue; | |||||
// printf("xxx Knob::onDragMove: inf dragValue=%f delta=%f value=%f\n", dragValue, delta, value); | |||||
EventChange e; | |||||
onChange(e); | |||||
// printf("xxx Knob::onDragMove: LEAVE inf dragValue=%f delta=%f value=%f\n", dragValue, delta, value); | |||||
} | } | ||||
float delta = KNOB_SENSITIVITY * -e.mouseRel.y * speed * range; | |||||
// Drag slower if Mod is held | |||||
if (windowIsModPressed()) | |||||
delta /= 16.f; | |||||
dragValue += delta; | |||||
dragValue = clamp2(dragValue, minValue, maxValue); | |||||
if (snap) | |||||
setValue(roundf(dragValue)); | |||||
else | |||||
setValue(dragValue); | |||||
} | } | ||||
void Knob::onDragEnd(EventDragEnd &e) { | void Knob::onDragEnd(EventDragEnd &e) { | ||||
@@ -47,7 +47,7 @@ void ParamWidget::onChange(EventChange &e) { | |||||
if (!module) | if (!module) | ||||
return; | return; | ||||
// printf("xxx ParamWidget::onChange: paramId=%d value=%f\n", paramId, value); | |||||
// printf("xxx ParamWidget::onChange: paramId=%d value=%f this=%p smooth=%d\n", paramId, value, this, smooth); | |||||
if (smooth) | if (smooth) | ||||
engineSetParamSmooth(module, paramId, value); | engineSetParamSmooth(module, paramId, value); | ||||
@@ -297,15 +297,18 @@ void engineSetParam(Module *module, int paramId, float value) { | |||||
ParamWidget *paramWidget = moduleWidget->findParamWidgetByParamId(paramId); | ParamWidget *paramWidget = moduleWidget->findParamWidgetByParamId(paramId); | ||||
if(NULL != paramWidget) | if(NULL != paramWidget) | ||||
{ | { | ||||
// Normalize parameter | |||||
float paramRange = (paramWidget->maxValue - paramWidget->minValue); | |||||
if(paramRange > 0.0f) | |||||
if(isfinite(paramWidget->minValue) && isfinite(paramWidget->maxValue)) | |||||
{ | { | ||||
float normValue = (value - paramWidget->minValue) / paramRange; | |||||
// printf("xxx paramId=%d normValue=%f\n", paramId, normValue); | |||||
// Normalize parameter | |||||
float paramRange = (paramWidget->maxValue - paramWidget->minValue); | |||||
if(paramRange > 0.0f) | |||||
{ | |||||
float normValue = (value - paramWidget->minValue) / paramRange; | |||||
// printf("xxx paramId=%d normValue=%f\n", paramId, normValue); | |||||
// Call host audioMasterAutomate | |||||
vst2_handle_ui_param(uniqueParamId, normValue); | |||||
// Call host audioMasterAutomate | |||||
vst2_handle_ui_param(uniqueParamId, normValue); | |||||
} | |||||
} | } | ||||
} | } | ||||
} | } | ||||
@@ -357,16 +360,19 @@ void vst2_handle_queued_params(void) { | |||||
if(NULL != paramWidget) | if(NULL != paramWidget) | ||||
{ | { | ||||
// Normalize parameter | // Normalize parameter | ||||
float paramRange = (paramWidget->maxValue - paramWidget->minValue); | |||||
if(paramRange > 0.0f) | |||||
if(isfinite(paramWidget->minValue) && isfinite(paramWidget->maxValue)) | |||||
{ | { | ||||
// float value = qp.norm_value - 0.5f; | |||||
// value *= 2.0f; | |||||
float value = (qp.norm_value * paramRange) + paramWidget->minValue; | |||||
engineSetParam(module, paramId, value, false/*bVSTAutomate*/); | |||||
// Update UI widget | |||||
paramWidget->setValue(value); | |||||
float paramRange = (paramWidget->maxValue - paramWidget->minValue); | |||||
if(paramRange > 0.0f) | |||||
{ | |||||
// float value = qp.norm_value - 0.5f; | |||||
// value *= 2.0f; | |||||
float value = (qp.norm_value * paramRange) + paramWidget->minValue; | |||||
engineSetParam(module, paramId, value, false/*bVSTAutomate*/); | |||||
// Update UI widget | |||||
paramWidget->setValue(value); | |||||
} | |||||
} | } | ||||
} | } | ||||
} | } | ||||
@@ -9,9 +9,21 @@ QuantityWidget::QuantityWidget() { | |||||
} | } | ||||
void QuantityWidget::setValue(float value) { | void QuantityWidget::setValue(float value) { | ||||
this->value = clamp(value, fminf(minValue, maxValue), fmaxf(minValue, maxValue)); | |||||
EventChange e; | |||||
onChange(e); | |||||
// printf("xxx QuantityWidget::setValue: value=%f\n", value); | |||||
if(isfinite(minValue) && isfinite(maxValue)) | |||||
{ | |||||
this->value = clamp(value, fminf(minValue, maxValue), fmaxf(minValue, maxValue)); | |||||
EventChange e; | |||||
onChange(e); | |||||
} | |||||
else | |||||
{ | |||||
// Rotary knob | |||||
this->value = value; | |||||
EventChange e; | |||||
onChange(e); | |||||
} | |||||
// printf("xxx QuantityWidget::setValue: LEAVE value=%f\n", value); | |||||
} | } | ||||
void QuantityWidget::setLimits(float minValue, float maxValue) { | void QuantityWidget::setLimits(float minValue, float maxValue) { | ||||