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