diff options
author | Robin Gareus <robin@gareus.org> | 2015-06-01 21:27:14 +0200 |
---|---|---|
committer | Robin Gareus <robin@gareus.org> | 2015-06-02 01:01:23 +0200 |
commit | dd07428c48bb4df60b9d0c6c3cd524279ab4e524 (patch) | |
tree | 0f1430842bbd01a76d2fb2d9a475bdcff2693646 /libs/ardour/automation_control.cc | |
parent | 42915c19a494d049457df4a473ae436ccdffa847 (diff) |
properly handle integer steps in plugin controls
The integer steps min/max are inclusive.
e.g the integer range -1 to +1 has three possible values (not two).
Diffstat (limited to 'libs/ardour/automation_control.cc')
-rw-r--r-- | libs/ardour/automation_control.cc | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/libs/ardour/automation_control.cc b/libs/ardour/automation_control.cc index bfa16f9e4a..21952038cf 100644 --- a/libs/ardour/automation_control.cc +++ b/libs/ardour/automation_control.cc @@ -139,3 +139,49 @@ AutomationControl::stop_touch(bool mark, double when) } } } + +double +AutomationControl::internal_to_interface (double val) const +{ + if (_desc.integer_step) { + // both upper and lower are inclusive. + val = (val - lower()) / (1 + upper() - lower()); + } else { + val = (val - lower()) / (upper() - lower()); + } + + if (_desc.logarithmic) { + if (val > 0) { + val = pow (val, 1/1.5); + } else { + val = 0; + } + } + + return val; +} + +double +AutomationControl::interface_to_internal (double val) const +{ + if (_desc.logarithmic) { + if (val <= 0) { + val = 0; + } else { + val = pow (val, 1.5); + } + } + + if (_desc.integer_step) { + val = lower() + val * (1 + upper() - lower()); + } else { + val = lower() + val * (upper() - lower()); + } + + if (val < lower()) val = lower(); + if (val > upper()) val = upper(); + + return val; +} + + |