13
0

turn on all buttons that be envisaged as useful in ardour (for now); add support for edit-range-from-playhead ops

This commit is contained in:
Paul Davis 2016-06-17 00:15:55 -04:00
parent 3438003566
commit 98335084c7
3 changed files with 92 additions and 23 deletions

View File

@ -61,3 +61,35 @@ Push2::button_solo ()
{
cancel_all_solo ();
}
void
Push2::button_new ()
{
access_action ("Editor/start-range-from-playhead");
id_button_map[New]->set_color (LED::White);
id_button_map[New]->set_state (LED::NoTransition);
write (id_button_map[New]->state_msg());
/* blink the button for the other half of this operation */
id_button_map[FixedLength]->set_color (LED::White);
id_button_map[FixedLength]->set_state (LED::Blinking4th);
write (id_button_map[FixedLength]->state_msg());
}
void
Push2::button_fixed_length ()
{
access_action ("Editor/finish-range-from-playhead");
/* turn off both buttons for this operation */
id_button_map[New]->set_color (LED::Black);
id_button_map[New]->set_state (LED::NoTransition);
write (id_button_map[New]->state_msg());
id_button_map[FixedLength]->set_color (LED::Black);
id_button_map[FixedLength]->set_state (LED::NoTransition);
write (id_button_map[FixedLength]->state_msg());
}

View File

