summaryrefslogtreecommitdiff
path: root/libs/ardour/parameter_descriptor.cc
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2014-12-04 21:22:31 -0500
committerDavid Robillard <d@drobilla.net>2014-12-04 21:22:31 -0500
commit59af923b77bdc407f4a5f70f954879c84f4d2c71 (patch)
treee64039115b2b37f1c09f33929845a9e31a48b086 /libs/ardour/parameter_descriptor.cc
parente1e1679728de06cd9dbbdde2bfd0e37d0a8ee511 (diff)
Fix steps for log controls with wide range.
Diffstat (limited to 'libs/ardour/parameter_descriptor.cc')
-rw-r--r--libs/ardour/parameter_descriptor.cc16
1 files 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));