Prepare for FaderPort16 (ctrl-protocol)
authorRobin Gareus <robin@gareus.org>
Tue, 12 Dec 2017 12:29:54 +0000 (13:29 +0100)
committerRobin Gareus <robin@gareus.org>
Tue, 12 Dec 2017 13:08:45 +0000 (14:08 +0100)
libs/surfaces/faderport8/faderport8.cc
libs/surfaces/faderport8/faderport8.h
libs/surfaces/faderport8/fp8_base.h
libs/surfaces/faderport8/fp8_strip.cc
libs/surfaces/faderport8/fp8_strip.h
libs/surfaces/faderport8/gui.cc

index 2e5292618376b867f2200c48ededb7bcb50d5496..bc48261c0acb6c8376c0652af67b924a6e90cdc6 100644 (file)
@@ -86,7 +86,11 @@ debug_2byte_msg (std::string const& msg, int b0, int b1)
 }
 
 FaderPort8::FaderPort8 (Session& s)
+#ifdef FADERPORT16
+       : ControlProtocol (s, _("PreSonus FaderPort16"))
+#else
        : ControlProtocol (s, _("PreSonus FaderPort8"))
+#endif
        , AbstractUI<FaderPort8Request> (name())
        , _connection_state (ConnectionState (0))
        , _device_active (false)
@@ -95,6 +99,7 @@ FaderPort8::FaderPort8 (Session& s)
        , _parameter_off (0)
        , _show_presets (false)
        , _showing_well_known (0)
+       , _timer_divider (0)
        , _blink_onoff (false)
        , _shift_lock (false)
        , _shift_pressed (0)
@@ -109,8 +114,13 @@ FaderPort8::FaderPort8 (Session& s)
        boost::shared_ptr<ARDOUR::Port> inp;
        boost::shared_ptr<ARDOUR::Port> outp;
 
+#ifdef FADERPORT16
        inp  = AudioEngine::instance()->register_input_port (DataType::MIDI, "FaderPort8 Recv", true);
        outp = AudioEngine::instance()->register_output_port (DataType::MIDI, "FaderPort8 Send", true);
+#else
+       inp  = AudioEngine::instance()->register_input_port (DataType::MIDI, "FaderPort16 Recv", true);
+       outp = AudioEngine::instance()->register_output_port (DataType::MIDI, "FaderPort16 Send", true);
+#endif
        _input_port = boost::dynamic_pointer_cast<AsyncMIDIPort>(inp);
        _output_port = boost::dynamic_pointer_cast<AsyncMIDIPort>(outp);
 
@@ -118,8 +128,13 @@ FaderPort8::FaderPort8 (Session& s)
                throw failed_constructor();
        }
 
+#ifdef FADERPORT16
        _input_bundle.reset (new ARDOUR::Bundle (_("FaderPort8 (Receive)"), true));
        _output_bundle.reset (new ARDOUR::Bundle (_("FaderPort8 (Send) "), false));
+#else
+       _input_bundle.reset (new ARDOUR::Bundle (_("FaderPort16 (Receive)"), true));
+       _output_bundle.reset (new ARDOUR::Bundle (_("FaderPort16 (Send) "), false));
+#endif
 
        _input_bundle->add_channel (
                inp->name(),
@@ -241,6 +256,14 @@ FaderPort8::periodic ()
                _musical_time.clear ();
        }
 
+#ifdef FADERPORT16
+       /* every second, send "running" */
+       if (++_timer_divider == 10) {
+               _timer_divider = 0;
+               tx_midi3 (0xa0, 0x00, 0x00);
+       }
+#endif
+
        /* update stripables */
        Periodic ();
        return true;
@@ -322,6 +345,7 @@ FaderPort8::connected ()
        _blink_onoff = false;
        _shift_lock = false;
        _shift_pressed = 0;
+       _timer_divider = 0;
 
        start_midi_handling ();
        _ctrls.initialize ();
