diff options
author | Robin Gareus <robin@gareus.org> | 2014-03-23 18:59:24 +0100 |
---|---|---|
committer | Robin Gareus <robin@gareus.org> | 2014-03-23 18:59:24 +0100 |
commit | af0c42ec4f9d46907299f704d0c70e25e0af6b96 (patch) | |
tree | d33fb13e4edbe718f7c8daad71a04acbaf69a222 | |
parent | c0845bed53096d60a48072bbc0e63311ec5b4904 (diff) |
midi-controller, support log parameters - fixes #5890
-rw-r--r-- | libs/ardour/plugin_insert.cc | 4 | ||||
-rw-r--r-- | libs/surfaces/generic_midi/midicontrollable.cc | 23 |
2 files changed, 24 insertions, 3 deletions
diff --git a/libs/ardour/plugin_insert.cc b/libs/ardour/plugin_insert.cc index 2f90017498..ae018fb2a3 100644 --- a/libs/ardour/plugin_insert.cc +++ b/libs/ardour/plugin_insert.cc @@ -1184,6 +1184,10 @@ PluginInsert::PluginControl::PluginControl (PluginInsert* p, const Evoral::Param _logarithmic = desc.logarithmic; _sr_dependent = desc.sr_dependent; _toggled = desc.toggled; + + if (desc.toggled) { + set_flags(Controllable::Toggle); + } } /** @param val `user' value */ 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; } |