mirror of
https://github.com/Ardour/ardour.git
synced 2026-01-07 14:15:46 +01:00
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:
parent
d98f05d335
commit
43d9feabd3
6 changed files with 234 additions and 58 deletions
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
|
|
|||
|
|
@ -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
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue