From 9cf9833a93f5af0700dad44da4864565fa675862 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Sat, 21 Jul 2018 17:19:49 +0200 Subject: [PATCH] Fix log-scale rangesteps and log-control numeric spinboxes --- libs/ardour/parameter_descriptor.cc | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/libs/ardour/parameter_descriptor.cc b/libs/ardour/parameter_descriptor.cc index 200987db8f..4f26af997d 100644 --- a/libs/ardour/parameter_descriptor.cc +++ b/libs/ardour/parameter_descriptor.cc @@ -200,25 +200,34 @@ ParameterDescriptor::update_steps() largestep = position_to_gain (dB_coeff_step(upper)); step = position_to_gain (largestep / 10.0); smallstep = step; + } else if (logarithmic) { + /* ignore logscale rangesteps. {small|large}steps are used with the spinbox. + * gtk-spinbox shows the internal (not interface) value and up/down + * arrows linearly increase. + * The AutomationController uses internal_to_interface(): + * ui-step [0..1] -> log (1 + largestep / lower) / log (upper / lower) + * so we use a step that's a multiple of "lower" for the interface step: + * log (1 + x) / log (upper / lower) + */ + smallstep = step = lower / 11; + largestep = lower / 3; + /* NOTE: the actual value does use rangesteps via + * logscale_to_position_with_steps(), position_to_logscale_with_steps() + * when it is converted. + */ } else if (rangesteps > 1) { const float delta = upper - lower; - if (logarithmic) { - smallstep = step = (powf (delta, 1.f / (float)rangesteps) - 1.f) * lower; - largestep = (powf (delta, std::max (0.5f, 10.f / (float)rangesteps)) - 1.f) * lower; - } else if (integer_step) { + if (integer_step) { smallstep = step = 1.0; largestep = std::max(1.f, rintf (delta / (rangesteps - 1.f))); } else { step = smallstep = delta / (rangesteps - 1.f); - largestep = std::min ((delta / 4.0f), 10.f * smallstep); // XXX + largestep = std::min ((delta / 4.0f), 10.f * smallstep); } } else { const float delta = upper - lower; /* 30 steps between min/max (300 for fine-grained) */ - if (logarithmic) { - smallstep = step = (powf (delta, 1.f / 300.f) - 1.f) * lower; - largestep = (powf (delta, 1.f / 30.f) - 1.f) * lower; - } else if (integer_step) { + if (integer_step) { smallstep = step = 1.0; largestep = std::max(1.f, rintf (delta / 30.f)); } else {