Browse Source

fix rotary knobs

pull/1639/head
bsp2 6 years ago
parent
commit
04f1c947be
4 changed files with 74 additions and 33 deletions
  1. +36
    -13
      src/app/Knob.cpp
  2. +1
    -1
      src/app/ParamWidget.cpp
  3. +22
    -16
      src/engine.cpp
  4. +15
    -3
      src/widgets/QuantityWidget.cpp

+ 36
- 13
src/app/Knob.cpp View File

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


+ 1
- 1
src/app/ParamWidget.cpp View File

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


+ 22
- 16
src/engine.cpp View File

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


+ 15
- 3
src/widgets/QuantityWidget.cpp View File

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


Loading…
Cancel
Save