#include "fp8_strip.h"
using namespace ARDOUR;
-using namespace ArdourSurface;
-using namespace ArdourSurface::FP8Types;
+using namespace ArdourSurface::FP_NAMESPACE;
+using namespace ArdourSurface::FP_NAMESPACE::FP8Types;
+
+uint8_t /* static */
+FP8Strip::midi_ctrl_id (CtrlElement type, uint8_t id)
+{
+ assert (id < N_STRIPS);
+ if (id < 8) {
+ switch (type) {
+ case BtnSolo:
+ return 0x08 + id;
+ case BtnMute:
+ return 0x10 + id;
+ case BtnSelect:
+ return 0x18 + id;
+ case Fader:
+ return 0xe0 + id;
+ case Meter:
+ return 0xd0 + id;
+ case Redux:
+ return 0xd8 + id;
+ case BarVal:
+ return 0x30 + id;
+ case BarMode:
+ return 0x38 + id;
+ }
+ } else {
+ id -= 8;
+ switch (type) {
+ case BtnSolo:
+ switch (id) {
+ case 3:
+ return 0x58;
+ case 6:
+ return 0x59;
+ default:
+ return 0x50 + id;
+ }
+ case BtnMute:
+ return 0x78 + id;
+ case BtnSelect:
+ if (id == 0) { // strip 8
+ return 0x07;
+ } else {
+ return 0x20 + id;
+ }
+ case Fader:
+ return 0xe8 + id;
+ case Meter:
+ return 0xc0 + id;
+ case Redux:
+ return 0xc8 + id;
+ case BarVal:
+ return 0x40 + id;
+ case BarMode:
+ return 0x48 + id;
+ }
+ }
+ assert (0);
+ return 0;
+}
FP8Strip::FP8Strip (FP8Base& b, uint8_t id)
: _base (b)
, _id (id)
- , _solo (b, 0x08 + id)
- , _mute (b, 0x10 + id)
- , _selrec (b, 0x18 + id, true)
+ , _solo (b, midi_ctrl_id (BtnSolo, id))
+ , _mute (b, midi_ctrl_id (BtnMute, id))
+ , _selrec (b, midi_ctrl_id (BtnSelect, id), true)
, _touching (false)
, _strip_mode (0)
, _bar_mode (0)
, _displaymode (Stripables)
{
- assert (id < 8);
+ assert (id < N_STRIPS);
_last_fader = 65535;
_last_meter = _last_redux = _last_barpos = 0xff;
set_bar_mode (4); // off
- _base.tx_midi2 (0xd0 + _id, 0); // reset meter
- _base.tx_midi2 (0xd8 + _id, 0); // reset redux
+ _base.tx_midi2 (midi_ctrl_id (Meter, _id), 0); // reset meter
+ _base.tx_midi2 (midi_ctrl_id (Redux, _id), 0); // reset redux
- _base.tx_midi3 (0xe0 + _id, 0, 0); // fader
+ _base.tx_midi3 (midi_ctrl_id (Fader, _id), 0, 0); // fader
/* clear cached values */
_last_fader = 65535;
set_select_controllable (boost::shared_ptr<AutomationControl>());
select_button ().set_active (s->is_selected ());
- select_button ().set_color (s->presentation_info ().color());
+
+ set_select_button_color (s->presentation_info ().color());
//select_button ().set_blinking (false);
_stripable_name = s->name ();
return false;
}
if (t) {
- if (!ac->touching ()) {
- ac->start_touch (ac->session().transport_frame());
- }
+ ac->start_touch (ac->session().transport_sample());
} else {
- ac->stop_touch (ac->session().transport_frame());
+ ac->stop_touch (ac->session().transport_sample());
}
return true;
}
if (!ac) {
return false;
}
- if (ac->automation_state() == Touch && !ac->touching ()) {
- ac->start_touch (ac->session().transport_frame());
- }
+ ac->start_touch (ac->session().transport_sample());
ac->set_value (ac->interface_to_internal (val), group_mode ());
return true;
}
if (!_mute_ctrl) {
return;
}
- if (_mute_ctrl->automation_state() == Touch && !_mute_ctrl->touching ()) {
- _mute_ctrl->start_touch (_mute_ctrl->session().transport_frame());
- }
+ _mute_ctrl->start_touch (_mute_ctrl->session().transport_sample());
_mute_ctrl->set_value (on ? 1.0 : 0.0, group_mode ());
}
if (!_solo_ctrl) {
return;
}
- if (_solo_ctrl->automation_state() == Touch && !_solo_ctrl->touching ()) {
- _solo_ctrl->start_touch (_solo_ctrl->session().transport_frame());
- }
+ _solo_ctrl->start_touch (_solo_ctrl->session().transport_sample());
_solo_ctrl->set_value (on ? 1.0 : 0.0, group_mode ());
}
assert (!_x_select_ctrl);
_select_plugin_functor ();
} else if (_x_select_ctrl) {
- if (_x_select_ctrl->automation_state() == Touch && !_x_select_ctrl->touching ()) {
- _x_select_ctrl->start_touch (_x_select_ctrl->session().transport_frame());
- }
+ _x_select_ctrl->start_touch (_x_select_ctrl->session().transport_sample());
const bool on = !select_button ().is_active();
_x_select_ctrl->set_value (on ? 1.0 : 0.0, group_mode ());
}
return;
}
_last_fader = mv;
- _base.tx_midi3 (0xe0 + _id, (mv & 0x7f), (mv >> 7) & 0x7f);
+ _base.tx_midi3 (midi_ctrl_id (Fader, _id), (mv & 0x7f), (mv >> 7) & 0x7f);
}
void
// TODO: deflect meter
int val = std::min (127.f, std::max (0.f, 2.f * dB + 127.f));
if (val != _last_meter || val > 0) {
- _base.tx_midi2 (0xd0 + _id, val & 0x7f); // falls off automatically
+ _base.tx_midi2 (midi_ctrl_id (Meter, _id), val & 0x7f); // falls off automatically
_last_meter = val;
}
} else if (show_meters) {
if (0 != _last_meter) {
- _base.tx_midi2 (0xd0 + _id, 0);
+ _base.tx_midi2 (midi_ctrl_id (Meter, _id), 0);
_last_meter = 0;
}
}
// TODO: deflect redux
int val = std::min (127.f, std::max (0.f, rx));
if (val != _last_redux) {
- _base.tx_midi2 (0xd8 + _id, val & 0x7f);
+ _base.tx_midi2 (midi_ctrl_id (Redux, _id), val & 0x7f);
_last_redux = val;
}
} else if (show_meters) {
if (0 != _last_redux) {
- _base.tx_midi2 (0xd8 + _id, 0);
+ _base.tx_midi2 (midi_ctrl_id (Redux, _id), 0);
_last_redux = 0;
}
}
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);
+ _base.tx_midi3 (0xb0, midi_ctrl_id (BarVal, _id), val & 0x7f);
_last_barpos = val;
}
} else {
int val = std::min (127.f, std::max (0.f, panpos * 128.f));
set_bar_mode (have_panner ? 1 : 4); // Bipolar or Off
if (val != _last_barpos && have_panner) {
- _base.tx_midi3 (0xb0, 0x30 + _id, val & 0x7f);
+ _base.tx_midi3 (0xb0, midi_ctrl_id (BarVal, _id), val & 0x7f);
_last_barpos = val;
}
if (_base.twolinetext ()) {
set_strip_mode (5); // small meters + 3 lines of text (3rd is large) + value-bar
}
else if (have_meter) {
- set_strip_mode (4); // big meters + 3 lines of text (3rd line is large)
+ /* we cannot use "big meters" mode 4, since that implies
+ * 2 "Large" (4char) text lines, followed by a HUGE 2 char line
+ * and hides timecode-clock */
+ set_strip_mode (5);
}
else if (have_panner) {
set_strip_mode (0); // 3 lines of text (3rd line is large + long) + value-bar
}
if (bar_mode == 4) {
- _base.tx_midi3 (0xb0, 0x30 + _id, 0);
+ _base.tx_midi3 (0xb0, midi_ctrl_id (BarVal, _id), 0);
_last_barpos = 0xff;
}
_bar_mode = bar_mode;
- _base.tx_midi3 (0xb0, 0x38 + _id, bar_mode);
+ _base.tx_midi3 (0xb0, midi_ctrl_id (BarMode, _id), bar_mode);
}
void
FP8Strip::periodic ()
{
periodic_update_fader ();
+#ifndef FADERPORT2
periodic_update_meter ();
if (_displaymode != PluginSelect && _displaymode != PluginParam) {
periodic_update_timecode (_base.clock_mode ());
}
+#endif
}