diff --git a/src/app/Knob.cpp b/src/app/Knob.cpp index 97aad162..1be1129b 100644 --- a/src/app/Knob.cpp +++ b/src/app/Knob.cpp @@ -10,7 +10,6 @@ namespace rack { static const float KNOB_SENSITIVITY = 0.0015f; - Knob::Knob() { // smooth = true; smooth = false; // xxx @@ -18,30 +17,54 @@ Knob::Knob() { void Knob::onDragStart(EventDragStart &e) { windowCursorLock(); - dragValue = value; + // printf("xxx Knob::onDragStart: value=%f\n", value); + dragValue = value; randomizable = false; } void Knob::onDragMove(EventDragMove &e) { float range; + // printf("xxx Knob::onDragMove: minValue=%f maxValue=%f\n", minValue, maxValue); + if (isfinite(minValue) && isfinite(maxValue)) { + // Regular knob 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 { // Continuous encoders scale as if their limits are +/-1 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) { diff --git a/src/app/ParamWidget.cpp b/src/app/ParamWidget.cpp index b16bda34..2ed16b60 100644 --- a/src/app/ParamWidget.cpp +++ b/src/app/ParamWidget.cpp @@ -47,7 +47,7 @@ void ParamWidget::onChange(EventChange &e) { if (!module) 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) engineSetParamSmooth(module, paramId, value); diff --git a/src/engine.cpp b/src/engine.cpp index 9e6e5ef1..d30672be 100644 --- a/src/engine.cpp +++ b/src/engine.cpp @@ -297,15 +297,18 @@ void engineSetParam(Module *module, int paramId, float value) { ParamWidget *paramWidget = moduleWidget->findParamWidgetByParamId(paramId); 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) { // 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); + } } } } diff --git a/src/widgets/QuantityWidget.cpp b/src/widgets/QuantityWidget.cpp index 5746616b..62fce5a0 100644 --- a/src/widgets/QuantityWidget.cpp +++ b/src/widgets/QuantityWidget.cpp @@ -9,9 +9,21 @@ QuantityWidget::QuantityWidget() { } 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) {