diff --git a/libs/surfaces/launchpad_pro/lppro.cc b/libs/surfaces/launchpad_pro/lppro.cc index 578e8d77f5..1de17e2830 100644 --- a/libs/surfaces/launchpad_pro/lppro.cc +++ b/libs/surfaces/launchpad_pro/lppro.cc @@ -45,6 +45,7 @@ #include "ardour/midi_port.h" #include "ardour/session.h" #include "ardour/tempo.h" +#include "ardour/triggerbox.h" #include "ardour/types_convert.h" #include "gtkmm2ext/gui_thread.h" @@ -147,6 +148,8 @@ LaunchPadPro::LaunchPadPro (ARDOUR::Session& s) connect_daw_ports (); build_pad_map (); + + Trigger::TriggerPropertyChange.connect (trigger_connections, invalidator (*this), boost::bind (&LaunchPadPro::trigger_property_change, this, _1, _2, _3), this); } LaunchPadPro::~LaunchPadPro () @@ -407,8 +410,13 @@ LaunchPadPro::all_pads_out () msg[1] = p.second.id; daw_write (msg, 3); } + + /* Finally, the logo */ + msg[1] = 0x63; + daw_write (msg, 3); } + bool LaunchPadPro::light_logo () { @@ -761,6 +769,7 @@ LaunchPadPro::daw_write (const MidiByteArray& data) void LaunchPadPro::daw_write (MIDI::byte const * data, size_t size) { + DEBUG_TRACE (DEBUG::Launchpad, string_compose ("daw write %1\n", size)); _daw_out_port->write (data, size, 0); } @@ -1202,3 +1211,47 @@ LaunchPadPro::pad_long_press (Pad& pad) DEBUG_TRACE (DEBUG::Launchpad, string_compose ("pad long press on %1, %2 => %3\n", pad.x, pad.y, pad.id)); session->unbang_trigger_at (pad.x, pad.y); } + +void +LaunchPadPro::trigger_property_change (PropertyChange pc, int x, int y) +{ + TriggerPtr trigger (session->trigger_at (x, y)); + if (!trigger) { + return; + } + + + if (pc.contains (Properties::running)) { + + int pid = (11 + ((7 - y) * 10)) + x; + + PadMap::iterator p = pad_map.find (pid); + if (p == pad_map.end()) { + return; + } + + MIDI::byte msg[3]; + msg[0] = 0x90; + msg[1] = p->second.id; + + switch (trigger->state()) { + case Trigger::Stopped: + msg[2] = 0; + break; + case Trigger::WaitingToStart: + msg[0] |= 1; + msg[2] = 0x27; + break; + case Trigger::Running: + case Trigger::WaitingForRetrigger: + case Trigger::WaitingToStop: + case Trigger::WaitingToSwitch: + msg[2] = 0x27; + break; + default: + msg[2] = 0; + } + + daw_write (msg, 3); + } +} diff --git a/libs/surfaces/launchpad_pro/lppro.h b/libs/surfaces/launchpad_pro/lppro.h index 034d3dc39a..d8f9a6b710 100644 --- a/libs/surfaces/launchpad_pro/lppro.h +++ b/libs/surfaces/launchpad_pro/lppro.h @@ -435,6 +435,9 @@ class LaunchPadPro : public MIDISurface void pad_press (Pad&); void pad_long_press (Pad&); + + void trigger_property_change (PBD::PropertyChange, int x, int y); + PBD::ScopedConnectionList trigger_connections; }; } /* namespace */