faderport: shift+encoder controls pan width (for ardour only), input trim now control...
authorPaul Davis <paul@linuxaudiosystems.com>
Fri, 27 Nov 2015 21:41:26 +0000 (16:41 -0500)
committerPaul Davis <paul@linuxaudiosystems.com>
Fri, 27 Nov 2015 21:41:26 +0000 (16:41 -0500)
User is now a modifier key

libs/surfaces/faderport/faderport.cc
libs/surfaces/faderport/faderport.h
libs/surfaces/faderport/operations.cc

index 6111a4ef95beb29b15d9109cd57fb9621b716a0a..9ec34f0d43b06f7869b98f27edb49b5fce5963cb 100644 (file)
@@ -286,6 +286,9 @@ FaderPort::switch_handler (MIDI::Parser &, MIDI::EventTwoBytes* tb)
        case Rewind:
                button_state = (tb->value ? ButtonState (button_state|RewindDown) : ButtonState (button_state&~RewindDown));
                break;
+       case User:
+               button_state = (tb->value ? ButtonState (button_state|UserDown) : ButtonState (button_state&~UserDown));
+               break;
        case FaderTouch:
                fader_is_touched = tb->value;
                if (_current_route) {
@@ -348,16 +351,30 @@ FaderPort::encoder_handler (MIDI::Parser &, MIDI::pitchbend_t pb)
 
        if (_current_route) {
 
-               if ( (button_state & ShiftDown) == ShiftDown ) {    //shift+encoder = input trim
+               ButtonState trim_modifier;
+               ButtonState width_modifier;
+
+               if (Profile->get_mixbus()) {
+                       trim_modifier = ShiftDown;
+                       width_modifier = ButtonState (0);
+               } else {
+                       trim_modifier = UserDown;
+                       width_modifier = ShiftDown;
+               }
+
+               if ((button_state & trim_modifier) == trim_modifier ) {    // mod+encoder = input trim
                        boost::shared_ptr<AutomationControl> gain = _current_route->trim()->gain_control ();
                        if (gain) {
                                float val = gain->get_user();  //for gain elements, the "user" value is in dB
                                val += delta;
                                gain->set_user(val);
                        }
-               } else {  //pan / balance
+               } else if (width_modifier && ((button_state & width_modifier) == width_modifier)) {
+                       ardour_pan_width (delta);
+
+               } else {  // pan/balance
                        if (!Profile->get_mixbus()) {
-                               ardour_pan (delta);
+                               ardour_pan_azimuth (delta);
                        } else {
                                mixbus_pan (delta);
                        }
@@ -820,7 +837,7 @@ FaderPort::set_current_route (boost::shared_ptr<Route> r)
                        mp->cut_control()->Changed.connect (route_connections, MISSING_INVALIDATOR, boost::bind (&FaderPort::map_cut, this), this);
                }
        }
-       
+
        //ToDo: subscribe to the fader automation modes so we can light the LEDs
 
        map_route_state ();
index 3af6280e2eb688ec28d569d01f93aeb4bcf53cc8..14b8e5c3f65e4805f1d0ad7070527296c7afbc0f 100644 (file)
@@ -172,6 +172,7 @@ class FaderPort : public ARDOUR::ControlProtocol, public AbstractUI<FaderPortReq
                ShiftDown = 0x1,
                RewindDown = 0x2,
                StopDown = 0x4,
+               UserDown = 0x8,
        };
 
        ButtonState button_state;
@@ -279,7 +280,8 @@ class FaderPort : public ARDOUR::ControlProtocol, public AbstractUI<FaderPortReq
        void mute ();
        void rec_enable ();
 
-       void ardour_pan (int);
+       void ardour_pan_azimuth (int);
+       void ardour_pan_width (int);
        void mixbus_pan (int);
 };
 
index 73a8e25f516de33b48db417cf99ad1f439deb1e5..9693986e00126105767f43d861b8e2e1c5586666 100644 (file)
@@ -208,7 +208,7 @@ FaderPort::use_monitor ()
 }
 
 void
-FaderPort::ardour_pan (int delta)
+FaderPort::ardour_pan_azimuth (int delta)
 {
        if (!_current_route) {
                return;
@@ -229,6 +229,29 @@ FaderPort::ardour_pan (int delta)
        azimuth->set_value (azimuth->interface_to_internal (azimuth->internal_to_interface (azimuth->get_value()) + (delta / 64.0)));
 }
 
+
+void
+FaderPort::ardour_pan_width(int delta)
+{
+       if (!_current_route) {
+               return;
+       }
+
+       boost::shared_ptr<Pannable> pannable = _current_route->pannable ();
+
+       if (!pannable) {
+               return;
+       }
+
+       boost::shared_ptr<AutomationControl> width = pannable->pan_width_control;
+
+       if (!width) {
+               return;
+       }
+
+       width->set_value (width->interface_to_internal (width->internal_to_interface (width->get_value()) + (delta / 64.0)));
+}
+
 void
 FaderPort::mixbus_pan (int delta)
 {