summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2017-04-14 13:57:14 +0200
committerRobin Gareus <robin@gareus.org>2017-04-14 19:56:42 +0200
commit43d9feabd31baaf47d5e0a1e3f1ff52be803346f (patch)
treef083946d25e8f2caa20e5ee0835a6358a09c9c61
parentd98f05d335e90563239f9ffac5185ac269be378d (diff)
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 ...
-rw-r--r--libs/surfaces/faderport8/actions.cc50
-rw-r--r--libs/surfaces/faderport8/faderport8.cc133
-rw-r--r--libs/surfaces/faderport8/faderport8.h4
-rw-r--r--libs/surfaces/faderport8/fp8_base.h1
-rw-r--r--libs/surfaces/faderport8/fp8_strip.cc84
-rw-r--r--libs/surfaces/faderport8/fp8_strip.h20
6 files changed, 234 insertions, 58 deletions
diff --git a/libs/surfaces/faderport8/actions.cc b/libs/surfaces/faderport8/actions.cc
index 949d19a958..536257ca38 100644
--- a/libs/surfaces/faderport8/actions.cc
+++ b/libs/surfaces/faderport8/actions.cc
@@ -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);
}
}
diff --git a/libs/surfaces/faderport8/faderport8.cc b/libs/surfaces/faderport8/faderport8.cc
index 424742aef0..5429ed29ea 100644
--- a/libs/surfaces/faderport8/faderport8.cc
+++ b/libs/surfaces/faderport8/faderport8.cc
@@ -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 ();
}
@@ -1467,6 +1514,49 @@ FaderPort8::move_selected_into_view ()
}
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)
{
int dt = page ? 8 : 1;
@@ -1495,6 +1585,9 @@ FaderPort8::bank_param (bool down, bool page)
spill_plugins ();
}
break;
+ case ModeSend:
+ assign_sends ();
+ break;
default:
break;
}
diff --git a/libs/surfaces/faderport8/faderport8.h b/libs/surfaces/faderport8/faderport8.h
index 64b5b4decc..d4ab0c7ccc 100644
--- a/libs/surfaces/faderport8/faderport8.h
+++ b/libs/surfaces/faderport8/faderport8.h
@@ -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 */
diff --git a/libs/surfaces/faderport8/fp8_base.h b/libs/surfaces/faderport8/fp8_base.h
index b0d5df4923..753440c70b 100644
--- a/libs/surfaces/faderport8/fp8_base.h
+++ b/libs/surfaces/faderport8/fp8_base.h
@@ -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
{
diff --git a/libs/surfaces/faderport8/fp8_strip.cc b/libs/surfaces/faderport8/fp8_strip.cc
index 68a9e7262b..e81054c218 100644
--- a/libs/surfaces/faderport8/fp8_strip.cc
+++ b/libs/surfaces/faderport8/fp8_strip.cc
@@ -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 ());
}
}
@@ -395,6 +410,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 ()
{
bool have_meter = false;
@@ -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;
}
diff --git a/libs/surfaces/faderport8/fp8_strip.h b/libs/surfaces/faderport8/fp8_strip.h
index fd6d7d10dd..999d807313 100644
--- a/libs/surfaces/faderport8/fp8_strip.h
+++ b/libs/surfaces/faderport8/fp8_strip.h
@@ -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);