diff options
author | Térence Clastres <t.clastres@gmail.com> | 2018-09-08 19:03:45 +0200 |
---|---|---|
committer | Robin Gareus <robin@gareus.org> | 2018-10-17 15:14:59 +0200 |
commit | a33a5cdeaf1c358bb4e8567780d960d24b36743a (patch) | |
tree | 851e2217430e8a0f5d8e5018234230ea63e1e063 /libs/surfaces/launch_control_xl | |
parent | 1b7cb8aec4807af4a539176a579741ad7ca6e69b (diff) |
LCXL: Assign one callback function per Knob/Fader
Diffstat (limited to 'libs/surfaces/launch_control_xl')
-rw-r--r-- | libs/surfaces/launch_control_xl/controllers.cc | 222 | ||||
-rw-r--r-- | libs/surfaces/launch_control_xl/launch_control_xl.cc | 62 | ||||
-rw-r--r-- | libs/surfaces/launch_control_xl/launch_control_xl.h | 63 |
3 files changed, 245 insertions, 102 deletions
diff --git a/libs/surfaces/launch_control_xl/controllers.cc b/libs/surfaces/launch_control_xl/controllers.cc index 2470d4497e..eca0f7b7d7 100644 --- a/libs/surfaces/launch_control_xl/controllers.cc +++ b/libs/surfaces/launch_control_xl/controllers.cc @@ -38,29 +38,56 @@ LaunchControlXL::build_maps () boost::shared_ptr<Knob> knob; - #define MAKE_KNOB(i,cc, index) \ - knob.reset (new Knob ((i), (cc), (index), (*this))); \ + #define MAKE_KNOB(i,cc,index,a) \ + knob.reset (new Knob ((i), (cc), (index), (a), (*this))); \ cc_knob_map.insert (std::make_pair (knob->controller_number(), knob)); \ id_knob_map.insert (std::make_pair (knob->id(), knob)) - for (uint8_t n = 0; n < 8; ++n) { - MAKE_KNOB (static_cast<KnobID>(n), (n + 13), n); - MAKE_KNOB (static_cast<KnobID>(n + 8), (n + 29), (n + 8)); - MAKE_KNOB (static_cast<KnobID>(n + 16), (n + 49), (n + 16)); - } + MAKE_KNOB (SendA1, 13, 0, &LaunchControlXL::knob_sendA1); + MAKE_KNOB (SendA2, 14, 1, &LaunchControlXL::knob_sendA2); + MAKE_KNOB (SendA3, 15, 2, &LaunchControlXL::knob_sendA3); + MAKE_KNOB (SendA4, 16, 3, &LaunchControlXL::knob_sendA4); + MAKE_KNOB (SendA5, 17, 4, &LaunchControlXL::knob_sendA5); + MAKE_KNOB (SendA6, 18, 5, &LaunchControlXL::knob_sendA6); + MAKE_KNOB (SendA7, 19, 6, &LaunchControlXL::knob_sendA7); + MAKE_KNOB (SendA8, 20, 7, &LaunchControlXL::knob_sendA8); + + MAKE_KNOB (SendB1, 29, 8, &LaunchControlXL::knob_sendB1); + MAKE_KNOB (SendB2, 30, 9, &LaunchControlXL::knob_sendB2); + MAKE_KNOB (SendB3, 31, 10, &LaunchControlXL::knob_sendB3); + MAKE_KNOB (SendB4, 32, 11, &LaunchControlXL::knob_sendB4); + MAKE_KNOB (SendB5, 33, 12, &LaunchControlXL::knob_sendB5); + MAKE_KNOB (SendB6, 34, 13, &LaunchControlXL::knob_sendB6); + MAKE_KNOB (SendB7, 35, 14, &LaunchControlXL::knob_sendB7); + MAKE_KNOB (SendB8, 36, 15, &LaunchControlXL::knob_sendB8); + + MAKE_KNOB (Pan1, 49, 16, &LaunchControlXL::knob_pan1); + MAKE_KNOB (Pan2, 50, 17, &LaunchControlXL::knob_pan2); + MAKE_KNOB (Pan3, 51, 18, &LaunchControlXL::knob_pan3); + MAKE_KNOB (Pan4, 52, 19, &LaunchControlXL::knob_pan4); + MAKE_KNOB (Pan5, 53, 20, &LaunchControlXL::knob_pan5); + MAKE_KNOB (Pan6, 54, 21, &LaunchControlXL::knob_pan6); + MAKE_KNOB (Pan7, 55, 22, &LaunchControlXL::knob_pan7); + MAKE_KNOB (Pan8, 56, 23, &LaunchControlXL::knob_pan8); /* Faders */ boost::shared_ptr<Fader> fader; - #define MAKE_FADER(i,cc) \ - fader.reset (new Fader ((i), (cc))); \ + #define MAKE_FADER(i,cc,a) \ + fader.reset (new Fader ((i), (cc), (a))); \ cc_fader_map.insert (std::make_pair (fader->controller_number(), fader)); \ id_fader_map.insert (std::make_pair (fader->id(), fader)) - for (uint8_t n = 0; n < 8; ++n) { - MAKE_FADER (static_cast<FaderID>(n), (n + 77) ); - } + MAKE_FADER (Fader1, 77, &LaunchControlXL::fader_1); + MAKE_FADER (Fader2, 78, &LaunchControlXL::fader_2); + MAKE_FADER (Fader3, 79, &LaunchControlXL::fader_3); + MAKE_FADER (Fader4, 80, &LaunchControlXL::fader_4); + MAKE_FADER (Fader5, 81, &LaunchControlXL::fader_5); + MAKE_FADER (Fader6, 82, &LaunchControlXL::fader_6); + MAKE_FADER (Fader7, 83, &LaunchControlXL::fader_7); + MAKE_FADER (Fader8, 84, &LaunchControlXL::fader_8); + /* Buttons */ @@ -299,29 +326,6 @@ LaunchControlXL::update_track_focus_led(uint8_t n) write (b->state_msg()); } -void -LaunchControlXL::button_track_focus(uint8_t n) -{ - if (buttons_down.find(Device) != buttons_down.end()) { - DEBUG_TRACE (DEBUG::LaunchControlXL, "DEVICE BUTTON HOLD\n"); - if (stripable[n]->solo_isolate_control()) { - bool solo_isolate_active = stripable[n]->solo_isolate_control()->get_value(); - stripable[n]->solo_isolate_control()->set_value (!solo_isolate_active, PBD::Controllable::UseGroup); - } - return; - } - - if (stripable[n]) { - if ( stripable[n]->is_selected() ) { - ControlProtocol::RemoveStripableFromSelection (stripable[n]); - } else { - ControlProtocol::AddStripableToSelection (stripable[n]); - } - } else { - return; - } -} - boost::shared_ptr<AutomationControl> LaunchControlXL::get_ac_by_state(uint8_t n) { boost::shared_ptr<AutomationControl> ac; @@ -550,6 +554,154 @@ LaunchControlXL::master_send_led_bank () # endif void +LaunchControlXL::fader(uint8_t n) +{ + if (!stripable[n]) { + return; + } + + boost::shared_ptr<Fader> fader = 0; + IDFaderMap::iterator f = id_fader_map.find(static_cast<FaderID>(n)); + + if (f != id_fader_map.end()) { + fader = f->second; + } + + if (!fader) { + return; + } + + boost::shared_ptr<AutomationControl> ac = stripable[fader->id()]->gain_control(); + if (ac && check_pick_up(fader, ac)) { + ac->set_value ( ac->interface_to_internal( fader->value() / 127.0), PBD::Controllable::UseGroup ); + } +} + +void +LaunchControlXL::knob_sendA(uint8_t n) +{ + if (!stripable[n]) { + return; + } + + boost::shared_ptr<Knob> knob = 0; + IDKnobMap::iterator k = id_knob_map.find(static_cast<KnobID>(n)); + + if (k != id_knob_map.end()) { + knob = k->second; + } + + if (!knob) { + return; + } + + boost::shared_ptr<AutomationControl> ac; + + if (buttons_down.find(Device) != buttons_down.end()) { // Device button hold + ac = stripable[n]->trim_control(); + } else { + ac = stripable[n]->send_level_controllable (0); + } + + if (ac && check_pick_up(knob, ac)) { + ac->set_value ( ac->interface_to_internal( knob->value() / 127.0), PBD::Controllable::UseGroup ); + } +} + +void +LaunchControlXL::knob_sendB(uint8_t n) +{ + if (!stripable[n]) { + return; + } + + boost::shared_ptr<Knob> knob = 0; + IDKnobMap::iterator k = id_knob_map.find(static_cast<KnobID>(n + 8)); + + if (k != id_knob_map.end()) { + knob = k->second; + } + + if (!knob) { + return; + } + + boost::shared_ptr<AutomationControl> ac; + + if (buttons_down.find(Device) != buttons_down.end()) { // Device button hold + #ifdef MIXBUS + ac = stripable[n]->filter_freq_controllable (true); + #else + /* something */ + #endif + } else { + ac = stripable[n]->send_level_controllable (1); + } + + if (ac && check_pick_up(knob, ac)) { + ac->set_value ( ac->interface_to_internal( knob->value() / 127.0), PBD::Controllable::UseGroup ); + } +} + +void +LaunchControlXL::knob_pan(uint8_t n) +{ + if (!stripable[n]) { + return; + } + + boost::shared_ptr<Knob> knob = 0; + IDKnobMap::iterator k = id_knob_map.find(static_cast<KnobID>(n + 16)); + + if (k != id_knob_map.end()) { + knob = k->second; + } + + if (!knob) { + return; + } + + boost::shared_ptr<AutomationControl> ac; + + if (buttons_down.find(Device) != buttons_down.end()) { // Device button hold + #ifdef MIXBUS + ac = stripable[n]->comp_threshold_controllable(); + #else + ac = stripable[n]->pan_width_control(); + #endif + } else { + ac = stripable[n]->pan_azimuth_control(); + } + + if (ac && check_pick_up(knob, ac)) { + ac->set_value ( ac->interface_to_internal( knob->value() / 127.0), PBD::Controllable::UseGroup ); + } +} + +void +LaunchControlXL::button_track_focus(uint8_t n) +{ + if (buttons_down.find(Device) != buttons_down.end()) { + DEBUG_TRACE (DEBUG::LaunchControlXL, "DEVICE BUTTON HOLD\n"); + if (stripable[n]->solo_isolate_control()) { + bool solo_isolate_active = stripable[n]->solo_isolate_control()->get_value(); + stripable[n]->solo_isolate_control()->set_value (!solo_isolate_active, PBD::Controllable::UseGroup); + } + return; + } + + if (stripable[n]) { + if ( stripable[n]->is_selected() ) { + ControlProtocol::RemoveStripableFromSelection (stripable[n]); + } else { + ControlProtocol::AddStripableToSelection (stripable[n]); + } + } else { + return; + } +} + +void LaunchControlXL::button_track_control(uint8_t n) { if (!stripable[n]) { return; diff --git a/libs/surfaces/launch_control_xl/launch_control_xl.cc b/libs/surfaces/launch_control_xl/launch_control_xl.cc index c220c3f6dc..2a942eb3e6 100644 --- a/libs/surfaces/launch_control_xl/launch_control_xl.cc +++ b/libs/surfaces/launch_control_xl/launch_control_xl.cc @@ -458,63 +458,6 @@ LaunchControlXL::check_pick_up(boost::shared_ptr<Controller> controller, boost:: } void -LaunchControlXL::handle_knob_message (boost::shared_ptr<Knob> knob) -{ - uint8_t chan = knob->id() % 8; // get the strip channel number - if (!stripable[chan]) { - return; - } - - boost::shared_ptr<AutomationControl> ac; - - if (knob->id() < 8) { // sendA knob - if (buttons_down.find(Device) != buttons_down.end()) { // Device button hold - ac = stripable[chan]->trim_control(); - } else { - ac = stripable[chan]->send_level_controllable (0); - } - } else if (knob->id() >= 8 && knob->id() < 16) { // sendB knob - if (buttons_down.find(Device) != buttons_down.end()) { // Device button hold -#ifdef MIXBUS - ac = stripable[chan]->filter_freq_controllable (true); -#else - /* something */ -#endif - } else { - ac = stripable[chan]->send_level_controllable (1); - } - } else if (knob->id() >= 16 && knob->id() < 24) { // pan knob - if (buttons_down.find(Device) != buttons_down.end()) { // Device button hold -#ifdef MIXBUS - ac = stripable[chan]->comp_threshold_controllable(); -#else - ac = stripable[chan]->pan_width_control(); -#endif - } else { - ac = stripable[chan]->pan_azimuth_control(); - } - } - - if (ac && check_pick_up(knob, ac)) { - ac->set_value ( ac->interface_to_internal( knob->value() / 127.0), PBD::Controllable::UseGroup ); - } -} - -void -LaunchControlXL::handle_fader_message (boost::shared_ptr<Fader> fader) -{ - - if (!stripable[fader->id()]) { - return; - } - - boost::shared_ptr<AutomationControl> ac = stripable[fader->id()]->gain_control(); - if (ac && check_pick_up(fader, ac)) { - ac->set_value ( ac->interface_to_internal( fader->value() / 127.0), PBD::Controllable::UseGroup ); - } -} - -void LaunchControlXL::handle_midi_controller_message (MIDI::Parser& parser, MIDI::EventTwoBytes* ev, MIDI::channel_t chan) { _template_number = (int)chan; @@ -534,12 +477,11 @@ LaunchControlXL::handle_midi_controller_message (MIDI::Parser& parser, MIDI::Eve } else if (f != cc_fader_map.end()) { boost::shared_ptr<Fader> fader = f->second; fader->set_value(ev->value); - handle_fader_message(fader); - + (this->*fader->action_method)(); } else if (k != cc_knob_map.end()) { boost::shared_ptr<Knob> knob = k->second; knob->set_value(ev->value); - handle_knob_message(knob); + (this->*knob->action_method)(); } } diff --git a/libs/surfaces/launch_control_xl/launch_control_xl.h b/libs/surfaces/launch_control_xl/launch_control_xl.h index 6fcc1893f3..3bc496bdba 100644 --- a/libs/surfaces/launch_control_xl/launch_control_xl.h +++ b/libs/surfaces/launch_control_xl/launch_control_xl.h @@ -143,7 +143,10 @@ public: struct Controller { - Controller(uint8_t cn, uint8_t val = 0) : _controller_number(cn), _value(val) {} + Controller(uint8_t cn, uint8_t val, void (LaunchControlXL::*action)()) + : _controller_number(cn) + , _value(val) + , action_method(action) {} uint8_t controller_number() const { return _controller_number; } uint8_t value() const { return _value; } @@ -152,6 +155,9 @@ public: protected: uint8_t _controller_number; uint8_t _value; + + public: + void (LaunchControlXL::*action_method)(); }; struct LED { @@ -297,8 +303,8 @@ public: }; struct Fader : public Controller { - Fader(FaderID id, uint8_t cn) - : Controller(cn, 0), _id(id) {} // minimal value + Fader(FaderID id, uint8_t cn, void (LaunchControlXL::*action)()) + : Controller(cn, 0, action), _id(id) {} // minimal value FaderID id() const { return _id; } @@ -309,8 +315,8 @@ public: }; struct Knob : public Controller, public MultiColorLED { - Knob(KnobID id, uint8_t cn, uint8_t index, LaunchControlXL& l) - : Controller(cn, 64) + Knob(KnobID id, uint8_t cn, uint8_t index, void (LaunchControlXL::*action)(), LaunchControlXL &l) + : Controller(cn, 64, action) , MultiColorLED(index, Off, l) , _id(id) {} // knob 50/50 value @@ -438,8 +444,6 @@ private: void connect_to_parser(); void handle_button_message(boost::shared_ptr<Button> button, MIDI::EventTwoBytes *); - void handle_fader_message(boost::shared_ptr<Fader> fader); - void handle_knob_message(boost::shared_ptr<Knob> knob); bool check_pick_up(boost::shared_ptr<Controller> controller, boost::shared_ptr<ARDOUR::AutomationControl> ac); @@ -463,6 +467,51 @@ private: boost::shared_ptr<Knob>* knobs_by_column(uint8_t col, boost::shared_ptr<Knob>* knob_col); void update_knob_led(uint8_t n); + void knob_sendA(uint8_t n); + void knob_sendB(uint8_t n); + void knob_pan(uint8_t n); + + + void knob_sendA1() { knob_sendA(0); } + void knob_sendA2() { knob_sendA(1); } + void knob_sendA3() { knob_sendA(2); } + void knob_sendA4() { knob_sendA(3); } + void knob_sendA5() { knob_sendA(4); } + void knob_sendA6() { knob_sendA(5); } + void knob_sendA7() { knob_sendA(6); } + void knob_sendA8() { knob_sendA(7); } + + void knob_sendB1() { knob_sendB(0); } + void knob_sendB2() { knob_sendB(1); } + void knob_sendB3() { knob_sendB(2); } + void knob_sendB4() { knob_sendB(3); } + void knob_sendB5() { knob_sendB(4); } + void knob_sendB6() { knob_sendB(5); } + void knob_sendB7() { knob_sendB(6); } + void knob_sendB8() { knob_sendB(7); } + + void knob_pan1() { knob_pan(0); } + void knob_pan2() { knob_pan(1); } + void knob_pan3() { knob_pan(2); } + void knob_pan4() { knob_pan(3); } + void knob_pan5() { knob_pan(4); } + void knob_pan6() { knob_pan(5); } + void knob_pan7() { knob_pan(6); } + void knob_pan8() { knob_pan(7); } + + /* Fader methods */ + + void fader(uint8_t n); + + void fader_1() { fader(0); } + void fader_2() { fader(1); } + void fader_3() { fader(2); } + void fader_4() { fader(3); } + void fader_5() { fader(4); } + void fader_6() { fader(5); } + void fader_7() { fader(6); } + void fader_8() { fader(7); } + /* Button methods */ boost::shared_ptr<TrackButton> track_button_by_range(uint8_t n, uint8_t first, uint8_t middle); |