midi-controller, support log parameters - fixes #5890
authorRobin Gareus <robin@gareus.org>
Sun, 23 Mar 2014 17:59:24 +0000 (18:59 +0100)
committerRobin Gareus <robin@gareus.org>
Sun, 23 Mar 2014 17:59:24 +0000 (18:59 +0100)
libs/ardour/plugin_insert.cc
libs/surfaces/generic_midi/midicontrollable.cc

index 2f900174983bcd71f3d6bf9968475ef8fbe16212..ae018fb2a3c53544c5e20034e4b13455b87d16ef 100644 (file)
@@ -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 */
index d78dd5e644091b42c9684d946607eb58676fd6b6..a12b20b1a87b6cf994a1905335f09da64c1de6d6 100644 (file)
@@ -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;
 }