@ -82,11 +82,12 @@ Push2::Push2 (ARDOUR::Session& s)
mid_layout[n]->set_text (string_compose ("Inst %1", n));
}
build_maps ();
if (open ()) {
throw failed_constructor ();
}
build_maps ();
}
Push2::~Push2 ()
@ -166,6 +167,23 @@ Push2::close ()
return 0;
}
void
Push2::init_buttons ()
{
ButtonID buttons[] = { Mute, Solo, Master, Up, Right, Left, Down, Note, Session, Mix, AddTrack, Delete, Undo,
Metronome, Shift, Select, Play, RecordEnable, Automate, Repeat, Note, Session, DoubleLoop,
Quantize, Duplicate,
};
for (size_t n = 0; n < sizeof (buttons) / sizeof (buttons[0]); ++n) {
Button* b = id_button_map[buttons[n]];
b->set_color (LED::White);
b->set_state (LED::OneShot24th);
write (b->state_msg());
}
}
bool
Push2::probe ()
{
@ -325,7 +343,7 @@ Push2::redraw ()
context->move_to (650, 25);
tc_clock_layout->update_from_cairo_context (context);
tc_clock_layout->show_in_cairo_context (context);
context->move_to (650, 60);
context->move_to (650, 60);
bbt_clock_layout->update_from_cairo_context (context);
bbt_clock_layout->show_in_cairo_context (context);
@ -423,6 +441,8 @@ Push2::set_active (bool yn)
periodic_connection = periodic_timeout->connect (sigc::mem_fun (*this, &Push2::periodic));
periodic_timeout->attach (main_loop()->get_context());
init_buttons ();
} else {
stop ();
@ -635,6 +655,7 @@ Push2::build_maps ()
MAKE_COLOR_BUTTON (Lower5, 25);
MAKE_COLOR_BUTTON (Lower6, 26);
MAKE_COLOR_BUTTON (Lower7, 27);
MAKE_COLOR_BUTTON (Master, 28);
MAKE_COLOR_BUTTON (Mute, 60);
MAKE_COLOR_BUTTON_PRESS (Solo, 61, &Push2::button_solo);
MAKE_COLOR_BUTTON (Stop, 29);
@ -674,8 +695,8 @@ Push2::build_maps ()
MAKE_WHITE_BUTTON (DoubleLoop, 117);
MAKE_WHITE_BUTTON (Quantize, 116);
MAKE_WHITE_BUTTON (Duplicate, 88);
MAKE_WHITE_BUTTON (New, 87);
MAKE_WHITE_BUTTON (FixedLength, 90);
MAKE_WHITE_BUTTON_PRESS (New, 87, &Push2::button_new);
MAKE_WHITE_BUTTON_PRESS (FixedLength, 90, &Push2::button_fixed_length);
MAKE_WHITE_BUTTON_PRESS (Up, 46, &Push2::button_up);
MAKE_WHITE_BUTTON_PRESS (Right, 45, &Push2::button_right);
MAKE_WHITE_BUTTON_PRESS (Down, 47, &Push2::button_down);
@ -684,6 +705,9 @@ Push2::build_maps ()
MAKE_WHITE_BUTTON (Accent, 57);
MAKE_WHITE_BUTTON (Scale, 58);
MAKE_WHITE_BUTTON (Layout, 31);
MAKE_WHITE_BUTTON (Note, 50);
MAKE_WHITE_BUTTON (Session, 51);
MAKE_WHITE_BUTTON (Layout, 31);
MAKE_WHITE_BUTTON (OctaveUp, 55);
MAKE_WHITE_BUTTON (PageRight, 63);
MAKE_WHITE_BUTTON (OctaveDown, 54);
@ -739,16 +763,17 @@ Push2::notify_record_state_changed ()
return;
}
b->second->set_color (LED::Red);
switch (session->record_status ()) {
case Session::Disabled:
b->second->set_state (LED::Off);
b->second->set_color (LED::White);
b->second->set_state (LED::NoTransition);
break;
case Session::Enabled:
b->second->set_color (LED::Red);
b->second->set_state (LED::Blinking4th);
break;
case Session::Recording:
b->second->set_color (LED::Red);
b->second->set_state (LED::OneShot24th);
break;
}
@ -759,20 +784,25 @@ Push2::notify_record_state_changed ()
void
Push2::notify_transport_state_changed ()
{
IDButtonMap::iterator b = id_button_map.find (Play);
if (b == id_button_map.end()) {
return;
}
Button* b = id_button_map[Play];
if (session->transport_rolling()) {
b->second->set_state (LED::OneShot24th);
b->second->set_color (LED::Green);
b->set_state (LED::OneShot24th);
b->set_color (LED::Green);
} else {
b->second->set_state (LED::Off);
/* disable any blink on FixedLength from pending edit range op */
Button* fl = id_button_map[FixedLength];
fl->set_color (LED::Black);
fl->set_state (LED::NoTransition);
write (fl->state_msg());
b->set_color (LED::White);
b->set_state (LED::NoTransition);
}
write (b->second->state_msg());
write (b->state_msg());
}
void
@ -793,7 +823,8 @@ Push2::notify_parameter_changed (std::string param)
b->second->set_state (LED::Blinking4th);
b->second->set_color (LED::White);
} else {
b->second->set_state (LED::Off);
b->second->set_color (LED::White);
b->second->set_state (LED::NoTransition);
}
write (b->second->state_msg ());
}
@ -802,7 +833,7 @@ Push2::notify_parameter_changed (std::string param)
void
Push2::notify_solo_active_changed (bool yn)
{
IDButtonMap::iterator b = id_button_map.find (Solo);
IDButtonMap::iterator b = id_button_map.find (Solo);
if (b == id_button_map.end()) {
return;
@ -812,7 +843,8 @@ Push2::notify_solo_active_changed (bool yn)
b->second->set_state (LED::Blinking4th);
b->second->set_color (LED::Red);
} else {
b->second->set_state (LED::Off);
b->second->set_state (LED::NoTransition);
b->second->set_color (LED::White);
}
write (b->second->state_msg());

View File

@ -155,7 +155,7 @@ class Push2 : public ARDOUR::ControlProtocol
struct LED
{
enum State {
Off,
NoTransition,
OneShot24th,
OneShot16th,
OneShot8th,
@ -174,6 +174,7 @@ class Push2 : public ARDOUR::ControlProtocol
};
enum Colors {
Black = 0,
Red = 127,
Green = 126,
Blue = 125,
@ -182,7 +183,7 @@ class Push2 : public ARDOUR::ControlProtocol
White = 122
};
LED (uint8_t e) : _extra (e), _color_index (0), _state (Off) {}
LED (uint8_t e) : _extra (e), _color_index (0), _state (NoTransition) {}
virtual ~LED() {}
uint8_t extra () const { return _extra; }
@ -206,7 +207,7 @@ class Push2 : public ARDOUR::ControlProtocol
, x (xx)
, y (yy) {}
MidiByteArray state_msg () const { return MidiByteArray (3, 0x90|_state, _extra, (_state == Off) ? 0 : _color_index); }
MidiByteArray state_msg () const { return MidiByteArray (3, 0x90|_state, _extra, _color_index); }
int coord () const { return (y * 8) + x; }
int note_number() const { return extra(); }
@ -237,7 +238,7 @@ class Push2 : public ARDOUR::ControlProtocol
, release_method (release)
{}
MidiByteArray state_msg () const { return MidiByteArray (3, 0xb0|_state, _extra, (_state == Off) ? 0 : _color_index); }
MidiByteArray state_msg () const { return MidiByteArray (3, 0xb0|_state, _extra, _color_index); }
int controller_number() const { return extra(); }
ButtonID id;
@ -277,6 +278,8 @@ class Push2 : public ARDOUR::ControlProtocol
typedef std::map<ButtonID,Button*> IDButtonMap;
IDButtonMap id_button_map;
void init_buttons ();
/* map of Pads by note number */
typedef std::map<int,Pad*> NNPadMap;
NNPadMap nn_pad_map;
@ -332,6 +335,8 @@ class Push2 : public ARDOUR::ControlProtocol
void button_metronome ();
void button_repeat ();
void button_solo ();
void button_fixed_length ();
void button_new ();
/* widgets */