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