Fix steps for log controls with wide range.
authorDavid Robillard <d@drobilla.net>
Fri, 5 Dec 2014 02:22:31 +0000 (21:22 -0500)
committerDavid Robillard <d@drobilla.net>
Fri, 5 Dec 2014 02:22:31 +0000 (21:22 -0500)
libs/ardour/parameter_descriptor.cc

index 5d988583cb5b7acad638d907e51fe0051329035b..619150071612f4155600d42a1b64032b96f0c06d 100644 (file)
@@ -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));