cont'd FP8 refinement & details

* Access pan-width via shift, press encoder to reset
* Add "touch-start" to encoder events
* Show plugin-param value-bar
* Sends & well-known ctrls: follow strip-selection
* map "select" to strip-selection in Sends-mode
* Fader group override (via shift)
* Prev/Next button tweaks.
* consistent enum naming ...
This commit is contained in:
Robin Gareus 2017-04-14 13:57:14 +02:00
parent d98f05d335
commit 43d9feabd3
6 changed files with 234 additions and 58 deletions

View file

@ -273,8 +273,10 @@ void
FaderPort8::button_prev_next (bool next)
{
switch (_ctrls.nav_mode()) {
case NavMaster:
case NavChannel:
select_prev_next (next);
break;
case NavMaster:
case NavScroll:
bank (!next, false);
break;
@ -283,13 +285,17 @@ FaderPort8::button_prev_next (bool next)
break;
case NavZoom:
if (next) {
StepTracksDown ();
VerticalZoomInSelected ();
} else {
StepTracksUp ();
VerticalZoomOutSelected ();
}
break;
case NavSection:
// TODO nudge
if (next) {
AccessAction ("Region", "nudge-forward");
} else {
AccessAction ("Region", "nudge-backward");
}
break;
case NavMarker:
if (next) {
@ -326,11 +332,15 @@ FaderPort8::button_encoder ()
ac = session->master_out()->gain_control ();
}
if (ac) {
if (!ac->touching ()) {
ac->start_touch (ac->session().transport_frame());
}
ac->set_value (ac->normal(), PBD::Controllable::NoGroup);
}
}
break;
case NavSection:
// TODO nudge
break;
case NavMarker:
{
@ -402,12 +412,19 @@ FaderPort8::encoder_navigate (bool neg, int steps)
if (ac) {
double v = ac->internal_to_interface (ac->get_value());
v = std::max (0.0, std::min (1.0, v + steps * (neg ? -.01 : .01)));
if (!ac->touching ()) {
ac->start_touch (ac->session().transport_frame());
}
ac->set_value (ac->interface_to_internal(v), PBD::Controllable::NoGroup);
}
}
break;
case NavSection:
// nudge event
if (neg) {
AccessAction ("Common", "nudge-playhead-backward");
} else {
AccessAction ("Common", "nudge-playhead-forward");
}
break;
}
}
@ -419,7 +436,23 @@ FaderPort8::button_parameter ()
switch (_ctrls.fader_mode()) {
case ModeTrack:
case ModePan:
// pan-width see FaderPort8::encoder_parameter()
{
boost::shared_ptr<Stripable> s = first_selected_stripable();
if (s) {
boost::shared_ptr<AutomationControl> ac;
if (shift_mod ()) {
ac = s->pan_width_control ();
} else {
ac = s->pan_azimuth_control ();
}
if (ac) {
if (!ac->touching ()) {
ac->start_touch (ac->session().transport_frame());
}
ac->set_value (ac->normal(), PBD::Controllable::UseGroup);
}
}
}
break;
case ModePlugins:
break;
@ -439,7 +472,7 @@ FaderPort8::encoder_parameter (bool neg, int steps)
boost::shared_ptr<Stripable> s = first_selected_stripable();
if (s) {
boost::shared_ptr<AutomationControl> ac;
if (_ctrls.button (FP8Controls::BtnParam).is_pressed ()) {
if (shift_mod ()) {
ac = s->pan_width_control ();
} else {
ac = s->pan_azimuth_control ();
@ -447,6 +480,9 @@ FaderPort8::encoder_parameter (bool neg, int steps)
if (ac) {
double v = ac->internal_to_interface (ac->get_value());
v = std::max (0.0, std::min (1.0, v + steps * (neg ? -.01 : .01)));
if (!ac->touching ()) {
ac->start_touch (ac->session().transport_frame());
}
ac->set_value (ac->interface_to_internal(v), PBD::Controllable::UseGroup);
}
}

View file

@ -493,7 +493,12 @@ FaderPort8::pitchbend_handler (MIDI::Parser &, uint8_t chan, MIDI::pitchbend_t p
{
debug_2byte_msg ("PB", chan, pb);
/* fader 0..16368 (0x3ff0 -- 1024 steps) */
_ctrls.midi_fader (chan, pb);
bool handled = _ctrls.midi_fader (chan, pb);
/* if Shift key is held while moving a fader (group override), don't lock shift. */
if (_shift_pressed && handled) {
_shift_connection.disconnect ();
_shift_lock = false;
}
}
void
@ -829,7 +834,7 @@ struct FP8SortByNewDisplayOrder
#ifdef MIXBUS
// this can happen with older MB sessions (no PresentationInfo::Mixbus flag)
if (cmp_a == cmp_a) {
if (cmp_a == cmp_b) {
return a->presentation_info().order() < b->presentation_info().order();
}
#endif
@ -902,12 +907,14 @@ FaderPort8::filter_stripables (StripableList& strips) const
/* Track/Pan mode: assign stripable to strips */
void
FaderPort8::assign_stripables ()
FaderPort8::assign_stripables (bool select_only)
{
StripableList strips;
filter_stripables (strips);
set_periodic_display_mode (FP8Strip::Stripables);
if (!select_only) {
set_periodic_display_mode (FP8Strip::Stripables);
}
int n_strips = strips.size();
_channel_off = std::min (_channel_off, n_strips - 8);
@ -930,7 +937,15 @@ FaderPort8::assign_stripables ()
(*s)->presentation_info ().PropertyChanged.connect (assigned_stripable_connections, MISSING_INVALIDATOR,
boost::bind (&FaderPort8::notify_stripable_property_changed, this, boost::weak_ptr<Stripable> (*s), _1), this);
_ctrls.strip(id).set_stripable (*s, _ctrls.fader_mode() == ModePan);
if (select_only) {
_ctrls.strip(id).set_text_line (3, (*s)->name (), true);
_ctrls.strip(id).select_button ().set_color ((*s)->presentation_info ().color());
/* update selection lights */
_ctrls.strip(id).select_button ().set_active ((*s)->is_selected ());
_ctrls.strip(id).select_button ().set_blinking (*s == first_selected_stripable ());
} else {
_ctrls.strip(id).set_stripable (*s, _ctrls.fader_mode() == ModePan);
}
boost::function<void ()> cb (boost::bind (&FaderPort8::select_strip, this, boost::weak_ptr<Stripable> (*s)));
_ctrls.strip(id).set_select_cb (cb);
@ -940,7 +955,7 @@ FaderPort8::assign_stripables ()
}
}
for (; id < 8; ++id) {
_ctrls.strip(id).unset_controllables();
_ctrls.strip(id).unset_controllables (select_only ? (FP8Strip::CTRL_SELECT | FP8Strip::CTRL_TEXT3) : FP8Strip::CTRL_ALL);
}
}
@ -964,7 +979,7 @@ FaderPort8::assign_processor_ctrls ()
--skip;
continue;
}
_ctrls.strip(id).unset_controllables (FP8Strip::CTRL_ALL & ~FP8Strip::CTRL_FADER & ~FP8Strip::CTRL_TEXT1);
_ctrls.strip(id).unset_controllables (FP8Strip::CTRL_ALL & ~FP8Strip::CTRL_FADER & ~FP8Strip::CTRL_TEXT0);
_ctrls.strip(id).set_fader_controllable ((*i).ac);
_ctrls.strip(id).set_text_line (0, (*i).name);
@ -1006,6 +1021,9 @@ FaderPort8::build_well_known_processor_ctrls (boost::shared_ptr<Stripable> s, bo
void
FaderPort8::select_plugin (int num)
{
// make sure drop_ctrl_connections() was called
assert (_proc_params.size() == 0 && _showing_well_known == 0);
boost::shared_ptr<Route> r = boost::dynamic_pointer_cast<Route> (first_selected_stripable());
if (!r) {
_ctrls.set_fader_mode (ModeTrack);
@ -1014,8 +1032,10 @@ FaderPort8::select_plugin (int num)
if (num < 0) {
build_well_known_processor_ctrls (r, num == -1);
assign_processor_ctrls ();
_showing_well_known = num;
return;
}
_showing_well_known = 0;
boost::shared_ptr<Processor> proc = r->nth_plugin (num);
if (!proc) {
@ -1038,6 +1058,8 @@ FaderPort8::select_plugin (int num)
_proc_params.push_back (ProcessorCtrl (n, proc->automation_control (*i)));
}
// TODO: open plugin GUI if (_proc_params.size() > 0)
// display
assign_processor_ctrls ();
}
@ -1149,6 +1171,7 @@ FaderPort8::spill_plugins ()
_ctrls.strip(id).set_text_line (0, proc->name());
_ctrls.strip(id).set_text_line (1, pi->plugin()->maker());
_ctrls.strip(id).set_text_line (2, plugintype (pi->type()));
_ctrls.strip(id).set_text_line (3, "");
if (++id == spillwidth) {
break;
@ -1170,6 +1193,7 @@ FaderPort8::spill_plugins ()
_ctrls.strip(id).set_text_line (0, "Comp");
_ctrls.strip(id).set_text_line (1, "Built-In");
_ctrls.strip(id).set_text_line (2, "--");
_ctrls.strip(id).set_text_line (3, "");
++id;
}
if (have_well_known_eq) {
@ -1183,6 +1207,7 @@ FaderPort8::spill_plugins ()
_ctrls.strip(id).set_text_line (0, "EQ");
_ctrls.strip(id).set_text_line (1, "Built-In");
_ctrls.strip(id).set_text_line (2, "--");
_ctrls.strip(id).set_text_line (3, "");
++id;
}
assert (id == 8);
@ -1209,7 +1234,7 @@ FaderPort8::assign_sends ()
drop_ctrl_connections ();
s->DropReferences.connect (processor_connections, MISSING_INVALIDATOR, boost::bind (&FP8Controls::set_fader_mode, &_ctrls, ModeTrack), this);
set_periodic_display_mode (FP8Strip::PluginParam);
set_periodic_display_mode (FP8Strip::SendDisplay);
_plugin_off = std::min (_plugin_off, n_sends - 8);
_plugin_off = std::max (0, _plugin_off);
@ -1226,10 +1251,11 @@ FaderPort8::assign_sends ()
break;
}
_ctrls.strip(id).unset_controllables (FP8Strip::CTRL_ALL & ~FP8Strip::CTRL_FADER & ~FP8Strip::CTRL_TEXT1);
_ctrls.strip(id).unset_controllables (FP8Strip::CTRL_ALL & ~FP8Strip::CTRL_FADER & ~FP8Strip::CTRL_TEXT0 & ~FP8Strip::CTRL_TEXT1 & ~FP8Strip::CTRL_TEXT3 & ~FP8Strip::CTRL_SELECT);
_ctrls.strip(id).set_fader_controllable (send);
_ctrls.strip(id).set_text_line (0, s->send_name (i));
//_ctrls.strip(id).set_mute_controllable (s->send_enable_controllable (i)); // XXX TODO MB assign -> select ?
_ctrls.strip(id).set_mute_controllable (s->send_enable_controllable (i));
_ctrls.strip(id).set_solo_controllable (s->master_send_enable_controllable ()); // XXX
if (++id == 8) {
break;
@ -1237,8 +1263,10 @@ FaderPort8::assign_sends ()
}
// clear remaining
for (; id < 8; ++id) {
_ctrls.strip(id).unset_controllables ();
_ctrls.strip(id).unset_controllables (FP8Strip::CTRL_ALL & ~FP8Strip::CTRL_TEXT3 & ~FP8Strip::CTRL_SELECT);
}
/* set select buttons */
assign_stripables (true);
}
void
@ -1285,6 +1313,7 @@ FaderPort8::drop_ctrl_connections ()
{
_proc_params.clear();
processor_connections.drop_connections ();
_showing_well_known = 0;
}
void
@ -1327,7 +1356,9 @@ FaderPort8::notify_stripable_added_or_removed ()
/* called by
* - DropReferences
* - session->RouteAdded
* - PresentationInfo::Change -> Properties::hidden
* - PresentationInfo::Change
* - Properties::hidden
* - Properties::order
*/
assign_strips (false);
}
@ -1340,7 +1371,7 @@ FaderPort8::select_strip (boost::weak_ptr<Stripable> ws)
if (!s) {
return;
}
if (_shift_pressed) {
if (shift_mod ()) {
if (s->is_selected ()) {
RemoveStripableFromSelection (s);
} else {
@ -1385,7 +1416,17 @@ FaderPort8::notify_stripable_property_changed (boost::weak_ptr<Stripable> ws, co
}
if (what_changed.contains (Properties::name)) {
_ctrls.strip(id).set_text_line (0, s->name());
switch (_ctrls.fader_mode ()) {
case ModeSend:
_ctrls.strip(id).set_text_line (0, s->name());
case ModeTrack:
case ModePan:
_ctrls.strip(id).set_text_line (3, s->name(), true);
break;
case ModePlugins:
assert (0);
break;
}
}
}
@ -1396,19 +1437,23 @@ FaderPort8::gui_track_selection_changed (/*ARDOUR::StripableNotificationListPtr*
switch (_ctrls.fader_mode ()) {
case ModePlugins:
if (_proc_params.size () > 0) {
; // TODO w/"well-known" -> re-assign to new strip ?!
} else {
notify_fader_mode_changed ();
if (_proc_params.size () > 0 && _showing_well_known < 0) {
/* w/well-known -> re-assign to new strip */
int wk = _showing_well_known;
drop_ctrl_connections ();
select_plugin (wk);
}
return;
case ModeSend:
notify_automation_mode_changed ();
_plugin_off = 0;
assign_sends ();
return;
default:
case ModeTrack:
case ModePan:
break;
}
/* update selection lights */
for (StripAssignmentMap::const_iterator i = _assigned_strips.begin(); i != _assigned_strips.end(); ++i) {
boost::shared_ptr<ARDOUR::Stripable> s = i->first;
uint8_t id = i->second;
@ -1417,6 +1462,7 @@ FaderPort8::gui_track_selection_changed (/*ARDOUR::StripableNotificationListPtr*
_ctrls.strip(id).select_button ().set_blinking (sel && s == first_selected_stripable ());
}
/* track automation-mode of primary selection */
boost::shared_ptr<Stripable> s = first_selected_stripable();
if (s) {
boost::shared_ptr<AutomationControl> ac;
@ -1429,6 +1475,7 @@ FaderPort8::gui_track_selection_changed (/*ARDOUR::StripableNotificationListPtr*
ac->alist()->automation_state_changed.connect (automation_state_connections, MISSING_INVALIDATOR, boost::bind (&FaderPort8::notify_automation_mode_changed, this), this);
}
}
/* set lights */
notify_automation_mode_changed ();
}
@ -1466,6 +1513,49 @@ FaderPort8::move_selected_into_view ()
assign_strips (false);
}
void
FaderPort8::select_prev_next (bool next)
{
StripableList strips;
filter_stripables (strips);
boost::shared_ptr<Stripable> selected = first_selected_stripable ();
if (!selected) {
if (strips.size() > 0) {
if (next) {
SetStripableSelection (strips.front ());
} else {
SetStripableSelection (strips.back ());
}
}
return;
}
bool found = false;
boost::shared_ptr<Stripable> toselect;
for (StripableList::const_iterator s = strips.begin(); s != strips.end(); ++s) {
if (*s == selected) {
if (!next) {
found = true;
break;
}
++s;
if (s != strips.end()) {
toselect = *s;
found = true;
}
break;
}
if (!next) {
toselect = *s;
}
}
if (found && toselect) {
SetStripableSelection (toselect);
}
}
void
FaderPort8::bank (bool down, bool page)
{
@ -1495,6 +1585,9 @@ FaderPort8::bank_param (bool down, bool page)
spill_plugins ();
}
break;
case ModeSend:
assign_sends ();
break;
default:
break;
}

View file

@ -136,12 +136,13 @@ private:
void notify_stripable_added_or_removed ();
void notify_fader_mode_changed ();
void filter_stripables (ARDOUR::StripableList& strips) const;
void assign_stripables ();
void assign_stripables (bool select_only = false);
void set_periodic_display_mode (FP8Strip::DisplayMode);
void assign_strips (bool reset_bank);
void bank (bool down, bool page);
void move_selected_into_view ();
void select_prev_next (bool next);
void assign_sends ();
void spill_plugins ();
@ -189,6 +190,7 @@ private:
boost::shared_ptr<ARDOUR::AutomationControl> ac;
};
std::list <ProcessorCtrl> _proc_params;
int _showing_well_known;
/* **************************************************************************/
/* periodic updates, parameter poll */

View file

@ -38,6 +38,7 @@ public:
virtual size_t tx_midi (std::vector<uint8_t> const&) const = 0;
virtual std::string const& timecode () const = 0;
virtual bool shift_mod () const = 0;
size_t tx_midi2 (uint8_t sb, uint8_t d1) const
{

View file

@ -49,7 +49,7 @@ FP8Strip::FP8Strip (FP8Base& b, uint8_t id)
assert (id < 8);
_last_fader = 65535;
_last_meter = _last_redux = _last_panpos = 0xff;
_last_meter = _last_redux = _last_barpos = 0xff;
_mute.StateChange.connect_same_thread (_button_connections, boost::bind (&FP8Strip::set_mute, this, _1));
_solo.StateChange.connect_same_thread (_button_connections, boost::bind (&FP8Strip::set_solo, this, _1));
@ -91,7 +91,7 @@ FP8Strip::initialize ()
/* clear cached values */
_last_fader = 65535;
_last_meter = _last_redux = _last_panpos = 0xff;
_last_meter = _last_redux = _last_barpos = 0xff;
select_button ().set_color (0xffffffff);
select_button ().set_active (false);
@ -166,7 +166,6 @@ FP8Strip::unset_controllables (int which)
set_rec_controllable (boost::shared_ptr<AutomationControl>());
}
if (which & CTRL_PAN) {
set_bar_mode (4); // off
set_pan_controllable (boost::shared_ptr<AutomationControl>());
}
if (which & CTRL_SELECT) {
@ -175,18 +174,19 @@ FP8Strip::unset_controllables (int which)
select_button ().set_active (false);
select_button ().set_blinking (false);
}
if (which & CTRL_TEXT1) {
if (which & CTRL_TEXT0) {
set_text_line (0x00, "");
}
if (which & CTRL_TEXT2) {
if (which & CTRL_TEXT1) {
set_text_line (0x01, "");
}
if (which & CTRL_TEXT3) {
if (which & CTRL_TEXT2) {
set_text_line (0x02, "");
}
if (which & CTRL_TEXT4) {
if (which & CTRL_TEXT3) {
set_text_line (0x03, "");
}
set_bar_mode (4); // Off
}
void
@ -252,7 +252,9 @@ FP8Strip::midi_touch (bool t)
return false;
}
if (t) {
ac->start_touch (ac->session().transport_frame());
if (!ac->touching ()) {
ac->start_touch (ac->session().transport_frame());
}
} else {
ac->stop_touch (true, ac->session().transport_frame());
}
@ -270,7 +272,10 @@ FP8Strip::midi_fader (float val)
if (!ac) {
return false;
}
ac->set_value (ac->interface_to_internal (val), PBD::Controllable::UseGroup);
if (!ac->touching ()) {
ac->start_touch (ac->session().transport_frame());
}
ac->set_value (ac->interface_to_internal (val), group_mode ());
return true;
}
@ -278,6 +283,16 @@ FP8Strip::midi_fader (float val)
* Actions from Controller, Update Model
*/
PBD::Controllable::GroupControlDisposition
FP8Strip::group_mode () const
{
if (_base.shift_mod ()) {
return PBD::Controllable::InverseGroup;
} else {
return PBD::Controllable::UseGroup;
}
}
void
FP8Strip::set_mute (bool on)
{
@ -285,7 +300,7 @@ FP8Strip::set_mute (bool on)
if (!_mute_ctrl->touching ()) {
_mute_ctrl->start_touch (_mute_ctrl->session().transport_frame());
}
_mute_ctrl->set_value (on ? 1.0 : 0.0, PBD::Controllable::UseGroup);
_mute_ctrl->set_value (on ? 1.0 : 0.0, group_mode ());
}
}
@ -296,7 +311,7 @@ FP8Strip::set_solo (bool on)
if (!_solo_ctrl->touching ()) {
_solo_ctrl->start_touch (_solo_ctrl->session().transport_frame());
}
_solo_ctrl->set_value (on ? 1.0 : 0.0, PBD::Controllable::UseGroup);
_solo_ctrl->set_value (on ? 1.0 : 0.0, group_mode ());
}
}
@ -305,7 +320,7 @@ FP8Strip::set_recarm ()
{
if (_rec_ctrl) {
const bool on = !recarm_button().is_active();
_rec_ctrl->set_value (on ? 1.0 : 0.0, PBD::Controllable::UseGroup);
_rec_ctrl->set_value (on ? 1.0 : 0.0, group_mode ());
}
}
@ -394,6 +409,15 @@ FP8Strip::periodic_update_fader ()
}
}
void
FP8Strip::set_periodic_display_mode (DisplayMode m) {
_displaymode = m;
if (_displaymode == SendDisplay) {
// need to change to 4 lines before calling set_text()
set_strip_mode (2); // 4 lines of small text
}
}
void
FP8Strip::periodic_update_meter ()
{
@ -434,6 +458,21 @@ FP8Strip::periodic_update_meter ()
}
if (_displaymode == PluginParam) {
if (_fader_ctrl) {
set_bar_mode (2); // Fill
set_text_line (0x01, value_as_string(_fader_ctrl->desc(), _fader_ctrl->get_value()));
float barpos = _fader_ctrl->internal_to_interface (_fader_ctrl->get_value());
int val = std::min (127.f, std::max (0.f, barpos * 128.f));
if (val != _last_barpos) {
_base.tx_midi3 (0xb0, 0x30 + _id, val & 0x7f);
_last_barpos = val;
}
} else {
set_bar_mode (4); // Off
set_text_line (0x01, "");
}
}
else if (_displaymode == SendDisplay) {
set_bar_mode (4); // Off
if (_fader_ctrl) {
set_text_line (0x01, value_as_string(_fader_ctrl->desc(), _fader_ctrl->get_value()));
@ -445,25 +484,28 @@ FP8Strip::periodic_update_meter ()
float panpos = _pan_ctrl->internal_to_interface (_pan_ctrl->get_value());
int val = std::min (127.f, std::max (0.f, panpos * 128.f));
set_bar_mode (1); // Bipolar
if (val != _last_panpos) {
if (val != _last_barpos) {
_base.tx_midi3 (0xb0, 0x30 + _id, val & 0x7f);
_last_panpos = val;
_last_barpos = val;
}
set_text_line (0x01, _pan_ctrl->get_user_string ());
} else {
set_bar_mode (4); // Off
}
if (have_meter && have_panner) {
set_strip_mode (5); // small meter mode
if (_displaymode == SendDisplay) {
set_strip_mode (2); // 4 lines of small text + value-bar
}
else if (have_meter && have_panner) {
set_strip_mode (5); // small meters + 3 lines of text (3rd is large) + value-bar
}
else if (have_meter) {
set_strip_mode (4); // big meter mode
set_strip_mode (4); // big meters + 3 lines of text (3rd line is large)
}
else if (have_panner) {
set_strip_mode (0); // 3 lines of text + value
set_strip_mode (0); // 3 lines of text (3rd line is large) + value-bar
} else {
set_strip_mode (0); // 3 lines of text + value
set_strip_mode (0); // 3 lines of text (3rd line is large) + value-bar
}
}
@ -489,13 +531,13 @@ FP8Strip::set_bar_mode (uint8_t bar_mode)
}
void
FP8Strip::set_text_line (uint8_t line, std::string const& txt)
FP8Strip::set_text_line (uint8_t line, std::string const& txt, bool inv)
{
assert (line < 4);
if (_last_line[line] == txt) {
return;
}
_base.tx_text (_id, line, 0x00, txt);
_base.tx_text (_id, line, inv ? 0x04 : 0x00, txt);
_last_line[line] = txt;
}

View file

@ -23,6 +23,7 @@
#include <boost/shared_ptr.hpp>
#include "pbd/signals.h"
#include "pbd/controllable.h"
#include "fp8_base.h"
#include "fp8_button.h"
@ -59,15 +60,14 @@ public:
Stripables,
PluginSelect, // no clock display
PluginParam, // param value
SendDisplay, // param value + select-bar
};
void set_periodic_display_mode (DisplayMode m) {
_displaymode = m;
}
void set_periodic_display_mode (DisplayMode m);
// convenience function to call all set_XXX_controllable
void set_stripable (boost::shared_ptr<ARDOUR::Stripable>, bool panmode);
void set_text_line (uint8_t, std::string const&);
void set_text_line (uint8_t, std::string const&, bool inv = false);
enum CtrlMask {
CTRL_FADER = 0x001,
@ -76,10 +76,10 @@ public:
CTRL_REC = 0x004,
CTRL_PAN = 0x008,
CTRL_SELECT = 0x010,
CTRL_TEXT1 = 0x100,
CTRL_TEXT2 = 0x200,
CTRL_TEXT3 = 0x400,
CTRL_TEXT4 = 0x800,
CTRL_TEXT0 = 0x100,
CTRL_TEXT1 = 0x200,
CTRL_TEXT2 = 0x400,
CTRL_TEXT3 = 0x800,
CTRL_TEXT = 0xf00,
CTRL_ALL = 0xfff,
@ -123,6 +123,8 @@ private:
boost::shared_ptr<ARDOUR::ReadOnlyControl> _redux_ctrl;
boost::function<void ()> _select_plugin_functor;
PBD::Controllable::GroupControlDisposition group_mode () const;
/* notifications, update view */
void notify_fader_changed ();
void notify_solo_changed ();
@ -146,7 +148,7 @@ private:
unsigned short _last_fader;
uint8_t _last_meter;
uint8_t _last_redux;
uint8_t _last_panpos;
uint8_t _last_barpos;
/* display */
void set_strip_mode (uint8_t, bool clear = false);