Support for the iCON Qcon mcp device - sysex strings. Submitted by Michal Barhon.
authorBen Loftis <ben@harrisonconsoles.com>
Thu, 1 Feb 2018 20:39:17 +0000 (14:39 -0600)
committerBen Loftis <ben@harrisonconsoles.com>
Thu, 1 Feb 2018 20:39:59 +0000 (14:39 -0600)
libs/surfaces/mackie/device_info.cc [changed mode: 0644->0755]
libs/surfaces/mackie/device_info.h [changed mode: 0644->0755]
libs/surfaces/mackie/mackie_control_protocol.cc [changed mode: 0644->0755]
libs/surfaces/mackie/mackie_control_protocol.h [changed mode: 0644->0755]
libs/surfaces/mackie/surface.cc [changed mode: 0644->0755]

old mode 100644 (file)
new mode 100755 (executable)
index 979be6b..e5a54fd
@@ -56,6 +56,7 @@ DeviceInfo::DeviceInfo()
        , _uses_logic_control_buttons (false)
        , _uses_ipmidi (false)
        , _no_handshake (false)
+       , _is_qcon(false)
        , _has_meters (true)
        , _has_separate_meters (false)
        , _device_type (MCU)
@@ -320,6 +321,12 @@ DeviceInfo::set_state (const XMLNode& node, int /* version */)
                _has_meters = true;
        }
 
+       if ((child = node.child ("IsQCon")) != 0) {
+               child->get_property ("value", _is_qcon);
+       } else {
+               _is_qcon = false;
+       }
+
        if ((child = node.child ("HasSeparateMeters")) != 0) {
                child->get_property ("value", _has_separate_meters);
        } else {
@@ -456,6 +463,12 @@ DeviceInfo::no_handshake () const
        return _no_handshake;
 }
 
+bool
+DeviceInfo::is_qcon () const
+{
+       return _is_qcon;
+}
+
 bool
 DeviceInfo::has_touch_sense_faders () const
 {
old mode 100644 (file)
new mode 100755 (executable)
index 2aaa710..c709bc9
@@ -80,6 +80,7 @@ class DeviceInfo
        bool has_touch_sense_faders() const;
        bool uses_ipmidi() const;
        bool no_handshake() const;
+       bool is_qcon() const;
        bool has_meters() const;
        bool has_separate_meters() const;
        const std::string& name() const;
@@ -109,6 +110,7 @@ class DeviceInfo
        bool     _uses_logic_control_buttons;
        bool     _uses_ipmidi;
        bool     _no_handshake;
+       bool     _is_qcon;
        bool     _has_meters;
        bool     _has_separate_meters;
        DeviceType _device_type;
old mode 100644 (file)
new mode 100755 (executable)
old mode 100644 (file)
new mode 100755 (executable)
index 68e918d..20786d7
@@ -364,7 +364,7 @@ class MackieControlProtocol
         void initialize ();
         int set_device_info (const std::string& device_name);
        void update_configuration_state ();
-
+       
        /* MIDI port connection management */
 
        PBD::ScopedConnection port_connection;
old mode 100644 (file)
new mode 100755 (executable)
index 079d057..7ed0c5c
@@ -84,6 +84,15 @@ static MidiByteArray mackie_sysex_hdr  (5, MIDI::sysex, 0x0, 0x0, 0x66, 0x14);
 // the device type
 static MidiByteArray mackie_sysex_hdr_xt  (5, MIDI::sysex, 0x0, 0x0, 0x66, 0x15);
 
+//QCON
+// The MCU sysex header for QCon Control surface
+static MidiByteArray mackie_sysex_hdr_qcon  (5, MIDI::sysex, 0x0, 0x0, 0x66, 0x14); 
+
+// The MCU sysex header for QCon Control - extender 
+// The extender differs from Mackie by 4th bit - it's same like for main control surface (for display)
+static MidiByteArray mackie_sysex_hdr_xt_qcon  (5, MIDI::sysex, 0x0, 0x0, 0x66, 0x14);
+
+
 static MidiByteArray empty_midi_byte_array;
 
 Surface::Surface (MackieControlProtocol& mcp, const std::string& device_name, uint32_t number, surface_type_t stype)
@@ -287,8 +296,18 @@ const MidiByteArray&
 Surface::sysex_hdr() const
 {
        switch  (_stype) {
-       case mcu: return mackie_sysex_hdr;
-       case ext: return mackie_sysex_hdr_xt;
+       case mcu: 
+               if (_mcp.device_info().is_qcon()) {
+                       return mackie_sysex_hdr_qcon;
+               } else {
+                       return mackie_sysex_hdr;
+               }
+       case ext:
+               if(_mcp.device_info().is_qcon()) {              
+                       return mackie_sysex_hdr_xt_qcon;
+               } else {
+                       return mackie_sysex_hdr_xt;
+               }
        }
        cout << "SurfacePort::sysex_hdr _port_type not known" << endl;
        return mackie_sysex_hdr;
@@ -682,9 +701,18 @@ Surface::handle_midi_sysex (MIDI::Parser &, MIDI::byte * raw_bytes, size_t count
         */
 
        if (_stype == mcu) {
-               mackie_sysex_hdr[4] = bytes[4];
+               if (_mcp.device_info().is_qcon()) {
+                       mackie_sysex_hdr_qcon[4] = bytes[4];
+               } else {
+                       mackie_sysex_hdr[4] = bytes[4]; 
+               }
+               
        } else {
-               mackie_sysex_hdr_xt[4] = bytes[4];
+               if (_mcp.device_info().is_qcon()) {
+                       mackie_sysex_hdr_xt_qcon[4] = bytes[4];
+               } else {
+                       mackie_sysex_hdr_xt[4] = bytes[4];
+               }
        }
 
        switch (bytes[5]) {