X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=libs%2Fardour%2Fparameter_descriptor.cc;h=67ea267bfaf157d3d7ee29249e837ffedb29a2e8;hb=6584a89c4eb5024fe89a15acd8e4fa4697e606be;hp=5d988583cb5b7acad638d907e51fe0051329035b;hpb=24727e65befc310f24196d11a56ec7b269977c16;p=ardour.git diff --git a/libs/ardour/parameter_descriptor.cc b/libs/ardour/parameter_descriptor.cc index 5d988583cb..67ea267bfa 100644 --- a/libs/ardour/parameter_descriptor.cc +++ b/libs/ardour/parameter_descriptor.cc @@ -48,6 +48,11 @@ ParameterDescriptor::ParameterDescriptor(const Evoral::Parameter& parameter) upper = Config->get_max_gain(); normal = 1.0f; break; + case TrimAutomation: + upper = 10; // +20dB + lower = .1; // -20dB + normal = 1.0f; + break; case PanAzimuthAutomation: normal = 0.5f; // there really is no _normal but this works for stereo, sort of upper = 1.0f; @@ -116,7 +121,7 @@ ParameterDescriptor::update_steps() if (unit == ParameterDescriptor::MIDI_NOTE) { step = smallstep = 1; // semitone largestep = 12; // octave - } else if (type == GainAutomation) { + } else if (type == GainAutomation || type == TrimAutomation) { /* dB_coeff_step gives a step normalized for [0, max_gain]. This is like "slider position", so we convert from "slider position" to gain to have the correct unit here. */ @@ -132,11 +137,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));