LCXL: Add some Mixbus functionality
[ardour.git] / libs / surfaces / launch_control_xl / launch_control_xl.h
index 606645a10bd55f445dcd75e460b2b8a130ca39ec..e69dcca392471756d639b7019d87de83bb214a72 100644 (file)
@@ -138,7 +138,7 @@ public:
 
        enum LEDFlag { Normal = 0xC, Blink = 0x8, DoubleBuffering = 0x0 };
 
-       enum LEDColor { Off=0, RedLow = 1, RedFull = 3, GreenLow = 16, GreenFull = 48, Yellow = 50, AmberLow = 17, AmberFull = 51};
+       enum LEDColor { Off=0, RedLow = 1, RedFull = 3, GreenLow = 16, GreenFull = 48, YellowLow = 34, YellowFull = 51, AmberLow = 18, AmberFull = 35};
 
 
        struct Controller {
@@ -225,6 +225,12 @@ public:
                                void (LaunchControlXL::*release)())
                        : Button(id, press, release), _controller_number(cn) {}
 
+               ControllerButton(ButtonID id, uint8_t cn,
+                               void (LaunchControlXL::*press)(),
+                               void (LaunchControlXL::*release)(),
+                               void (LaunchControlXL::*release_long)())
+                       : Button(id, press, release, release_long), _controller_number(cn) {}
+
 
                uint8_t controller_number() const { return _controller_number; }
 
@@ -271,26 +277,33 @@ public:
                SelectButton(ButtonID id, uint8_t cn, uint8_t index, void (LaunchControlXL::*press)(), LaunchControlXL& l)
                        : ControllerButton(id, cn, press), LED(index, RedFull, l) {}
 
+               SelectButton(ButtonID id, uint8_t cn, uint8_t index,
+                       void (LaunchControlXL::*press)(),
+                       void (LaunchControlXL::*release)(),
+                       void (LaunchControlXL::*release_long)(),
+                       LaunchControlXL& l)
+                       : ControllerButton(id, cn, press, release, release_long), LED(index, RedFull, l) {}
+
                MidiByteArray state_msg(bool light) const;
        };
 
        struct TrackStateButton : public NoteButton, public LED {
                TrackStateButton(ButtonID id, uint8_t nn, uint8_t index, void (LaunchControlXL::*press)(), LaunchControlXL& l)
                        : NoteButton(id, nn, press)
-                       , LED(index, Yellow, l) {}
+                       , LED(index, YellowLow, l) {}
 
                TrackStateButton(ButtonID id, uint8_t nn, uint8_t index, void (LaunchControlXL::*press)(),
                                void (LaunchControlXL::*release)(),
                                LaunchControlXL& l)
                        : NoteButton(id, nn, press, release)
-                       , LED(index, Yellow, l) {}
+                       , LED(index, YellowLow, l) {}
 
                TrackStateButton(ButtonID id, uint8_t nn, uint8_t index, void (LaunchControlXL::*press)(),
                                void (LaunchControlXL::*release)(),
                                void (LaunchControlXL::*release_long)(),
                                LaunchControlXL& l)
                        : NoteButton(id, nn, press, release, release_long)
-                       , LED(index, Yellow, l) {}
+                       , LED(index, YellowLow, l) {}
 
                MidiByteArray state_msg(bool light) const;
        };
