diff options
Diffstat (limited to 'libs/surfaces/generic_midi/midicontrollable.cc')
-rw-r--r-- | libs/surfaces/generic_midi/midicontrollable.cc | 23 |
1 files changed, 20 insertions, 3 deletions
diff --git a/libs/surfaces/generic_midi/midicontrollable.cc b/libs/surfaces/generic_midi/midicontrollable.cc index d78dd5e644..a12b20b1a8 100644 --- a/libs/surfaces/generic_midi/midicontrollable.cc +++ b/libs/surfaces/generic_midi/midicontrollable.cc @@ -167,7 +167,7 @@ MIDIControllable::control_to_midi (float val) float control_min = controllable->lower (); float control_max = controllable->upper (); - const float control_range = control_max - control_min; + float control_range = control_max - control_min; if (controllable->is_toggle()) { if (val >= (control_min + (control_range/2.0f))) { @@ -175,6 +175,14 @@ MIDIControllable::control_to_midi (float val) } else { return 0; } + } else { + AutomationControl *actl = dynamic_cast<AutomationControl*> (controllable); + if (actl) { + control_min = actl->internal_to_interface(control_min); + control_max = actl->internal_to_interface(control_max); + control_range = control_max - control_min; + val = actl->internal_to_interface(val); + } } return (val - control_min) / control_range * max_value_for_type (); @@ -196,8 +204,17 @@ MIDIControllable::midi_to_control (int val) float control_min = controllable->lower (); float control_max = controllable->upper (); - const float control_range = control_max - control_min; - + float control_range = control_max - control_min; + + AutomationControl *actl = dynamic_cast<AutomationControl*> (controllable); + if (actl) { + if (fv == 0.f) return control_min; + if (fv == 1.f) return control_max; + control_min = actl->internal_to_interface(control_min); + control_max = actl->internal_to_interface(control_max); + control_range = control_max - control_min; + return actl->interface_to_internal((fv * control_range) + control_min); + } return (fv * control_range) + control_min; } |