13
0

use modified add_shadow_port API(); make pads flash when pressed

This commit is contained in:
Paul Davis 2016-06-20 08:31:33 -04:00
parent be1dff4aaa
commit eb43344cf6
2 changed files with 78 additions and 2 deletions

View File

@ -145,7 +145,7 @@ Push2::open ()
_input_port = boost::dynamic_pointer_cast<AsyncMIDIPort>(_async_in).get();
_output_port = boost::dynamic_pointer_cast<AsyncMIDIPort>(_async_out).get();
boost::dynamic_pointer_cast<AsyncMIDIPort> (_async_in)->add_shadow_port (string_compose (_("%1 Pads"), X_("Push 2")));
boost::dynamic_pointer_cast<AsyncMIDIPort> (_async_in)->add_shadow_port (string_compose (_("%1 Pads"), X_("Push 2")), boost::bind (&Push2::pad_filter, this, _1, _2));
connect_to_parser ();
@ -247,6 +247,13 @@ Push2::init_buttons (bool startup)
}
}
for (NNPadMap::iterator pi = nn_pad_map.begin(); pi != nn_pad_map.end(); ++pi) {
Pad* pad = pi->second;
pad->set_color (LED::Black);
pad->set_state (LED::OneShot24th);
write (pad->state_msg());
}
}
bool
@ -726,10 +733,15 @@ Push2::handle_midi_controller_message (MIDI::Parser&, MIDI::EventTwoBytes* ev)
}
void
Push2::handle_midi_note_on_message (MIDI::Parser&, MIDI::EventTwoBytes* ev)
Push2::handle_midi_note_on_message (MIDI::Parser& parser, MIDI::EventTwoBytes* ev)
{
DEBUG_TRACE (DEBUG::Push2, string_compose ("Note On %1 (velocity %2)\n", (int) ev->note_number, (int) ev->velocity));
if (ev->velocity == 0) {
handle_midi_note_off_message (parser, ev);
return;
}
switch (ev->note_number) {
case 0:
strip_vpot_touch (0, ev->velocity > 64);
@ -776,12 +788,51 @@ Push2::handle_midi_note_on_message (MIDI::Parser&, MIDI::EventTwoBytes* ev)
}
break;
}
if (ev->note_number < 11) {
return;
}
/* Pad */
NNPadMap::iterator pi = nn_pad_map.find (ev->note_number);
if (pi == nn_pad_map.end()) {
return;
}
Pad* pad = pi->second;
pad->set_color (LED::White);
pad->set_state (LED::OneShot24th);
write (pad->state_msg());
}
void
Push2::handle_midi_note_off_message (MIDI::Parser&, MIDI::EventTwoBytes* ev)
{
DEBUG_TRACE (DEBUG::Push2, string_compose ("Note Off %1 (velocity %2)\n", (int) ev->note_number, (int) ev->velocity));
if (ev->note_number < 11) {
/* theoretically related to encoder touch start/end, but
* actually they send note on with two different velocity
* values (127 & 64).
*/
return;
}
NNPadMap::iterator pi = nn_pad_map.find (ev->note_number);
if (pi == nn_pad_map.end()) {
return;
}
Pad* pad = pi->second;
pad->set_color (LED::Black);
pad->set_state (LED::OneShot24th);
write (pad->state_msg());
}
void
@ -1370,3 +1421,25 @@ Push2::splash ()
splash_start = get_microseconds ();
blit_to_device_frame_buffer ();
}
bool
Push2::pad_filter (MidiBuffer& in, MidiBuffer& out) const
{
/* This filter is called asynchronously from a realtime process
context. It must use atomics to check state, and must not block.
*/
bool matched = false;
for (MidiBuffer::iterator ev = in.begin(); ev != in.end(); ++ev) {
if ((*ev).is_note_on() || (*ev).is_note_off()) {
/* encoder touch start/touch end use note 0-10 */
if ((*ev).note() > 10) {
out.push_back (*ev);
matched = true;
}
}
}
return matched;
}

View File

@ -53,6 +53,7 @@ namespace MIDI {
namespace ARDOUR {
class AsyncMIDIPort;
class Port;
class MidiBuffer;
}
namespace ArdourSurface {
@ -447,6 +448,8 @@ class Push2 : public ARDOUR::ControlProtocol
void stripable_property_change (PBD::PropertyChange const& what_changed, int which);
void switch_bank (uint32_t base);
bool pad_filter (ARDOUR::MidiBuffer& in, ARDOUR::MidiBuffer& out) const;
};