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