@@ -308,9 +321,9 @@ public:
        };
 
        struct Knob : public Controller, public MultiColorLED {
-               Knob(KnobID id, uint8_t cn, uint8_t index, LEDColor color, LaunchControlXL& l)
+               Knob(KnobID id, uint8_t cn, uint8_t index, LaunchControlXL& l)
                        : Controller(cn, 64)
-                       , MultiColorLED(index, color, l)
+                       , MultiColorLED(index, Off, l)
                        , _id(id) {} // knob 50/50 value
 
                KnobID id() const { return _id; }
@@ -335,6 +348,8 @@ public:
        void *get_gui() const;
        void tear_down_gui();
 
+       bool use_fader8master = false;
+
        int set_active(bool yn);
        XMLNode &get_state();
        int set_state(const XMLNode &node, int version);
@@ -351,6 +366,8 @@ public:
        static std::string fader_name_by_id(FaderID);
 
        void write(const MidiByteArray &);
+       void reset(uint8_t chan);
+       void set_fader8master (bool yn);
 
        TrackMode track_mode() const { return _track_mode; }
        void set_track_mode(TrackMode mode);
@@ -428,6 +445,8 @@ private:
        void handle_fader_message(Fader* fader);
        void handle_knob_message(Knob* knob);
 
+       bool check_pick_up(Controller* controller, boost::shared_ptr<ARDOUR::AutomationControl> ac);
+
        void handle_midi_controller_message(MIDI::Parser &, MIDI::EventTwoBytes *, MIDI::channel_t chan);
        void handle_midi_note_on_message(MIDI::Parser &, MIDI::EventTwoBytes *, MIDI::channel_t chan);
        void handle_midi_note_off_message(MIDI::Parser &, MIDI::EventTwoBytes *, MIDI::channel_t chan);
@@ -443,39 +462,46 @@ private:
        void notify_loop_state_changed();
        void notify_parameter_changed(std::string);
 
+       /* Knob methods */
+
+       Knob** knobs_by_column(uint8_t col, Knob** knob_col);
+       void update_knob_led(uint8_t n);
 
        /* Button methods */
 
-       TrackButton* track_button_by_number(uint8_t n, uint8_t first, uint8_t middle);
-       TrackButton* focus_button_by_number(uint8_t n) { return track_button_by_number(n, 41, 57) ; }
-       TrackButton* control_button_by_number(uint8_t n) { return track_button_by_number(n, 73, 89) ; }
+       TrackButton* track_button_by_range(uint8_t n, uint8_t first, uint8_t middle);
+       TrackButton* focus_button_by_column(uint8_t col) { return track_button_by_range(col, 41, 57) ; }
+       TrackButton* control_button_by_column(uint8_t col) { return track_button_by_range(col, 73, 89) ; }
 
 
        void button_device();
        void button_device_long_press();
        void button_track_mode(TrackMode state);
-       void button_mute() { button_track_mode(TrackMute); }
-       void button_solo() { button_track_mode(TrackSolo); }
-       void button_record() { button_track_mode(TrackRecord); }
+       void button_mute();
+       void button_solo();
+       void button_record();
        void button_select_up();
        void button_select_down();
        void button_select_left();
        void button_select_right();
+       void button_select_left_long_press();
+       void button_select_right_long_press();
 
        void button_track_focus(uint8_t n);
        void button_track_control(uint8_t n);
 
        boost::shared_ptr<ARDOUR::AutomationControl> get_ac_by_state(uint8_t n);
+       void update_track_focus_led(uint8_t n);
        void update_track_control_led(uint8_t n);
 
-       void button_track_focus_1() { ControlProtocol::ToggleStripableSelection (stripable[0]); }
-       void button_track_focus_2() { ControlProtocol::ToggleStripableSelection (stripable[1]); }
-       void button_track_focus_3() { ControlProtocol::ToggleStripableSelection (stripable[2]); }
-       void button_track_focus_4() { ControlProtocol::ToggleStripableSelection (stripable[3]); }
-       void button_track_focus_5() { ControlProtocol::ToggleStripableSelection (stripable[4]); }
-       void button_track_focus_6() { ControlProtocol::ToggleStripableSelection (stripable[5]); }
-       void button_track_focus_7() { ControlProtocol::ToggleStripableSelection (stripable[6]); }
-       void button_track_focus_8() { ControlProtocol::ToggleStripableSelection (stripable[7]); }
+       void button_track_focus_1() { button_track_focus(0); }
+       void button_track_focus_2() { button_track_focus(1); }
+       void button_track_focus_3() { button_track_focus(2); }
+       void button_track_focus_4() { button_track_focus(3); }
+       void button_track_focus_5() { button_track_focus(4); }
+       void button_track_focus_6() { button_track_focus(5); }
+       void button_track_focus_7() { button_track_focus(6); }
+       void button_track_focus_8() { button_track_focus(7); }
 
        void button_track_control_1() { button_track_control(0); }
        void button_track_control_2() { button_track_control(1); }