lppro: selection enabled and displayed

This commit is contained in:
Paul Davis 2023-08-22 18:42:52 -06:00
parent a49c961189
commit 784fa82081
2 changed files with 65 additions and 39 deletions

View file

@ -45,6 +45,7 @@
#include "ardour/midiport_manager.h" #include "ardour/midiport_manager.h"
#include "ardour/midi_track.h" #include "ardour/midi_track.h"
#include "ardour/midi_port.h" #include "ardour/midi_port.h"
#include "ardour/selection.h"
#include "ardour/session.h" #include "ardour/session.h"
#include "ardour/tempo.h" #include "ardour/tempo.h"
#include "ardour/triggerbox.h" #include "ardour/triggerbox.h"
@ -402,14 +403,14 @@ LaunchPadPro::build_pad_map ()
EDGE_PAD0 (Down); EDGE_PAD0 (Down);
EDGE_PAD0 (Up); EDGE_PAD0 (Up);
EDGE_PAD0 (Lower1); EDGE_PAD (Lower1, &LaunchPadPro::lower1_press);
EDGE_PAD0 (Lower2); EDGE_PAD (Lower2, &LaunchPadPro::lower2_press);
EDGE_PAD0 (Lower3); EDGE_PAD (Lower3, &LaunchPadPro::lower3_press);
EDGE_PAD0 (Lower4); EDGE_PAD (Lower4, &LaunchPadPro::lower4_press);
EDGE_PAD0 (Lower5); EDGE_PAD (Lower5, &LaunchPadPro::lower5_press);
EDGE_PAD0 (Lower6); EDGE_PAD (Lower6, &LaunchPadPro::lower6_press);
EDGE_PAD0 (Lower7); EDGE_PAD (Lower7, &LaunchPadPro::lower7_press);
EDGE_PAD0 (Lower8); EDGE_PAD (Lower8, &LaunchPadPro::lower8_press);
/* Now add the 8x8 central pad grid */ /* Now add the 8x8 central pad grid */
@ -468,20 +469,13 @@ LaunchPadPro::pad_by_id (int pid)
} }
void void
LaunchPadPro::light_pad (int pad_id, int color) LaunchPadPro::light_pad (int pad_id, int color, int mode)
{ {
MidiByteArray s (sysex_header); MIDI::byte msg[3];
msg[0] = 0x90 | mode;
s.push_back (0x3); msg[1] = pad_id;
s.push_back (0x3); msg[2] = color;
s.push_back (pad_id); daw_write (msg, 3);
s.push_back (UINT_RGBA_R (color)/2);
s.push_back (UINT_RGBA_G (color)/2);
s.push_back (UINT_RGBA_B (color)/2);
s.push_back (0xf7);
daw_write (s);
} }
void void
@ -732,16 +726,22 @@ LaunchPadPro::handle_midi_controller_message (MIDI::Parser&, MIDI::EventTwoBytes
{ {
DEBUG_TRACE (DEBUG::Launchpad, string_compose ("CC %1 (value %2)\n", (int) ev->controller_number, (int) ev->value)); DEBUG_TRACE (DEBUG::Launchpad, string_compose ("CC %1 (value %2)\n", (int) ev->controller_number, (int) ev->value));
if (_current_layout != SessionLayout) {
return;
}
PadMap::iterator p = pad_map.find (ev->controller_number); PadMap::iterator p = pad_map.find (ev->controller_number);
if (p == pad_map.end()) { if (p == pad_map.end()) {
return; return;
} }
Pad& pad (p->second); Pad& pad (p->second);
if (_current_layout != SessionLayout) {
/* Allow Lower1..Lower8 to have selection effects in Note layout */
if (_current_layout != NoteLayout || (pad.id < Lower1 || pad.id > Lower8)) {
return;
}
}
set<int>::iterator c = consumed.find (pad.id); set<int>::iterator c = consumed.find (pad.id);
if (c == consumed.end()) { if (c == consumed.end()) {
@ -962,6 +962,27 @@ LaunchPadPro::stripable_selection_changed ()
std::shared_ptr<MidiTrack> new_pad_target; std::shared_ptr<MidiTrack> new_pad_target;
StripableNotificationList const & selected (last_selected()); StripableNotificationList const & selected (last_selected());
light_pad (Lower1, 0);
light_pad (Lower2, 0);
light_pad (Lower3, 0);
light_pad (Lower4, 0);
light_pad (Lower5, 0);
light_pad (Lower6, 0);
light_pad (Lower7, 0);
light_pad (Lower8, 0);
std::shared_ptr<Stripable> first_selected;
if (!selected.empty()) {
first_selected = selected.front().lock();
}
if (first_selected && first_selected->presentation_info().order() >= (uint32_t) scroll_x_offset && first_selected->presentation_info().order() < (uint32_t) scroll_x_offset + 8) {
int pad = first_selected->presentation_info().order() - scroll_x_offset;
/* subtract 1 because Master always has order zero XXX does * it? */
light_pad (PadID (Lower1 + (pad - 1)), 72); /* red */
}
/* See if there's a MIDI track selected */ /* See if there's a MIDI track selected */
for (StripableNotificationList::const_iterator si = selected.begin(); si != selected.end(); ++si) { for (StripableNotificationList::const_iterator si = selected.begin(); si != selected.end(); ++si) {
@ -996,21 +1017,8 @@ LaunchPadPro::stripable_selection_changed ()
if (new_pad_target && pad_port) { if (new_pad_target && pad_port) {
new_pad_target->input()->connect (new_pad_target->input()->nth (0), pad_port->name(), this); new_pad_target->input()->connect (new_pad_target->input()->nth (0), pad_port->name(), this);
_current_pad_target = new_pad_target; _current_pad_target = new_pad_target;
// _selection_color = get_color_index (new_pad_target->presentation_info().color());
// _contrast_color = get_color_index (Gtkmm2ext::HSV (new_pad_target->presentation_info().color()).opposite().color());
} else {
// _current_pad_target.reset ();
// _selection_color = LED::Green;
// _contrast_color = LED::Green;
} }
// reset_pad_colors ();
} }
// TrackMixLayout* tml = dynamic_cast<TrackMixLayout*> (_track_mix_layout);
// assert (tml);
// tml->set_stripable (first_selected_stripable());
} }
bool bool
@ -1283,44 +1291,61 @@ LaunchPadPro::up_press (Pad& pad)
scroll_y_offset++; scroll_y_offset++;
} }
void
LaunchPadPro::select_stripable (int n)
{
std::shared_ptr<Route> r = session->get_remote_nth_route (scroll_x_offset + n);
if (r) {
session->selection().set (r, std::shared_ptr<AutomationControl>());
}
}
void void
LaunchPadPro::lower1_press (Pad& pad) LaunchPadPro::lower1_press (Pad& pad)
{ {
select_stripable (0);
} }
void void
LaunchPadPro::lower2_press (Pad& pad) LaunchPadPro::lower2_press (Pad& pad)
{ {
select_stripable (1);
} }
void void
LaunchPadPro::lower3_press (Pad& pad) LaunchPadPro::lower3_press (Pad& pad)
{ {
select_stripable (2);
} }
void void
LaunchPadPro::lower4_press (Pad& pad) LaunchPadPro::lower4_press (Pad& pad)
{ {
select_stripable (3);
} }
void void
LaunchPadPro::lower5_press (Pad& pad) LaunchPadPro::lower5_press (Pad& pad)
{ {
select_stripable (4);
} }
void void
LaunchPadPro::lower6_press (Pad& pad) LaunchPadPro::lower6_press (Pad& pad)
{ {
select_stripable (5);
} }
void void
LaunchPadPro::lower7_press (Pad& pad) LaunchPadPro::lower7_press (Pad& pad)
{ {
select_stripable (6);
} }
void void
LaunchPadPro::lower8_press (Pad& pad) LaunchPadPro::lower8_press (Pad& pad)
{ {
select_stripable (7);
} }
void void

View file

@ -248,9 +248,10 @@ class LaunchPadPro : public MIDISurface
void stop_event_loop (); void stop_event_loop ();
void stripable_selection_changed (); void stripable_selection_changed ();
void select_stripable (int col);
std::weak_ptr<ARDOUR::MidiTrack> _current_pad_target; std::weak_ptr<ARDOUR::MidiTrack> _current_pad_target;
void light_pad (int pad_id, int color); void light_pad (int pad_id, int color, int mode = 0);
void pad_off (int pad_id); void pad_off (int pad_id);
void all_pads_off (); void all_pads_off ();
void all_pads_on (int color); void all_pads_on (int color);