From 59af923b77bdc407f4a5f70f954879c84f4d2c71 Mon Sep 17 00:00:00 2001 From: David Robillard Date: Thu, 4 Dec 2014 21:22:31 -0500 Subject: [PATCH] Fix steps for log controls with wide range. --- libs/ardour/parameter_descriptor.cc | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/libs/ardour/parameter_descriptor.cc b/libs/ardour/parameter_descriptor.cc index 5d988583cb..6191500716 100644 --- a/libs/ardour/parameter_descriptor.cc +++ b/libs/ardour/parameter_descriptor.cc @@ -132,11 +132,17 @@ ParameterDescriptor::update_steps() largestep = (delta / 30.0f); if (logarithmic) { - /* Compensate for internal_to_interface's pow so we get roughly the - desired number of steps. */ - smallstep = pow(smallstep, 1.5f); - step = pow(step, 1.5f); - largestep = pow(largestep, 1.5f); + /* Steps are linear, but we map them with pow like values (in + internal_to_interface). Thus, they are applied exponentially, + which means too few steps. So, divide to get roughly the + desired number of steps (30). This is not mathematically + precise but seems to be about right for the controls I tried. + If you're reading this, you've probably found a case where that + isn't true, and somebody needs to sit down with a piece of paper + and actually do the math. */ + smallstep = smallstep / logf(30.0f); + step = step / logf(30.0f); + largestep = largestep / logf(30.0f); } else if (integer_step) { smallstep = std::max(1.0, rint(smallstep)); step = std::max(1.0, rint(step));