LCXL: Assign one callback function per Knob/Fader

This commit is contained in:
Térence Clastres 2018-09-08 19:03:45 +02:00 committed by Robin Gareus
parent 1b7cb8aec4
commit a33a5cdeaf
3 changed files with 245 additions and 102 deletions

View File

@ -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;
@ -549,6 +553,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]) {

View File

@ -457,63 +457,6 @@ LaunchControlXL::check_pick_up(boost::shared_ptr<Controller> controller, boost::
return ( abs( controller->value() / 127.0 - ac->internal_to_interface(ac->get_value()) ) < 0.007875 );
}
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)
{
@ -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)();
}
}

View File

@ -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);