summaryrefslogtreecommitdiff
path: root/libs/surfaces/launch_control_xl
diff options
context:
space:
mode:
authorTérence Clastres <t.clastres@gmail.com>2018-09-08 19:03:45 +0200
committerRobin Gareus <robin@gareus.org>2018-10-17 15:14:59 +0200
commita33a5cdeaf1c358bb4e8567780d960d24b36743a (patch)
tree851e2217430e8a0f5d8e5018234230ea63e1e063 /libs/surfaces/launch_control_xl
parent1b7cb8aec4807af4a539176a579741ad7ca6e69b (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.cc222
-rw-r--r--libs/surfaces/launch_control_xl/launch_control_xl.cc62
-rw-r--r--libs/surfaces/launch_control_xl/launch_control_xl.h63
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);