launchpad pro: various improvements and fixes

This commit is contained in:
Paul Davis
2023-09-04 19:41:12 -06:00
parent 269699c340
commit 5223d05854
2 changed files with 69 additions and 15 deletions

View File

@@ -139,6 +139,9 @@ LaunchPadPro::LaunchPadPro (ARDOUR::Session& s)
, _gui (nullptr)
, _current_layout (SessionLayout)
, _shift_pressed (false)
, _clear_pressed (false)
, _duplicate_pressed (false)
, _session_pressed (false)
, did_session_display (false)
, current_fader_bank (VolumeFaders)
, revert_layout_on_fader_release (false)
@@ -392,7 +395,7 @@ LaunchPadPro::build_pad_map ()
BUTTON (Left, &LaunchPadPro::left_press);
BUTTON (Right, &LaunchPadPro::right_press);
BUTTON0 (Session);
BUTTON3 (Session, &LaunchPadPro::session_press, &LaunchPadPro::session_long_press, &LaunchPadPro::session_release);
BUTTON0 (Note);
BUTTON0 (Chord);
BUTTON0 (Custom);
@@ -421,8 +424,8 @@ LaunchPadPro::build_pad_map ()
BUTTON (Play, &LaunchPadPro::play_press);
BUTTON0 (FixedLength);
BUTTON0 (Quantize);
BUTTON0 (Duplicate);
BUTTON0 (Clear);
BUTTON3 (Duplicate, &LaunchPadPro::duplicate_press, &LaunchPadPro::duplicate_long_press, &LaunchPadPro::duplicate_release);
BUTTON3 (Clear, &LaunchPadPro::clear_press, &LaunchPadPro::clear_long_press, &LaunchPadPro::clear_release);
BUTTON (Down, &LaunchPadPro::down_press);
BUTTON (Up, &LaunchPadPro::up_press);
@@ -695,6 +698,14 @@ LaunchPadPro::display_session_layout ()
msg[2] = 0x27;
daw_write (msg, 3);
msg[1] = Duplicate;
msg[2] = 79;
daw_write (msg, 3);
msg[1] = Clear;
msg[2] = 3;
daw_write (msg, 3);
msg[1] = Play;
msg[2] = 17;
daw_write (msg, 3);
@@ -1004,7 +1015,6 @@ LaunchPadPro::stripable_selection_changed ()
/* subtract 1 because Master always has order zero XXX does * it? */
selected_pad = first_selected->presentation_info().order() - 1 - scroll_x_offset;
light_pad (PadID (Lower1 + selected_pad), find_closest_palette_color (first_selected->presentation_info().color()), 1);
std::cerr << "pulse on " << selected_pad << std::endl;
}
/* Make all other selection buttons static */
@@ -1066,14 +1076,19 @@ LaunchPadPro::pad_filter (MidiBuffer& in, MidiBuffer& out) const
context. It must use atomics to check state, and must not block.
*/
if (_current_layout != NoteLayout) {
switch (_current_layout) {
case NoteLayout:
case ChordLayout:
break;
default:
return false;
}
bool matched = false;
for (MidiBuffer::iterator ev = in.begin(); ev != in.end(); ++ev) {
if ((*ev).is_note_on() || (*ev).is_note_off()) {
if ((*ev).is_note_on() || (*ev).is_note_off() ||
(*ev).is_channel_pressure() || (*ev).is_poly_pressure()) {
out.push_back (*ev);
matched = true;
}
@@ -1129,8 +1144,9 @@ LaunchPadPro::shift_release (Pad& pad)
void
LaunchPadPro::left_press (Pad& pad)
{
if (scroll_x_offset) {
scroll_x_offset--;
const int shift = (_session_pressed ? 9 : 1);
if (scroll_x_offset >= shift) {
scroll_x_offset -= shift;
}
viewport_changed ();
}
@@ -1138,14 +1154,25 @@ LaunchPadPro::left_press (Pad& pad)
void
LaunchPadPro::right_press (Pad& pad)
{
scroll_x_offset++;
const int shift = (_session_pressed ? 9 : 1);
scroll_x_offset += shift;
viewport_changed ();
}
void
LaunchPadPro::session_press (Pad& pad)
{
/* handled by device */
if (_current_layout == SessionLayout) {
_session_pressed = true;
}
}
void
LaunchPadPro::session_release (Pad& pad)
{
if (_current_layout == SessionLayout) {
_session_pressed = false;
}
}
void
@@ -1395,20 +1422,30 @@ LaunchPadPro::duplicate_press (Pad& pad)
void
LaunchPadPro::clear_press (Pad& pad)
{
_clear_pressed = true;
}
void
LaunchPadPro::clear_release (Pad& pad)
{
_clear_pressed = false;
}
void
LaunchPadPro::down_press (Pad& pad)
{
if (scroll_y_offset) {
scroll_y_offset--;
const int shift = (_session_pressed ? 9 : 1);
if (scroll_y_offset >= shift) {
scroll_y_offset -= shift;
}
}
void
LaunchPadPro::up_press (Pad& pad)
{
scroll_y_offset++;
const int shift = (_session_pressed ? 9 : 1);
scroll_y_offset += shift;
}
void
@@ -1477,6 +1514,15 @@ void
LaunchPadPro::pad_press (Pad& pad)
{
DEBUG_TRACE (DEBUG::Launchpad, string_compose ("pad press on %1, %2 => %3\n", pad.x, pad.y, pad.id));
if (_clear_pressed) {
TriggerPtr tp = session->trigger_at (pad.x, pad.y);
if (tp) {
tp->clear_region ();
}
return;
}
session->bang_trigger_at (pad.x, pad.y);
start_press_timeout (pad);
}
@@ -1524,6 +1570,7 @@ LaunchPadPro::trigger_property_change (PropertyChange pc, Trigger* t)
msg.push_back (0x90);
msg.push_back (pid);
msg.push_back (0x0);
daw_write (msg);
return;
}
@@ -1812,6 +1859,10 @@ LaunchPadPro::viewport_changed ()
if (r) {
r->DropReferences.connect (route_connections, invalidator (*this), boost::bind (&LaunchPadPro::viewport_changed, this), this);
r->presentation_info().PropertyChanged.connect (route_connections, invalidator (*this), boost::bind (&LaunchPadPro::route_property_change, this, _1, n), this);
} else {
if (n == 0) {
/* not even the first stripable ... so do nothing */
}
}
}

View File

@@ -304,6 +304,9 @@ class LaunchPadPro : public MIDISurface
bool long_press_timeout (int pad_id);
bool _shift_pressed;
bool _clear_pressed;
bool _duplicate_pressed;
bool _session_pressed;
/* named pad methods */
void shift_press (Pad&);
@@ -316,7 +319,7 @@ class LaunchPadPro : public MIDISurface
void right_release (Pad&) {}
void right_long_press (Pad&) {}
void session_press (Pad&);
void session_release (Pad&) {}
void session_release (Pad&);
void session_long_press (Pad&) {}
void note_press (Pad&);
void note_release (Pad&) {}
@@ -397,7 +400,7 @@ class LaunchPadPro : public MIDISurface
void duplicate_release (Pad&) {}
void duplicate_long_press (Pad&) {}
void clear_press (Pad&);
void clear_release (Pad&) {}
void clear_release (Pad&);
void clear_long_press (Pad&) {}
void down_press (Pad&);
void down_release (Pad&) {}