@@ -553,13 +577,25 @@ void
 FaderPort8::controller_handler (MIDI::Parser &, MIDI::EventTwoBytes* tb)
 {
        debug_2byte_msg ("CC", tb->controller_number, tb->value);
-       // encoder
-       // val Bit 7 = direction, Bits 0-6 = number of steps
+       /* encoder
+        * FaderPort8:
+        *    val Bit 7 = direction, Bits 0-6 = number of steps
+        * FaderPort16:
+        *    val Bit 6 = direction, Bits 0-5 = number of steps
+        */
+#ifdef FADERPORT16
+       static const uint8_t dir_mask = 0x20;
+       static const uint8_t step_mask = 0x1f;
+#else
+       static const uint8_t dir_mask = 0x40;
+       static const uint8_t step_mask = 0x3f;
+#endif
+
        if (tb->controller_number == 0x3c) {
-               encoder_navigate (tb->value & 0x40 ? true : false, tb->value & 0x3f);
+               encoder_navigate (tb->value & dir_mask ? true : false, tb->value & step_mask);
        }
        if (tb->controller_number == 0x10) {
-               encoder_parameter (tb->value & 0x40 ? true : false, tb->value & 0x3f);
+               encoder_parameter (tb->value & dir_mask ? true : false, tb->value & step_mask);
        }
 }
 
@@ -569,7 +605,12 @@ FaderPort8::note_on_handler (MIDI::Parser &, MIDI::EventTwoBytes* tb)
        debug_2byte_msg ("ON", tb->note_number, tb->velocity);
 
        /* fader touch */
-       if (tb->note_number >= 0x68 && tb->note_number <= 0x6f) {
+#ifdef FaderPort16
+       static const uint8_t touch_id_uppper = 0x77;
+#else
+       static const uint8_t touch_id_uppper = 0x6f;
+#endif
+       if (tb->note_number >= 0x68 && tb->note_number <= touch_id_uppper) {
                _ctrls.midi_touch (tb->note_number - 0x68, tb->velocity);
                return;
        }
index 4058ea248b8d02e67c75d34e87b537b90c1f037c..30a3f10d18eef491932b74ebaca49aad197a05a5 100644 (file)
@@ -228,6 +228,8 @@ private:
        std::string const& timecode () const { return _timecode; }
        std::string const& musical_time () const { return _musical_time; }
 
+       int _timer_divider;
+
        bool show_meters () const { return _scribble_mode & 1; }
        bool show_panner () const { return _scribble_mode & 2; }
 
index f83b916738ea61854d31f824bc588664993eb826..70f77798947e30e0e6a417ab843c3e2dd46ab475 100644 (file)
@@ -127,7 +127,11 @@ private:
                d.push_back (0x00);
                d.push_back (0x01);
                d.push_back (0x06);
+#ifdef FADERPORT16
+               d.push_back (0x16);
+#else
                d.push_back (0x02);
+#endif
        }
 };
 
index be1122a03f8b8aadfde16f8b1d3e8518f0d9611c..0aa64e1cb9069f55a09e4e5f9fdc32e42a7e4ea6 100644 (file)
@@ -37,23 +37,49 @@ uint8_t /* static */
 FP8Strip::midi_ctrl_id (CtrlElement type, uint8_t id)
 {
        assert (id < N_STRIPS);
-       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;
+       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:
+                               return 0x50 + id;
+                       case BtnMute:
+                               return 0x78 + id;
+                       case BtnSelect:
+                               if (id == 0) { // strip 8
+                                       return 0x07;
+                               } else {
+                                       return 0x21 + 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;
index c301dad7ed4df747bef532567009f513fc4f27f1..c3fc749f9703a9d026df9df177e237a4b1378ecc 100644 (file)
 #include "fp8_base.h"
 #include "fp8_button.h"
 
-#define N_STRIPS 8
+#ifdef FADERPORT16
+# define N_STRIPS 16
+#else
+# define N_STRIPS 8
+#endif
 
 namespace ARDOUR {
        class Stripable;
index 3a620d3607f0090dcaf5ab7087f4e393086f6136..b9543d12c61d6f2b5d7afaa7fd968ef1d9ab6da3 100644 (file)
@@ -93,7 +93,11 @@ FP8GUI::FP8GUI (FaderPort8& p)
        table.set_homogeneous (false);
 
        std::string data_file_path;
+#ifdef FADERPORT16
+       string name = "faderport16-small.png";
+#else
        string name = "faderport8-small.png";
+#endif
        Searchpath spath(ARDOUR::ardour_data_search_path());
        spath.add_subdirectory_to_paths ("icons");
        find_file (spath, name, data_file_path);