diff options
author | David Robillard <d@drobilla.net> | 2014-12-04 21:22:31 -0500 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2014-12-04 21:22:31 -0500 |
commit | 59af923b77bdc407f4a5f70f954879c84f4d2c71 (patch) | |
tree | e64039115b2b37f1c09f33929845a9e31a48b086 /libs/ardour/parameter_descriptor.cc | |
parent | e1e1679728de06cd9dbbdde2bfd0e37d0a8ee511 (diff) |
Fix steps for log controls with wide range.
Diffstat (limited to 'libs/ardour/parameter_descriptor.cc')
-rw-r--r-- | libs/ardour/parameter_descriptor.cc | 16 |
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)); |