push2: when playing pads, flash all pad LEDs for the same note number for the pressed pad
This commit is contained in:
parent
0add64d4ab
commit
cb340bf190
|
@ -793,24 +793,37 @@ Push2::handle_midi_note_on_message (MIDI::Parser& parser, MIDI::EventTwoBytes* e
|
|||
return;
|
||||
}
|
||||
|
||||
/* Pad */
|
||||
/* Pad illuminations */
|
||||
|
||||
NNPadMap::iterator pi = nn_pad_map.find (ev->note_number);
|
||||
NNPadMap::const_iterator pm = nn_pad_map.find (ev->note_number);
|
||||
|
||||
if (pi == nn_pad_map.end()) {
|
||||
if (pm == nn_pad_map.end()) {
|
||||
return;
|
||||
}
|
||||
|
||||
Pad* pad = pi->second;
|
||||
const Pad * const pad_pressed = pm->second;
|
||||
|
||||
if (pad->do_when_pressed == Pad::FlashOn) {
|
||||
pad->set_color (LED::White);
|
||||
pad->set_state (LED::OneShot24th);
|
||||
write (pad->state_msg());
|
||||
} else if (pad->do_when_pressed == Pad::FlashOff) {
|
||||
pad->set_color (LED::Black);
|
||||
pad->set_state (LED::OneShot24th);
|
||||
write (pad->state_msg());
|
||||
pair<FNPadMap::iterator,FNPadMap::iterator> pads_with_note = fn_pad_map.equal_range (pad_pressed->filtered);
|
||||
|
||||
if (pads_with_note.first == fn_pad_map.end()) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (FNPadMap::iterator pi = pads_with_note.first; pi != pads_with_note.second; ++pi) {
|
||||
Pad* pad = pi->second;
|
||||
|
||||
if (pad->do_when_pressed == Pad::FlashOn) {
|
||||
pad->set_color (LED::White);
|
||||
pad->set_state (LED::OneShot24th);
|
||||
write (pad->state_msg());
|
||||
} else if (pad->do_when_pressed == Pad::FlashOff) {
|
||||
/* XXX really need to pick a contrasting color from
|
||||
selection color here.
|
||||
*/
|
||||
pad->set_color (LED::Green);
|
||||
pad->set_state (LED::OneShot24th);
|
||||
write (pad->state_msg());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -827,22 +840,34 @@ Push2::handle_midi_note_off_message (MIDI::Parser&, MIDI::EventTwoBytes* ev)
|
|||
return;
|
||||
}
|
||||
|
||||
NNPadMap::iterator pi = nn_pad_map.find (ev->note_number);
|
||||
/* Pad illuminations */
|
||||
|
||||
if (pi == nn_pad_map.end()) {
|
||||
NNPadMap::const_iterator pm = nn_pad_map.find (ev->note_number);
|
||||
|
||||
if (pm == nn_pad_map.end()) {
|
||||
return;
|
||||
}
|
||||
|
||||
Pad* pad = pi->second;
|
||||
const Pad * const pad_pressed = pm->second;
|
||||
|
||||
if (pad->do_when_pressed == Pad::FlashOn) {
|
||||
pad->set_color (LED::Black);
|
||||
pad->set_state (LED::OneShot24th);
|
||||
write (pad->state_msg());
|
||||
} else if (pad->do_when_pressed == Pad::FlashOff) {
|
||||
pad->set_color (pad->perma_color);
|
||||
pad->set_state (LED::OneShot24th);
|
||||
write (pad->state_msg());
|
||||
pair<FNPadMap::iterator,FNPadMap::iterator> pads_with_note = fn_pad_map.equal_range (pad_pressed->filtered);
|
||||
|
||||
if (pads_with_note.first == fn_pad_map.end()) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (FNPadMap::iterator pi = pads_with_note.first; pi != pads_with_note.second; ++pi) {
|
||||
Pad* pad = pi->second;
|
||||
|
||||
if (pad->do_when_pressed == Pad::FlashOn) {
|
||||
pad->set_color (LED::Black);
|
||||
pad->set_state (LED::OneShot24th);
|
||||
write (pad->state_msg());
|
||||
} else if (pad->do_when_pressed == Pad::FlashOff) {
|
||||
pad->set_color (pad->perma_color);
|
||||
pad->set_state (LED::OneShot24th);
|
||||
write (pad->state_msg());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1298,10 +1323,13 @@ Push2::set_pad_scale (int root, int octave, MusicalMode::Type mode, bool inkey)
|
|||
}
|
||||
}
|
||||
|
||||
fn_pad_map.clear ();
|
||||
|
||||
if (inkey) {
|
||||
|
||||
vector<int>::iterator notei;
|
||||
int row_offset = 0;
|
||||
|
||||
for (int row = 0; row < 8; ++row) {
|
||||
|
||||
/* Ableton's grid layout wraps the available notes in the scale
|
||||
|
@ -1321,6 +1349,8 @@ Push2::set_pad_scale (int root, int octave, MusicalMode::Type mode, bool inkey)
|
|||
notenum = *notei;
|
||||
pad->filtered = notenum;
|
||||
|
||||
fn_pad_map.insert (make_pair (notenum, pad));
|
||||
|
||||
if ((notenum % 12) == original_root) {
|
||||
pad->set_color (selection_color);
|
||||
pad->perma_color = selection_color;
|
||||
|
@ -1358,6 +1388,8 @@ Push2::set_pad_scale (int root, int octave, MusicalMode::Type mode, bool inkey)
|
|||
|
||||
pad->filtered = root_start + (note - 36);
|
||||
|
||||
fn_pad_map.insert (make_pair (pad->filtered, pad));
|
||||
|
||||
if (mode_map.find (note) != mode_map.end()) {
|
||||
|
||||
if ((note % 12) == original_root) {
|
||||
|
|
|
@ -392,10 +392,17 @@ class Push2 : public ARDOUR::ControlProtocol
|
|||
void init_buttons (bool startup);
|
||||
void init_touch_strip ();
|
||||
|
||||
/* map of Pads by note number */
|
||||
/* map of Pads by note number (the "fixed" note number sent by the
|
||||
* hardware, not the note number generated if the pad is touched)
|
||||
*/
|
||||
typedef std::map<int,Pad*> NNPadMap;
|
||||
NNPadMap nn_pad_map;
|
||||
|
||||
/* map of Pads by note number they generate (their "filtered" value)
|
||||
*/
|
||||
typedef std::multimap<int,Pad*> FNPadMap;
|
||||
FNPadMap fn_pad_map;
|
||||
|
||||
void set_button_color (ButtonID, uint8_t color_index);
|
||||
void set_button_state (ButtonID, LED::State);
|
||||
void set_led_color (ButtonID, uint8_t color_index);
|
||||
|
|
Loading…
Reference in New Issue
Block a user