Forum Rule: Always post complete source code & details to reproduce any issue!
Page 2 of 3 FirstFirst 1 2 3 LastLast
Results 26 to 50 of 58

Thread: Virtual Midi Cables - 8 ports OSX and PC

  1. #26
    Senior Member PaulStoffregen's Avatar
    Join Date
    Nov 2012
    Posts
    18,655
    I put a similar define in the code, MIDI_NUM_CABLES, which can have any values from 1 to 16.

    But to keep things simple, I really want to offer only 1 or (maybe) 2 options in the Tools > USB Type menu. Should it be 8 cables? Or 12? Or all 16? Or maybe 2, 3, or 4 on Teensy LC?

    One thing to keep in mind, which I currently have as only a "TODO" comment in the code, is what happens if SysEx messages arrive simultaneously and incrementally on multiple cables. With only a single SysEx buffer, they're going to become hopelessly intermingled.

  2. #27
    Senior Member
    Join Date
    Apr 2017
    Posts
    115
    Quote Originally Posted by PaulStoffregen View Post
    I've already committed the new code on github.

    https://github.com/PaulStoffregen/co...72da6cc9bcfee7

    It's slightly different, but the same general idea. I added an extra optional parameter to the send functions for the cable number, rather than setMidiCable(). I made this decision in anticipation of a future event-driven (via EventResponder) version of usbMIDI and USBHost_t36's MIDI.

    I'm also updating the usbMIDI functions to closely match the Arduino MIDI library version 4.3.1 (latest version).

    My plan is to publish 1.41-beta3 within a few days, with MIDIx8 in the Tools > USB Type menu, so everyone can easily use it. Could really use some help testing...
    Perhaps you can add another menu to select the number of midi ports instead of separate USB Types, if thatís a thing that can easily be done.

  3. #28
    Junior Member
    Join Date
    Sep 2015
    Location
    London
    Posts
    8
    My vote's for an extra menu to specify the number of ports, or if that's not an option, then 1,8,16 ports.

    Thanks for the heads up wrt to the single buffer for SysEx.

    I'll post any testing results, but not expecting to move onto midi stuff for a few weeks....

  4. #29
    Senior Member
    Join Date
    Jan 2017
    Location
    Maastricht
    Posts
    122
    Quote Originally Posted by PaulStoffregen View Post
    I put a similar define in the code, MIDI_NUM_CABLES, which can have any values from 1 to 16.

    But to keep things simple, I really want to offer only 1 or (maybe) 2 options in the Tools > USB Type menu. Should it be 8 cables? Or 12? Or all 16? Or maybe 2, 3, or 4 on Teensy LC?

    One thing to keep in mind, which I currently have as only a "TODO" comment in the code, is what happens if SysEx messages arrive simultaneously and incrementally on multiple cables. With only a single SysEx buffer, they're going to become hopelessly intermingled.
    Maybe the options 1,4,8 and 16? There are use cases for two cables but having two additional cables shouldn't be a problem.

    Thanks for mentioning the issue with the single sysEx buffer. This will become a problem when I get to part two of my project, controlling hardware synths.
    Currently the DAW controller uses two cables and extensive sysEx communication but these are all short, less than 255 bytes, and complete. For controlling hardware synths the goal is to retrieve the settings from the synths using a program dump request, this will result in the synth responding with large sysEx messages that will have to be processed in chunks.

    Related to to sysEx buffer: Do you intend to change the max sysEx length? Or leave it at the current length of 60 bytes? I changed the value to 255 bytes to be able to receive the DAW sysEx messages in one chunk.

    I hope to have my controller hardware fully functional by the end of the week and I'd be happy to test the new code. Perhaps I can also be of assistance providing some examples and/or documentation.

    Kind regards,

    Gerrit

  5. #30
    Senior Member PaulStoffregen's Avatar
    Join Date
    Nov 2012
    Posts
    18,655
    Adding another menu is possible. But just because you can do a thing does not necessarily mean you should. I believe in github's zen "anything added dilutes everything else" (at least when it comes to GUIs). We already have more additions to the Tools menu than any other Arduino compatible board. I'm reluctant to add another one just for this.

    I'm leaning towards offering 1, 4 and all 16. Is there really a need for 8 if we have 16?

    Teensy LC would probably get the option for 4 in the menu, but not 16 due to the large sysex buffer memory needed.

    Quote Originally Posted by Gerrit View Post
    Related to to sysEx buffer: Do you intend to change the max sysEx length? Or leave it at the current length of 60 bytes? I changed the value to 255 bytes to be able to receive the DAW sysEx messages in one chunk.
    I recently (after 1.41-beta2, at this moment only on github) changed it to this:

    Code:
    // maximum sysex length we can receive
    #if defined(__MKL26Z64__) || defined(__MK20DX128__)
    #define USB_MIDI_SYSEX_MAX  60
    #else
    #define USB_MIDI_SYSEX_MAX 290
    #endif
    This isn't necessarily a final decision. I'm looking for feedback on what size offers convenience versus wasting memory that virtually nobody would ever use. I see the MIDI 4.3.1 library is defaulting to 128 bytes.
    Last edited by PaulStoffregen; 01-08-2018 at 10:43 AM.

  6. #31
    Senior Member
    Join Date
    Jan 2017
    Location
    Maastricht
    Posts
    122
    1, 4 and 16 should cover it. Indeed, come to think of it there's no need for the 8 cable option.

    The MIDI default of 128 bytes seems like a good choice. This is sufficient for emulating control surfaces like the Mackie control, Logic Control, HUI etc. as the maximum sysEx length is 119bytes. The Mackie Control protocol is supported by most DAW software so it makes sense to be able to support this. Other use cases like processing program dumps from midi devices would involve large amounts of data requiring handling in chunks anyway.

    FYI: Here's a link to the Logic Control documentation (on the Mackie support portal) containing the full sysEx specification. The Mackie Control and MCU units are essentially the same hardware but as far as I know there's no publicly available documentation.

    Kind regards,

    Gerrit

  7. #32
    Senior Member
    Join Date
    Apr 2017
    Posts
    115
    Quote Originally Posted by Gerrit View Post
    1, 4 and 16 should cover it. Indeed, come to think of it there's no need for the 8 cable option.

    The MIDI default of 128 bytes seems like a good choice. This is sufficient for emulating control surfaces like the Mackie control, Logic Control, HUI etc. as the maximum sysEx length is 119bytes. The Mackie Control protocol is supported by most DAW software so it makes sense to be able to support this. Other use cases like processing program dumps from midi devices would involve large amounts of data requiring handling in chunks anyway.

    FYI: Here's a link to the Logic Control documentation (on the Mackie support portal) containing the full sysEx specification. The Mackie Control and MCU units are essentially the same hardware but as far as I know there's no publicly available documentation.

    Kind regards,

    Gerrit
    While not official someone has reverse engineered the protocol.

    MCU.pdf

    I donít know how thorough it is but based on looking at it it is basically the same thing as Logic Control just with a different product ID. So the Logic Control uses ID 10 for the main unit and MCU uses ID 14. On another note the ID is product specific and not protocol specific, at least I know on the MCU it is, whether itís in MCU mode or Logic Control mode itís still ID 14. This difference only matters in the SysEx messages as all other messages are the same that are standard midi messages.

    And while maybe not conventional I do have a need for varying numbers of midi ports but I can always add the options that arenít there whichever you decide to go with.

  8. #33
    Senior Member PaulStoffregen's Avatar
    Join Date
    Nov 2012
    Posts
    18,655
    This is what I'm planning for the Tools > USB Type menu in 1.41-beta3.

    Click image for larger version. 

Name:	sc.png 
Views:	45 
Size:	180.6 KB 
ID:	12568

  9. #34
    Senior Member
    Join Date
    Jan 2017
    Location
    Maastricht
    Posts
    122
    Quote Originally Posted by PaulStoffregen View Post
    This is what I'm planning for the Tools > USB Type menu in 1.41-beta3.
    Excellent, together with the other MIDI library additions the Teensy covers just about anything you could possibly do with MIDI.

    Kind regards,

    Gerrit

  10. #35
    Senior Member PaulStoffregen's Avatar
    Join Date
    Nov 2012
    Posts
    18,655
    I published a new beta installer with all the MIDI improvements.

    https://forum.pjrc.com/threads/49078...no-1-41-Beta-3

    Please give it a try and let me know how it works for you?

  11. #36
    Senior Member
    Join Date
    Jan 2017
    Location
    Maastricht
    Posts
    122
    Quote Originally Posted by PaulStoffregen View Post
    I published a new beta installer with all the MIDI improvements.

    https://forum.pjrc.com/threads/49078...no-1-41-Beta-3

    Please give it a try and let me know how it works for you?
    I tried the following:
    - install Arduino beta
    - install teensy beta
    - removed setMidiCable() from code and added extra parameter in call for the midi cable
    - selected USB type: MIDIx4

    Here's the code I'm working on: Zeus-DPC.ino

    The Teensy is recognised as a MIDI device with 4 ports by the OS X Audio MIDI setup and the basics seem to work. The problem is that there seems to be no sysex communication via the second port (cable). Logic Pro is sending device requests to all cables but the Teensy only responds on the first and not the second cable as it did before. Here's the relevant part in the code:
    Code:
    void handleSysEx(const byte* sysExData, uint16_t sysExSize, bool complete){
      uint8_t midiPort;
      boolean isMackieControlMessage = true;
      boolean isMackieControlXTMessage = true;
    
      midiPort = usbMIDI.getCable();
      switch (midiPort) {
        // Logic Control Main on Port 0
        case 0:
          // compare the first five bytes of the message to the sysExHeader to check if it is a Mackie control message
          for (int i=0;i<5;i++) {
            if (sysExData[i]!=sysExHeader[i]) {
              isMackieControlMessage = false;
            }
          }
          // handle mackie control message
          if (isMackieControlMessage) {
            boolean processMessage = true;
            // handle different message types
            switch (sysExData[5]) {
              // respond to device query
              case 0:
                usbMIDI.sendSysEx(18, sysExHostConnectionQuery,0);
                break;
              // respond to host connection reply with connection confirmation
              case 2:
                usbMIDI.sendSysEx(14, sysExHostConnectionConfirmation,0);
                break;
              // respond to firmware version request
              case 19:
                usbMIDI.sendSysEx(12, sysExVersionReply,0);
                break;
              // handle LCD display update
              case 18:
                // get message text for determination of message type
                for (int i=7;i<sysExSize-1;i++) {
                    messageText[i-7]= sysExData[i];
                  }
                // check for page message
                if (strncmp(pageMessageHeader,messageText,9)==0){
                  // ignore
                  processMessage=false;
                }
                // check for insert name message
                else if (strstr(messageText,insertMessageHeader)){
                  //ignore
                  processMessage=false;
                }
                if (processMessage){
                  //update lcdText with message text
                  for (int i=7;i<sysExSize-1;i++) {
                    lcdTextR[sysExData[6]+i-7]= sysExData[i];
                    }
                  //if the update starts at position 0 check if plugin page can be identified
                  if (sysExData[6]==0){
                    checkPlugin();
                  }
                  updateStart = int(float(sysExData[6])/7.0);
                  updateEnd = updateStart + int((float(sysExSize-8))/7.0);
                  // loop through text fields and write 7 characters, only update fields that need to be updated
                  for (int i=updateStart;i<=updateEnd;i++){
                    char text[8];
                    for (int j=0;j<7;j++){
                      text[j]=lcdTextR[7*i+j];
                    }
                  displayText(text,i);
                  }
                }
                break;
                // handle LED display update
              case 16:
                // update led display
                for (int i=7;i<sysExSize-1;i++) {
                  ledText[9-(sysExData[6]+i-7)]= sysExData[i];
                  }
                // null terminate string for 4D string object
                ledText[10]='\0';
                //displayL.WriteStr(23,ledText);
                break;
              case 97:
                //faders to minimum
                break;
              case 98:
                //all leds off
                break;
              case 99:
                //reboot in offline mode
                break;
              default: 
                // statements
              break;
            }
          }
          break;
        // Logic Control XT on Port 1
        case 1:
          // compare the first five bytes of the message to the sysExHeader to check if it is a Mackie control XT message
          for (int i=0;i<5;i++) {
            if (sysExData[i]!=sysExHeaderXT[i]) {
              isMackieControlXTMessage = false;
            }
           }
          // handle mackie control message
          if (isMackieControlXTMessage) {
            boolean processMessage = true;
            // handle different message types
            switch (sysExData[5]) {
              // respond to device query
              case 0:
                usbMIDI.sendSysEx(18, sysExHostConnectionQueryXT,1);
                break;
              // respond to host connection reply with connection confirmation
              case 2:
                usbMIDI.sendSysEx(14, sysExHostConnectionConfirmationXT,1);
                break;
              // respond to firmware version request
              case 19:
                usbMIDI.sendSysEx(12, sysExVersionReplyXT,1);
                break;
              // handle LCD display update
              case 18:
                // get message text for determination of message type
                for (int i=7;i<sysExSize-1;i++) {
                    messageText[i-7]= sysExData[i];
                  }
                // check for page message
                if (strncmp(pageMessageHeader,messageText,9)==0){
                  // ignore
                  processMessage=false;
                }
                // check for insert name message
                else if (strstr(messageText,insertMessageHeader)){
                  //ignore
                  processMessage=false;
                }
                if (processMessage){
                  //update lcdText with message text
                  for (int i=7;i<sysExSize-1;i++) {
                    lcdTextL[sysExData[6]+i-7]= sysExData[i];
                    }
                  //if the update starts at position 0 check if plugin page can be identified
                  if (sysExData[6]==0){
                    checkPlugin();
                  }
                  updateStart = int(float(sysExData[6])/7.0);
                  updateEnd = updateStart + int((float(sysExSize-8))/7.0);
                  // loop through text fields and write 7 characters, only update fields that need to be updated
                  for (int i=updateStart;i<=updateEnd;i++){
                    char text[8];
                    for (int j=0;j<7;j++){
                      text[j]=lcdTextL[7*i+j];
                    }
                  displayText(text,i);
                  }
                }
                break;
                // handle LED display update
              case 16:
                // no led display on XT unit
                break;
              case 97:
                //faders to minimum
                break;
              case 98:
                //all leds off
                break;
              case 99:
                //reboot in offline mode
                break;
              default: 
                // statements
              break;
            }
          }       
        break;
        // Synth control on Port 2
        case 2:
          // nothing yet
        break;
        default: 
          // ignore sysExData
        break;
      }
    }
    In the handler the getCable() is called to determine the cable for the incoming sysex. This was working with the library provided by Buzzbang. Is it supposed to be handled this way in the new library?
    Is the way the data is sent correct?
    Code:
    const byte sysExVersionReply[12]                = {0xF0,0x00,0x00,0x66,0x10,0x14,0x56,0x31,0x2E,0x30,0x32,0xF7};
    const byte sysExVersionReplyXT[12]                = {0xF0,0x00,0x00,0x66,0x11,0x14,0x56,0x31,0x2E,0x30,0x32,0xF7};
    .....
    usbMIDI.sendSysEx(12, sysExVersionReply,0);
    ....
    usbMIDI.sendSysEx(12, sysExVersionReplyXT,1);
    I tried removing the case statement and just reply on different cables based on the incoming device id but this doesn't work either. What am i missing? Probably something simple...


    Kind regards,

    Gerrit

  12. #37
    Senior Member
    Join Date
    Apr 2017
    Posts
    115
    Quote Originally Posted by Gerrit View Post
    I tried the following:
    - install Arduino beta
    - install teensy beta
    - removed setMidiCable() from code and added extra parameter in call for the midi cable
    - selected USB type: MIDIx4

    Here's the code I'm working on: Zeus-DPC.ino

    The Teensy is recognised as a MIDI device with 4 ports by the OS X Audio MIDI setup and the basics seem to work. The problem is that there seems to be no sysex communication via the second port (cable). Logic Pro is sending device requests to all cables but the Teensy only responds on the first and not the second cable as it did before. Here's the relevant part in the code:
    Code:
    void handleSysEx(const byte* sysExData, uint16_t sysExSize, bool complete){
      uint8_t midiPort;
      boolean isMackieControlMessage = true;
      boolean isMackieControlXTMessage = true;
    
      midiPort = usbMIDI.getCable();
      switch (midiPort) {
        // Logic Control Main on Port 0
        case 0:
          // compare the first five bytes of the message to the sysExHeader to check if it is a Mackie control message
          for (int i=0;i<5;i++) {
            if (sysExData[i]!=sysExHeader[i]) {
              isMackieControlMessage = false;
            }
          }
          // handle mackie control message
          if (isMackieControlMessage) {
            boolean processMessage = true;
            // handle different message types
            switch (sysExData[5]) {
              // respond to device query
              case 0:
                usbMIDI.sendSysEx(18, sysExHostConnectionQuery,0);
                break;
              // respond to host connection reply with connection confirmation
              case 2:
                usbMIDI.sendSysEx(14, sysExHostConnectionConfirmation,0);
                break;
              // respond to firmware version request
              case 19:
                usbMIDI.sendSysEx(12, sysExVersionReply,0);
                break;
              // handle LCD display update
              case 18:
                // get message text for determination of message type
                for (int i=7;i<sysExSize-1;i++) {
                    messageText[i-7]= sysExData[i];
                  }
                // check for page message
                if (strncmp(pageMessageHeader,messageText,9)==0){
                  // ignore
                  processMessage=false;
                }
                // check for insert name message
                else if (strstr(messageText,insertMessageHeader)){
                  //ignore
                  processMessage=false;
                }
                if (processMessage){
                  //update lcdText with message text
                  for (int i=7;i<sysExSize-1;i++) {
                    lcdTextR[sysExData[6]+i-7]= sysExData[i];
                    }
                  //if the update starts at position 0 check if plugin page can be identified
                  if (sysExData[6]==0){
                    checkPlugin();
                  }
                  updateStart = int(float(sysExData[6])/7.0);
                  updateEnd = updateStart + int((float(sysExSize-8))/7.0);
                  // loop through text fields and write 7 characters, only update fields that need to be updated
                  for (int i=updateStart;i<=updateEnd;i++){
                    char text[8];
                    for (int j=0;j<7;j++){
                      text[j]=lcdTextR[7*i+j];
                    }
                  displayText(text,i);
                  }
                }
                break;
                // handle LED display update
              case 16:
                // update led display
                for (int i=7;i<sysExSize-1;i++) {
                  ledText[9-(sysExData[6]+i-7)]= sysExData[i];
                  }
                // null terminate string for 4D string object
                ledText[10]='\0';
                //displayL.WriteStr(23,ledText);
                break;
              case 97:
                //faders to minimum
                break;
              case 98:
                //all leds off
                break;
              case 99:
                //reboot in offline mode
                break;
              default: 
                // statements
              break;
            }
          }
          break;
        // Logic Control XT on Port 1
        case 1:
          // compare the first five bytes of the message to the sysExHeader to check if it is a Mackie control XT message
          for (int i=0;i<5;i++) {
            if (sysExData[i]!=sysExHeaderXT[i]) {
              isMackieControlXTMessage = false;
            }
           }
          // handle mackie control message
          if (isMackieControlXTMessage) {
            boolean processMessage = true;
            // handle different message types
            switch (sysExData[5]) {
              // respond to device query
              case 0:
                usbMIDI.sendSysEx(18, sysExHostConnectionQueryXT,1);
                break;
              // respond to host connection reply with connection confirmation
              case 2:
                usbMIDI.sendSysEx(14, sysExHostConnectionConfirmationXT,1);
                break;
              // respond to firmware version request
              case 19:
                usbMIDI.sendSysEx(12, sysExVersionReplyXT,1);
                break;
              // handle LCD display update
              case 18:
                // get message text for determination of message type
                for (int i=7;i<sysExSize-1;i++) {
                    messageText[i-7]= sysExData[i];
                  }
                // check for page message
                if (strncmp(pageMessageHeader,messageText,9)==0){
                  // ignore
                  processMessage=false;
                }
                // check for insert name message
                else if (strstr(messageText,insertMessageHeader)){
                  //ignore
                  processMessage=false;
                }
                if (processMessage){
                  //update lcdText with message text
                  for (int i=7;i<sysExSize-1;i++) {
                    lcdTextL[sysExData[6]+i-7]= sysExData[i];
                    }
                  //if the update starts at position 0 check if plugin page can be identified
                  if (sysExData[6]==0){
                    checkPlugin();
                  }
                  updateStart = int(float(sysExData[6])/7.0);
                  updateEnd = updateStart + int((float(sysExSize-8))/7.0);
                  // loop through text fields and write 7 characters, only update fields that need to be updated
                  for (int i=updateStart;i<=updateEnd;i++){
                    char text[8];
                    for (int j=0;j<7;j++){
                      text[j]=lcdTextL[7*i+j];
                    }
                  displayText(text,i);
                  }
                }
                break;
                // handle LED display update
              case 16:
                // no led display on XT unit
                break;
              case 97:
                //faders to minimum
                break;
              case 98:
                //all leds off
                break;
              case 99:
                //reboot in offline mode
                break;
              default: 
                // statements
              break;
            }
          }       
        break;
        // Synth control on Port 2
        case 2:
          // nothing yet
        break;
        default: 
          // ignore sysExData
        break;
      }
    }
    In the handler the getCable() is called to determine the cable for the incoming sysex. This was working with the library provided by Buzzbang. Is it supposed to be handled this way in the new library?
    Is the way the data is sent correct?
    Code:
    const byte sysExVersionReply[12]                = {0xF0,0x00,0x00,0x66,0x10,0x14,0x56,0x31,0x2E,0x30,0x32,0xF7};
    const byte sysExVersionReplyXT[12]                = {0xF0,0x00,0x00,0x66,0x11,0x14,0x56,0x31,0x2E,0x30,0x32,0xF7};
    .....
    usbMIDI.sendSysEx(12, sysExVersionReply,0);
    ....
    usbMIDI.sendSysEx(12, sysExVersionReplyXT,1);
    I tried removing the case statement and just reply on different cables based on the incoming device id but this doesn't work either. What am i missing? Probably something simple...


    Kind regards,

    Gerrit
    Based on looking at this, you didn’t use the right format for the new SysEx messages.

    The SysEx message is formatted like this
    Code:
    sendSysEx(uint32_t length, const uint8_t *data, bool hasTerm=false, uint8_t cable=0)
    So you only have 3 out of the 4 terms filled in and since the last one has a default of 0 it’s always being sent to port 0 in your code. And since you have the start and stop terms in your SysEx arrays your going to want to have the 3rd term as true.

  13. #38
    Senior Member
    Join Date
    Jan 2017
    Location
    Maastricht
    Posts
    122
    Quote Originally Posted by vjmuzik View Post
    Based on looking at this, you didnít use the right format for the new SysEx messages.

    The SysEx message is formatted like this
    Code:
    sendSysEx(uint32_t length, const uint8_t *data, bool hasTerm=false, uint8_t cable=0)
    So you only have 3 out of the 4 terms filled in and since the last one has a default of 0 itís always being sent to port 0 in your code. And since you have the start and stop terms in your SysEx arrays your going to want to have the 3rd term as true.
    Thanks, I changed it:

    Code:
    usbMIDI.sendSysEx(12, sysExVersionReplyXT,true,1);
    The sending part seems to work now, if I let the base unit (id=10) answer via cable 1 Logic will detect the unit on port 2 as it should be. It still doesn't work though, it seems the message on the second cable is lost. Logic is sending the device queries within a couple of milliseconds (midi monitor capture):
    Code:
    16:35:34.838	To Port 1	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 10 00 F7
    16:35:34.838	To Port 2	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 10 00 F7
    16:35:34.839	To Port 1	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 11 00 F7
    16:35:34.840	To Port 2	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 11 00 F7
    If change the code to ignore the base unit, the XT unit (id=11) still isn't responding. I suspect there's some change in the way the sysex handler works that I missed.

    Kind regards,

    Gerrit

  14. #39
    Senior Member
    Join Date
    Apr 2017
    Posts
    115
    Quote Originally Posted by Gerrit View Post
    Thanks, I changed it:

    Code:
    usbMIDI.sendSysEx(12, sysExVersionReplyXT,true,1);
    The sending part seems to work now, if I let the base unit (id=10) answer via cable 1 Logic will detect the unit on port 2 as it should be. It still doesn't work though, it seems the message on the second cable is lost. Logic is sending the device queries within a couple of milliseconds (midi monitor capture):
    Code:
    16:35:34.838	To Port 1	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 10 00 F7
    16:35:34.838	To Port 2	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 10 00 F7
    16:35:34.839	To Port 1	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 11 00 F7
    16:35:34.840	To Port 2	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 11 00 F7
    If change the code to ignore the base unit, the XT unit (id=11) still isn't responding. I suspect there's some change in the way the sysex handler works that I missed.

    Kind regards,

    Gerrit
    If your main unit is on cable 1/port 2 is the XT on cable 0/port 1?

  15. #40
    Senior Member
    Join Date
    Apr 2017
    Posts
    115
    If the XT is on cable 2 it looks like Logic doesn’t detect it because it’s only sending queries on cable 0 & 1.

  16. #41
    Senior Member
    Join Date
    Jan 2017
    Location
    Maastricht
    Posts
    122
    Quote Originally Posted by vjmuzik View Post
    If the XT is on cable 2 it looks like Logic doesnít detect it because itís only sending queries on cable 0 & 1.
    No, for clarity I only copied part of the queries. Here's everything Logic sends to the Teensy when Logic is starting up:
    Code:
    17:01:36.617	To Port 1	SysEx		J L Cooper 5 bytes	F0 15 29 01 F7
    17:01:36.624	To Port 2	SysEx		J L Cooper 5 bytes	F0 15 29 01 F7
    17:01:36.624	To Port 3	SysEx		J L Cooper 5 bytes	F0 15 29 01 F7
    17:01:36.624	To Port 4	SysEx		J L Cooper 5 bytes	F0 15 29 01 F7
    17:01:36.628	To Port 1	SysEx		Universal Non-Real Time 6 bytes	F0 7E 00 06 01 F7
    17:01:36.629	To Port 2	SysEx		Universal Non-Real Time 6 bytes	F0 7E 00 06 01 F7
    17:01:36.629	To Port 3	SysEx		Universal Non-Real Time 6 bytes	F0 7E 00 06 01 F7
    17:01:36.630	To Port 4	SysEx		Universal Non-Real Time 6 bytes	F0 7E 00 06 01 F7
    17:01:36.630	To Port 1	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 10 00 F7
    17:01:36.630	To Port 2	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 10 00 F7
    17:01:36.631	To Port 3	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 10 00 F7
    17:01:36.631	To Port 4	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 10 00 F7
    17:01:36.631	To Port 1	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 11 00 F7
    17:01:36.631	To Port 2	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 11 00 F7
    17:01:36.632	To Port 3	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 11 00 F7
    17:01:36.632	To Port 4	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 11 00 F7
    17:01:36.632	To Port 1	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 17 00 F7
    17:01:36.632	To Port 1	SysEx		Unknown Manufacturer 8 bytes	F0 00 00 66 17 13 00 F7
    17:01:36.633	To Port 2	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 17 00 F7
    17:01:36.633	To Port 2	SysEx		Unknown Manufacturer 8 bytes	F0 00 00 66 17 13 00 F7
    17:01:36.633	To Port 3	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 17 00 F7
    17:01:36.633	To Port 3	SysEx		Unknown Manufacturer 8 bytes	F0 00 00 66 17 13 00 F7
    17:01:36.634	To Port 4	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 17 00 F7
    17:01:36.634	To Port 4	SysEx		Unknown Manufacturer 8 bytes	F0 00 00 66 17 13 00 F7
    17:01:36.634	To Port 1	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 14 00 F7
    17:01:36.634	To Port 1	SysEx		Unknown Manufacturer 8 bytes	F0 00 00 66 14 13 00 F7
    17:01:36.635	To Port 2	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 14 00 F7
    17:01:36.635	To Port 2	SysEx		Unknown Manufacturer 8 bytes	F0 00 00 66 14 13 00 F7
    17:01:36.635	To Port 3	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 14 00 F7
    17:01:36.635	To Port 3	SysEx		Unknown Manufacturer 8 bytes	F0 00 00 66 14 13 00 F7
    17:01:36.635	To Port 4	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 14 00 F7
    17:01:36.635	To Port 4	SysEx		Unknown Manufacturer 8 bytes	F0 00 00 66 14 13 00 F7
    17:01:36.635	To Port 1	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 15 00 F7
    17:01:36.635	To Port 1	SysEx		Unknown Manufacturer 8 bytes	F0 00 00 66 15 13 00 F7
    17:01:36.635	To Port 2	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 15 00 F7
    17:01:36.635	To Port 2	SysEx		Unknown Manufacturer 8 bytes	F0 00 00 66 15 13 00 F7
    17:01:36.636	To Port 3	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 15 00 F7
    17:01:36.636	To Port 3	SysEx		Unknown Manufacturer 8 bytes	F0 00 00 66 15 13 00 F7
    17:01:36.636	To Port 4	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 15 00 F7
    17:01:36.636	To Port 4	SysEx		Unknown Manufacturer 8 bytes	F0 00 00 66 15 13 00 F7
    17:01:36.637	To Port 1	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 14 00 F7
    17:01:36.637	To Port 1	SysEx		Unknown Manufacturer 8 bytes	F0 00 00 66 14 13 00 F7
    17:01:36.637	To Port 2	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 14 00 F7
    17:01:36.637	To Port 2	SysEx		Unknown Manufacturer 8 bytes	F0 00 00 66 14 13 00 F7
    17:01:36.637	To Port 3	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 14 00 F7
    17:01:36.637	To Port 3	SysEx		Unknown Manufacturer 8 bytes	F0 00 00 66 14 13 00 F7
    17:01:36.638	To Port 4	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 14 00 F7
    17:01:36.638	To Port 4	SysEx		Unknown Manufacturer 8 bytes	F0 00 00 66 14 13 00 F7
    17:01:36.638	To Port 1	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 15 00 F7
    17:01:36.638	To Port 1	SysEx		Unknown Manufacturer 8 bytes	F0 00 00 66 15 13 00 F7
    17:01:36.638	To Port 2	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 15 00 F7
    17:01:36.638	To Port 2	SysEx		Unknown Manufacturer 8 bytes	F0 00 00 66 15 13 00 F7
    17:01:36.638	To Port 3	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 15 00 F7
    17:01:36.639	To Port 3	SysEx		Unknown Manufacturer 8 bytes	F0 00 00 66 15 13 00 F7
    17:01:36.639	To Port 4	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 15 00 F7
    17:01:36.639	To Port 4	SysEx		Unknown Manufacturer 8 bytes	F0 00 00 66 15 13 00 F7
    17:01:36.639	To Port 1	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 14 00 F7
    17:01:36.639	To Port 1	SysEx		Unknown Manufacturer 8 bytes	F0 00 00 66 14 13 00 F7
    17:01:36.640	To Port 2	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 14 00 F7
    17:01:36.640	To Port 2	SysEx		Unknown Manufacturer 8 bytes	F0 00 00 66 14 13 00 F7
    17:01:36.640	To Port 3	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 14 00 F7
    17:01:36.640	To Port 3	SysEx		Unknown Manufacturer 8 bytes	F0 00 00 66 14 13 00 F7
    17:01:36.640	To Port 4	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 14 00 F7
    17:01:36.640	To Port 4	SysEx		Unknown Manufacturer 8 bytes	F0 00 00 66 14 13 00 F7
    17:01:36.640	To Port 1	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 15 00 F7
    17:01:36.640	To Port 1	SysEx		Unknown Manufacturer 8 bytes	F0 00 00 66 15 13 00 F7
    17:01:36.640	To Port 2	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 15 00 F7
    17:01:36.640	To Port 2	SysEx		Unknown Manufacturer 8 bytes	F0 00 00 66 15 13 00 F7
    17:01:36.640	To Port 3	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 15 00 F7
    17:01:36.640	To Port 3	SysEx		Unknown Manufacturer 8 bytes	F0 00 00 66 15 13 00 F7
    17:01:36.641	To Port 4	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 15 00 F7
    17:01:36.641	To Port 4	SysEx		Unknown Manufacturer 8 bytes	F0 00 00 66 15 13 00 F7
    17:01:36.642	To Port 1	SysEx		J L Cooper 5 bytes	F0 15 10 03 F7
    17:01:36.642	To Port 2	SysEx		J L Cooper 5 bytes	F0 15 10 03 F7
    17:01:36.642	To Port 3	SysEx		J L Cooper 5 bytes	F0 15 10 03 F7
    17:01:36.642	To Port 4	SysEx		J L Cooper 5 bytes	F0 15 10 03 F7
    17:01:36.647	To Port 1	SysEx		Universal Non-Real Time 6 bytes	F0 7E 00 06 01 F7
    17:01:36.648	To Port 2	SysEx		Universal Non-Real Time 6 bytes	F0 7E 00 06 01 F7
    17:01:36.648	To Port 3	SysEx		Universal Non-Real Time 6 bytes	F0 7E 00 06 01 F7
    17:01:36.649	To Port 4	SysEx		Universal Non-Real Time 6 bytes	F0 7E 00 06 01 F7
    The base unit is supposed to communicate via cable 0 (port 1), xt unit via cable 1 (port 2). I must be missing some change in the handler as the code as such worked with the other library.

    Kind regards,

    Gerrit

  17. #42
    Senior Member
    Join Date
    Apr 2017
    Posts
    115
    Quote Originally Posted by Gerrit View Post
    No, for clarity I only copied part of the queries. Here's everything Logic sends to the Teensy when Logic is starting up:
    Code:
    17:01:36.617	To Port 1	SysEx		J L Cooper 5 bytes	F0 15 29 01 F7
    17:01:36.624	To Port 2	SysEx		J L Cooper 5 bytes	F0 15 29 01 F7
    17:01:36.624	To Port 3	SysEx		J L Cooper 5 bytes	F0 15 29 01 F7
    17:01:36.624	To Port 4	SysEx		J L Cooper 5 bytes	F0 15 29 01 F7
    17:01:36.628	To Port 1	SysEx		Universal Non-Real Time 6 bytes	F0 7E 00 06 01 F7
    17:01:36.629	To Port 2	SysEx		Universal Non-Real Time 6 bytes	F0 7E 00 06 01 F7
    17:01:36.629	To Port 3	SysEx		Universal Non-Real Time 6 bytes	F0 7E 00 06 01 F7
    17:01:36.630	To Port 4	SysEx		Universal Non-Real Time 6 bytes	F0 7E 00 06 01 F7
    17:01:36.630	To Port 1	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 10 00 F7
    17:01:36.630	To Port 2	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 10 00 F7
    17:01:36.631	To Port 3	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 10 00 F7
    17:01:36.631	To Port 4	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 10 00 F7
    17:01:36.631	To Port 1	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 11 00 F7
    17:01:36.631	To Port 2	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 11 00 F7
    17:01:36.632	To Port 3	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 11 00 F7
    17:01:36.632	To Port 4	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 11 00 F7
    17:01:36.632	To Port 1	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 17 00 F7
    17:01:36.632	To Port 1	SysEx		Unknown Manufacturer 8 bytes	F0 00 00 66 17 13 00 F7
    17:01:36.633	To Port 2	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 17 00 F7
    17:01:36.633	To Port 2	SysEx		Unknown Manufacturer 8 bytes	F0 00 00 66 17 13 00 F7
    17:01:36.633	To Port 3	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 17 00 F7
    17:01:36.633	To Port 3	SysEx		Unknown Manufacturer 8 bytes	F0 00 00 66 17 13 00 F7
    17:01:36.634	To Port 4	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 17 00 F7
    17:01:36.634	To Port 4	SysEx		Unknown Manufacturer 8 bytes	F0 00 00 66 17 13 00 F7
    17:01:36.634	To Port 1	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 14 00 F7
    17:01:36.634	To Port 1	SysEx		Unknown Manufacturer 8 bytes	F0 00 00 66 14 13 00 F7
    17:01:36.635	To Port 2	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 14 00 F7
    17:01:36.635	To Port 2	SysEx		Unknown Manufacturer 8 bytes	F0 00 00 66 14 13 00 F7
    17:01:36.635	To Port 3	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 14 00 F7
    17:01:36.635	To Port 3	SysEx		Unknown Manufacturer 8 bytes	F0 00 00 66 14 13 00 F7
    17:01:36.635	To Port 4	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 14 00 F7
    17:01:36.635	To Port 4	SysEx		Unknown Manufacturer 8 bytes	F0 00 00 66 14 13 00 F7
    17:01:36.635	To Port 1	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 15 00 F7
    17:01:36.635	To Port 1	SysEx		Unknown Manufacturer 8 bytes	F0 00 00 66 15 13 00 F7
    17:01:36.635	To Port 2	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 15 00 F7
    17:01:36.635	To Port 2	SysEx		Unknown Manufacturer 8 bytes	F0 00 00 66 15 13 00 F7
    17:01:36.636	To Port 3	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 15 00 F7
    17:01:36.636	To Port 3	SysEx		Unknown Manufacturer 8 bytes	F0 00 00 66 15 13 00 F7
    17:01:36.636	To Port 4	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 15 00 F7
    17:01:36.636	To Port 4	SysEx		Unknown Manufacturer 8 bytes	F0 00 00 66 15 13 00 F7
    17:01:36.637	To Port 1	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 14 00 F7
    17:01:36.637	To Port 1	SysEx		Unknown Manufacturer 8 bytes	F0 00 00 66 14 13 00 F7
    17:01:36.637	To Port 2	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 14 00 F7
    17:01:36.637	To Port 2	SysEx		Unknown Manufacturer 8 bytes	F0 00 00 66 14 13 00 F7
    17:01:36.637	To Port 3	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 14 00 F7
    17:01:36.637	To Port 3	SysEx		Unknown Manufacturer 8 bytes	F0 00 00 66 14 13 00 F7
    17:01:36.638	To Port 4	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 14 00 F7
    17:01:36.638	To Port 4	SysEx		Unknown Manufacturer 8 bytes	F0 00 00 66 14 13 00 F7
    17:01:36.638	To Port 1	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 15 00 F7
    17:01:36.638	To Port 1	SysEx		Unknown Manufacturer 8 bytes	F0 00 00 66 15 13 00 F7
    17:01:36.638	To Port 2	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 15 00 F7
    17:01:36.638	To Port 2	SysEx		Unknown Manufacturer 8 bytes	F0 00 00 66 15 13 00 F7
    17:01:36.638	To Port 3	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 15 00 F7
    17:01:36.639	To Port 3	SysEx		Unknown Manufacturer 8 bytes	F0 00 00 66 15 13 00 F7
    17:01:36.639	To Port 4	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 15 00 F7
    17:01:36.639	To Port 4	SysEx		Unknown Manufacturer 8 bytes	F0 00 00 66 15 13 00 F7
    17:01:36.639	To Port 1	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 14 00 F7
    17:01:36.639	To Port 1	SysEx		Unknown Manufacturer 8 bytes	F0 00 00 66 14 13 00 F7
    17:01:36.640	To Port 2	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 14 00 F7
    17:01:36.640	To Port 2	SysEx		Unknown Manufacturer 8 bytes	F0 00 00 66 14 13 00 F7
    17:01:36.640	To Port 3	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 14 00 F7
    17:01:36.640	To Port 3	SysEx		Unknown Manufacturer 8 bytes	F0 00 00 66 14 13 00 F7
    17:01:36.640	To Port 4	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 14 00 F7
    17:01:36.640	To Port 4	SysEx		Unknown Manufacturer 8 bytes	F0 00 00 66 14 13 00 F7
    17:01:36.640	To Port 1	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 15 00 F7
    17:01:36.640	To Port 1	SysEx		Unknown Manufacturer 8 bytes	F0 00 00 66 15 13 00 F7
    17:01:36.640	To Port 2	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 15 00 F7
    17:01:36.640	To Port 2	SysEx		Unknown Manufacturer 8 bytes	F0 00 00 66 15 13 00 F7
    17:01:36.640	To Port 3	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 15 00 F7
    17:01:36.640	To Port 3	SysEx		Unknown Manufacturer 8 bytes	F0 00 00 66 15 13 00 F7
    17:01:36.641	To Port 4	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 15 00 F7
    17:01:36.641	To Port 4	SysEx		Unknown Manufacturer 8 bytes	F0 00 00 66 15 13 00 F7
    17:01:36.642	To Port 1	SysEx		J L Cooper 5 bytes	F0 15 10 03 F7
    17:01:36.642	To Port 2	SysEx		J L Cooper 5 bytes	F0 15 10 03 F7
    17:01:36.642	To Port 3	SysEx		J L Cooper 5 bytes	F0 15 10 03 F7
    17:01:36.642	To Port 4	SysEx		J L Cooper 5 bytes	F0 15 10 03 F7
    17:01:36.647	To Port 1	SysEx		Universal Non-Real Time 6 bytes	F0 7E 00 06 01 F7
    17:01:36.648	To Port 2	SysEx		Universal Non-Real Time 6 bytes	F0 7E 00 06 01 F7
    17:01:36.648	To Port 3	SysEx		Universal Non-Real Time 6 bytes	F0 7E 00 06 01 F7
    17:01:36.649	To Port 4	SysEx		Universal Non-Real Time 6 bytes	F0 7E 00 06 01 F7
    The base unit is supposed to communicate via cable 0 (port 1), xt unit via cable 1 (port 2). I must be missing some change in the handler as the code as such worked with the other library.

    Kind regards,

    Gerrit
    Can you post the updated code?

  18. #43
    Senior Member PaulStoffregen's Avatar
    Join Date
    Nov 2012
    Posts
    18,655
    Oh, I believe sysex receive may not be properly reporting which cable delivered the message.

    I will work on this soon...

  19. #44
    Senior Member
    Join Date
    Jan 2017
    Location
    Maastricht
    Posts
    122
    Quote Originally Posted by vjmuzik View Post
    Can you post the updated code?
    Here's the sysex handler code:
    Code:
    void handleSysEx(const byte* sysExData, uint16_t sysExSize, bool complete){
      uint8_t midiPort;
      boolean isMackieControlMessage = true;
      boolean isMackieControlXTMessage = true;
    
      midiPort = usbMIDI.getCable();
      switch (midiPort) {
        // Logic Control Main on Port 0
        case 0:
          // compare the first five bytes of the message to the sysExHeader to check if it is a Mackie control message
          for (int i=0;i<5;i++) {
            if (sysExData[i]!=sysExHeader[i]) {
              isMackieControlMessage = false;
            }
          }
          // handle mackie control message
          if (isMackieControlMessage) {
            boolean processMessage = true;
            // handle different message types
            switch (sysExData[5]) {
              // respond to device query
              case 0:
                usbMIDI.sendSysEx(18, sysExHostConnectionQuery,true,0);
                break;
              // respond to host connection reply with connection confirmation
              case 2:
                usbMIDI.sendSysEx(14, sysExHostConnectionConfirmation,true,0);
                break;
              // respond to firmware version request
              case 19:
                usbMIDI.sendSysEx(12, sysExVersionReply,true,0);
                break;
              // handle LCD display update
              case 18:
                // get message text for determination of message type
                for (int i=7;i<sysExSize-1;i++) {
                    messageText[i-7]= sysExData[i];
                  }
                // check for page message
                if (strncmp(pageMessageHeader,messageText,9)==0){
                  // ignore
                  processMessage=false;
                }
                // check for insert name message
                else if (strstr(messageText,insertMessageHeader)){
                  //ignore
                  processMessage=false;
                }
                if (processMessage){
                  //update lcdText with message text
                  for (int i=7;i<sysExSize-1;i++) {
                    lcdTextR[sysExData[6]+i-7]= sysExData[i];
                    }
                  //if the update starts at position 0 check if plugin page can be identified
                  if (sysExData[6]==0){
                    checkPlugin();
                  }
                  updateStart = int(float(sysExData[6])/7.0);
                  updateEnd = updateStart + int((float(sysExSize-8))/7.0);
                  // loop through text fields and write 7 characters, only update fields that need to be updated
                  for (int i=updateStart;i<=updateEnd;i++){
                    char text[8];
                    for (int j=0;j<7;j++){
                      text[j]=lcdTextR[7*i+j];
                    }
                  displayText(text,i);
                  }
                }
                break;
                // handle LED display update
              case 16:
                // update led display
                for (int i=7;i<sysExSize-1;i++) {
                  ledText[9-(sysExData[6]+i-7)]= sysExData[i];
                  }
                // null terminate string for 4D string object
                ledText[10]='\0';
                //displayL.WriteStr(23,ledText);
                break;
              case 97:
                //faders to minimum
                break;
              case 98:
                //all leds off
                break;
              case 99:
                //reboot in offline mode
                break;
              default: 
                // statements
              break;
            }
          }
          break;
        // Logic Control XT on Port 1
        case 1:
          // compare the first five bytes of the message to the sysExHeader to check if it is a Mackie control XT message
          for (int i=0;i<5;i++) {
            if (sysExData[i]!=sysExHeaderXT[i]) {
              isMackieControlXTMessage = false;
            }
           }
          // handle mackie control message
          if (isMackieControlXTMessage) {
            boolean processMessage = true;
            // handle different message types
            switch (sysExData[5]) {
              // respond to device query
              case 0:
                usbMIDI.sendSysEx(18, sysExHostConnectionQueryXT,true,1);
                break;
              // respond to host connection reply with connection confirmation
              case 2:
                usbMIDI.sendSysEx(14, sysExHostConnectionConfirmationXT,true,1);
                break;
              // respond to firmware version request
              case 19:
                usbMIDI.sendSysEx(12, sysExVersionReplyXT,true,1);
                break;
              // handle LCD display update
              case 18:
                // get message text for determination of message type
                for (int i=7;i<sysExSize-1;i++) {
                    messageText[i-7]= sysExData[i];
                  }
                // check for page message
                if (strncmp(pageMessageHeader,messageText,9)==0){
                  // ignore
                  processMessage=false;
                }
                // check for insert name message
                else if (strstr(messageText,insertMessageHeader)){
                  //ignore
                  processMessage=false;
                }
                if (processMessage){
                  //update lcdText with message text
                  for (int i=7;i<sysExSize-1;i++) {
                    lcdTextL[sysExData[6]+i-7]= sysExData[i];
                    }
                  //if the update starts at position 0 check if plugin page can be identified
                  if (sysExData[6]==0){
                    checkPlugin();
                  }
                  updateStart = int(float(sysExData[6])/7.0);
                  updateEnd = updateStart + int((float(sysExSize-8))/7.0);
                  // loop through text fields and write 7 characters, only update fields that need to be updated
                  for (int i=updateStart;i<=updateEnd;i++){
                    char text[8];
                    for (int j=0;j<7;j++){
                      text[j]=lcdTextL[7*i+j];
                    }
                  displayText(text,i);
                  }
                }
                break;
                // handle LED display update
              case 16:
                // no led display on XT unit
                break;
              case 97:
                //faders to minimum
                break;
              case 98:
                //all leds off
                break;
              case 99:
                //reboot in offline mode
                break;
              default: 
                // statements
              break;
            }
          }       
        break;
        // Synth control on Port 2
        case 2:
          // nothing yet
        break;
        default: 
          // ignore sysExData
        break;
      }
    }
    Here's the complete midi communication on Logic startup:
    Code:
    18:05:20.297	To Port 1	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 10 00 F7
    18:05:20.297	To Port 1	SysEx		Unknown Manufacturer 8 bytes	F0 00 00 66 10 13 00 F7
    18:05:20.299	From Port 1	SysEx		Unknown Manufacturer 18 bytes	F0 00 00 66 10 01 49 41 31 33 35 36 38 64 7A 61 41 F7
    18:05:21.843	To Port 1	SysEx		Unknown Manufacturer 8 bytes	F0 00 00 66 10 13 00 F7
    18:05:21.844	From Port 1	SysEx		Unknown Manufacturer 12 bytes	F0 00 00 66 10 14 56 31 2E 30 32 F7
    18:05:23.044	To Port 1	SysEx		Unknown Manufacturer 8 bytes	F0 00 00 66 10 13 00 F7
    18:05:23.045	From Port 1	SysEx		Unknown Manufacturer 12 bytes	F0 00 00 66 10 14 56 31 2E 30 32 F7
    18:05:23.112	To Port 1	SysEx		J L Cooper 5 bytes	F0 15 29 01 F7
    18:05:23.113	To Port 2	SysEx		J L Cooper 5 bytes	F0 15 29 01 F7
    18:05:23.114	To Port 3	SysEx		J L Cooper 5 bytes	F0 15 29 01 F7
    18:05:23.114	To Port 4	SysEx		J L Cooper 5 bytes	F0 15 29 01 F7
    18:05:23.123	To Port 1	SysEx		Universal Non-Real Time 6 bytes	F0 7E 00 06 01 F7
    18:05:23.124	To Port 2	SysEx		Universal Non-Real Time 6 bytes	F0 7E 00 06 01 F7
    18:05:23.124	To Port 3	SysEx		Universal Non-Real Time 6 bytes	F0 7E 00 06 01 F7
    18:05:23.125	To Port 4	SysEx		Universal Non-Real Time 6 bytes	F0 7E 00 06 01 F7
    18:05:23.125	To Port 1	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 10 00 F7
    18:05:23.125	To Port 2	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 10 00 F7
    18:05:23.126	To Port 3	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 10 00 F7
    18:05:23.126	To Port 4	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 10 00 F7
    18:05:23.127	To Port 1	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 11 00 F7
    18:05:23.127	To Port 2	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 11 00 F7
    18:05:23.127	To Port 3	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 11 00 F7
    18:05:23.127	To Port 4	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 11 00 F7
    18:05:23.127	To Port 1	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 17 00 F7
    18:05:23.128	To Port 1	SysEx		Unknown Manufacturer 8 bytes	F0 00 00 66 17 13 00 F7
    18:05:23.128	To Port 2	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 17 00 F7
    18:05:23.128	To Port 2	SysEx		Unknown Manufacturer 8 bytes	F0 00 00 66 17 13 00 F7
    18:05:23.129	To Port 3	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 17 00 F7
    18:05:23.128	From Port 1	SysEx		Unknown Manufacturer 18 bytes	F0 00 00 66 10 01 49 41 31 33 35 36 38 64 7A 61 41 F7
    18:05:23.129	To Port 3	SysEx		Unknown Manufacturer 8 bytes	F0 00 00 66 17 13 00 F7
    18:05:23.129	To Port 4	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 17 00 F7
    18:05:23.129	To Port 4	SysEx		Unknown Manufacturer 8 bytes	F0 00 00 66 17 13 00 F7
    18:05:23.129	To Port 1	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 14 00 F7
    18:05:23.129	To Port 1	SysEx		Unknown Manufacturer 8 bytes	F0 00 00 66 14 13 00 F7
    18:05:23.129	To Port 2	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 14 00 F7
    18:05:23.129	To Port 2	SysEx		Unknown Manufacturer 8 bytes	F0 00 00 66 14 13 00 F7
    18:05:23.130	To Port 3	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 14 00 F7
    18:05:23.130	To Port 3	SysEx		Unknown Manufacturer 8 bytes	F0 00 00 66 14 13 00 F7
    18:05:23.130	To Port 4	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 14 00 F7
    18:05:23.130	To Port 4	SysEx		Unknown Manufacturer 8 bytes	F0 00 00 66 14 13 00 F7
    18:05:23.130	To Port 1	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 15 00 F7
    18:05:23.130	To Port 1	SysEx		Unknown Manufacturer 8 bytes	F0 00 00 66 15 13 00 F7
    18:05:23.130	To Port 2	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 15 00 F7
    18:05:23.130	To Port 2	SysEx		Unknown Manufacturer 8 bytes	F0 00 00 66 15 13 00 F7
    18:05:23.131	To Port 3	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 15 00 F7
    18:05:23.131	To Port 3	SysEx		Unknown Manufacturer 8 bytes	F0 00 00 66 15 13 00 F7
    18:05:23.131	To Port 4	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 15 00 F7
    18:05:23.131	To Port 4	SysEx		Unknown Manufacturer 8 bytes	F0 00 00 66 15 13 00 F7
    18:05:23.131	To Port 1	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 14 00 F7
    18:05:23.132	To Port 1	SysEx		Unknown Manufacturer 8 bytes	F0 00 00 66 14 13 00 F7
    18:05:23.132	To Port 2	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 14 00 F7
    18:05:23.132	To Port 2	SysEx		Unknown Manufacturer 8 bytes	F0 00 00 66 14 13 00 F7
    18:05:23.132	To Port 3	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 14 00 F7
    18:05:23.132	To Port 3	SysEx		Unknown Manufacturer 8 bytes	F0 00 00 66 14 13 00 F7
    18:05:23.133	To Port 4	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 14 00 F7
    18:05:23.133	To Port 4	SysEx		Unknown Manufacturer 8 bytes	F0 00 00 66 14 13 00 F7
    18:05:23.133	To Port 1	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 15 00 F7
    18:05:23.133	To Port 1	SysEx		Unknown Manufacturer 8 bytes	F0 00 00 66 15 13 00 F7
    18:05:23.133	To Port 2	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 15 00 F7
    18:05:23.133	To Port 2	SysEx		Unknown Manufacturer 8 bytes	F0 00 00 66 15 13 00 F7
    18:05:23.133	To Port 3	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 15 00 F7
    18:05:23.133	To Port 3	SysEx		Unknown Manufacturer 8 bytes	F0 00 00 66 15 13 00 F7
    18:05:23.133	To Port 4	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 15 00 F7
    18:05:23.133	To Port 4	SysEx		Unknown Manufacturer 8 bytes	F0 00 00 66 15 13 00 F7
    18:05:23.134	To Port 1	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 14 00 F7
    18:05:23.134	To Port 1	SysEx		Unknown Manufacturer 8 bytes	F0 00 00 66 14 13 00 F7
    18:05:23.134	To Port 2	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 14 00 F7
    18:05:23.134	To Port 2	SysEx		Unknown Manufacturer 8 bytes	F0 00 00 66 14 13 00 F7
    18:05:23.134	To Port 3	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 14 00 F7
    18:05:23.134	To Port 3	SysEx		Unknown Manufacturer 8 bytes	F0 00 00 66 14 13 00 F7
    18:05:23.135	To Port 4	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 14 00 F7
    18:05:23.135	To Port 4	SysEx		Unknown Manufacturer 8 bytes	F0 00 00 66 14 13 00 F7
    18:05:23.135	To Port 1	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 15 00 F7
    18:05:23.135	To Port 1	SysEx		Unknown Manufacturer 8 bytes	F0 00 00 66 15 13 00 F7
    18:05:23.135	To Port 2	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 15 00 F7
    18:05:23.136	To Port 2	SysEx		Unknown Manufacturer 8 bytes	F0 00 00 66 15 13 00 F7
    18:05:23.136	To Port 3	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 15 00 F7
    18:05:23.136	To Port 3	SysEx		Unknown Manufacturer 8 bytes	F0 00 00 66 15 13 00 F7
    18:05:23.136	To Port 4	SysEx		Unknown Manufacturer 7 bytes	F0 00 00 66 15 00 F7
    18:05:23.136	To Port 4	SysEx		Unknown Manufacturer 8 bytes	F0 00 00 66 15 13 00 F7
    18:05:23.137	To Port 1	SysEx		J L Cooper 5 bytes	F0 15 10 03 F7
    18:05:23.137	To Port 2	SysEx		J L Cooper 5 bytes	F0 15 10 03 F7
    18:05:23.137	To Port 3	SysEx		J L Cooper 5 bytes	F0 15 10 03 F7
    18:05:23.137	To Port 4	SysEx		J L Cooper 5 bytes	F0 15 10 03 F7
    18:05:23.142	To Port 1	SysEx		Universal Non-Real Time 6 bytes	F0 7E 00 06 01 F7
    18:05:23.143	To Port 2	SysEx		Universal Non-Real Time 6 bytes	F0 7E 00 06 01 F7
    18:05:23.143	To Port 3	SysEx		Universal Non-Real Time 6 bytes	F0 7E 00 06 01 F7
    18:05:23.145	To Port 4	SysEx		Universal Non-Real Time 6 bytes	F0 7E 00 06 01 F7
    18:05:23.515	To Port 1	SysEx		Unknown Manufacturer 18 bytes	F0 00 00 66 10 02 49 41 31 33 35 36 38 13 23 43 79 F7
    18:05:23.515	To Port 1	SysEx		Unknown Manufacturer 18 bytes	F0 00 00 66 10 02 49 41 31 33 35 36 38 13 23 43 79 F7
    18:05:23.515	From Port 1	SysEx		Unknown Manufacturer 14 bytes	F0 00 00 66 10 03 49 41 31 33 35 36 38 F7
    18:05:23.515	From Port 1	SysEx		Unknown Manufacturer 14 bytes	F0 00 00 66 10 03 49 41 31 33 35 36 38 F7
    18:05:23.582	To Port 1	SysEx		Unknown Manufacturer 8 bytes	F0 00 00 66 10 0A 01 F7
    18:05:23.583	To Port 1	SysEx		Unknown Manufacturer 8 bytes	F0 00 00 66 10 0C 00 F7
    18:05:23.583	To Port 1	SysEx		Unknown Manufacturer 9 bytes	F0 00 00 66 10 0E 00 03 F7
    18:05:23.583	To Port 1	SysEx		Unknown Manufacturer 9 bytes	F0 00 00 66 10 0E 01 03 F7
    18:05:23.583	To Port 1	SysEx		Unknown Manufacturer 9 bytes	F0 00 00 66 10 0E 02 03 F7
    18:05:23.583	To Port 1	SysEx		Unknown Manufacturer 9 bytes	F0 00 00 66 10 0E 03 03 F7
    18:05:23.583	To Port 1	SysEx		Unknown Manufacturer 9 bytes	F0 00 00 66 10 0E 04 03 F7
    18:05:23.583	To Port 1	SysEx		Unknown Manufacturer 9 bytes	F0 00 00 66 10 0E 05 03 F7
    18:05:23.583	To Port 1	SysEx		Unknown Manufacturer 9 bytes	F0 00 00 66 10 0E 06 03 F7
    18:05:23.583	To Port 1	SysEx		Unknown Manufacturer 9 bytes	F0 00 00 66 10 0E 07 03 F7
    18:05:23.583	To Port 1	SysEx		Unknown Manufacturer 9 bytes	F0 00 00 66 10 0E 08 03 F7
    18:05:23.583	To Port 1	SysEx		Unknown Manufacturer 8 bytes	F0 00 00 66 10 0B 0F F7
    18:05:23.583	To Port 1	SysEx		Unknown Manufacturer 8 bytes	F0 00 00 66 10 0A 01 F7
    18:05:23.583	To Port 1	SysEx		Unknown Manufacturer 8 bytes	F0 00 00 66 10 0C 00 F7
    18:05:23.583	To Port 1	SysEx		Unknown Manufacturer 9 bytes	F0 00 00 66 10 0E 00 03 F7
    18:05:23.583	To Port 1	SysEx		Unknown Manufacturer 9 bytes	F0 00 00 66 10 0E 01 03 F7
    18:05:23.583	To Port 1	SysEx		Unknown Manufacturer 9 bytes	F0 00 00 66 10 0E 02 03 F7
    18:05:23.584	To Port 1	SysEx		Unknown Manufacturer 9 bytes	F0 00 00 66 10 0E 03 03 F7
    18:05:23.584	To Port 1	SysEx		Unknown Manufacturer 9 bytes	F0 00 00 66 10 0E 04 03 F7
    18:05:23.584	To Port 1	SysEx		Unknown Manufacturer 9 bytes	F0 00 00 66 10 0E 05 03 F7
    18:05:23.584	To Port 1	SysEx		Unknown Manufacturer 9 bytes	F0 00 00 66 10 0E 06 03 F7
    18:05:23.584	To Port 1	SysEx		Unknown Manufacturer 9 bytes	F0 00 00 66 10 0E 07 03 F7
    18:05:23.584	To Port 1	SysEx		Unknown Manufacturer 9 bytes	F0 00 00 66 10 0E 08 03 F7
    18:05:23.584	To Port 1	SysEx		Unknown Manufacturer 8 bytes	F0 00 00 66 10 0B 0F F7
    18:05:23.584	To Port 1	SysEx		Unknown Manufacturer 119 bytes	F0 00 00 66 10 12 00 49 6E 73 74 20 31 20 41 75 78 20 31 20 20 41 75 78 20 32 20 20 41 75 78 20Ö
    18:05:23.584	To Port 1	Control	1	73	32
    18:05:23.584	To Port 1	Control	1	72	32
    18:05:23.584	To Port 1	Control	1	71	49
    18:05:23.584	To Port 1	Control	1	70	32
    18:05:23.584	To Port 1	Control	1	69	49
    18:05:23.584	To Port 1	Control	1	68	32
    18:05:23.584	To Port 1	Control	1	67	49
    18:05:23.584	To Port 1	Control	1	66	32
    18:05:23.584	To Port 1	Control	1	65	32
    18:05:23.584	To Port 1	Control	1	64	49
    18:05:23.584	To Port 1	Control	1	75	16
    18:05:23.584	To Port 1	Control	1	74	14
    18:05:23.584	To Port 1	Note On	1	$00	127
    18:05:23.584	To Port 1	Note Off	1	$01	0
    18:05:23.584	To Port 1	Note Off	1	$02	0
    18:05:23.584	To Port 1	Note Off	1	$03	0
    18:05:23.584	To Port 1	Note Off	1	$04	0
    18:05:23.584	To Port 1	Note Off	1	$05	0
    18:05:23.584	To Port 1	Note Off	1	$06	0
    18:05:23.584	To Port 1	Note Off	1	$07	0
    18:05:23.584	To Port 1	Note Off	1	$08	0
    18:05:23.584	To Port 1	Note Off	1	$09	0
    18:05:23.584	To Port 1	Note Off	1	$0A	0
    18:05:23.584	To Port 1	Note Off	1	$0B	0
    18:05:23.584	To Port 1	Note Off	1	$0C	0
    18:05:23.584	To Port 1	Note Off	1	$0D	0
    18:05:23.584	To Port 1	Note Off	1	$0E	0
    18:05:23.584	To Port 1	Note Off	1	$0F	0
    18:05:23.584	To Port 1	Note Off	1	$10	0
    18:05:23.584	To Port 1	Note Off	1	$11	0
    18:05:23.584	To Port 1	Note Off	1	$12	0
    18:05:23.584	To Port 1	Note Off	1	$13	0
    18:05:23.584	To Port 1	Note Off	1	$14	0
    18:05:23.584	To Port 1	Note Off	1	$15	0
    18:05:23.584	To Port 1	Note Off	1	$16	0
    18:05:23.584	To Port 1	Note Off	1	$17	0
    18:05:23.584	To Port 1	Note On	1	$18	127
    18:05:23.584	To Port 1	Note Off	1	$19	0
    18:05:23.584	To Port 1	Note Off	1	$1A	0
    18:05:23.584	To Port 1	Note Off	1	$1B	0
    18:05:23.584	To Port 1	Note Off	1	$1C	0
    18:05:23.584	To Port 1	Note Off	1	$1D	0
    18:05:23.585	To Port 1	Note Off	1	$1E	0
    18:05:23.585	To Port 1	Note Off	1	$1F	0
    18:05:23.585	To Port 1	Note Off	1	$20	0
    18:05:23.585	To Port 1	Note Off	1	$21	0
    18:05:23.585	To Port 1	Note Off	1	$22	0
    18:05:23.585	To Port 1	Note Off	1	$23	0
    18:05:23.585	To Port 1	Note Off	1	$24	0
    18:05:23.585	To Port 1	Note Off	1	$25	0
    18:05:23.585	To Port 1	Note Off	1	$26	0
    18:05:23.585	To Port 1	Note Off	1	$27	0
    18:05:23.585	To Port 1	Note Off	1	$28	0
    18:05:23.585	To Port 1	Note Off	1	$29	0
    18:05:23.585	To Port 1	Note On	1	$2A	127
    18:05:23.585	To Port 1	Note Off	1	$2B	0
    18:05:23.585	To Port 1	Note Off	1	$2C	0
    18:05:23.585	To Port 1	Note Off	1	$2D	0
    18:05:23.585	To Port 1	Note On	1	$32	1
    18:05:23.585	To Port 1	Note Off	1	$33	0
    18:05:23.585	To Port 1	Note On	1	$4A	127
    18:05:23.585	To Port 1	Note Off	1	$4B	0
    18:05:23.585	To Port 1	Note Off	1	$4C	0
    18:05:23.585	To Port 1	Note Off	1	$4D	0
    18:05:23.585	To Port 1	Note Off	1	$4E	0
    18:05:23.585	To Port 1	Note Off	1	$4F	0
    18:05:23.585	To Port 1	Note Off	1	$50	0
    18:05:23.585	To Port 1	Note Off	1	$51	0
    18:05:23.585	To Port 1	Note Off	1	$54	0
    18:05:23.585	To Port 1	Note Off	1	$55	0
    18:05:23.585	To Port 1	Note Off	1	$56	0
    18:05:23.585	To Port 1	Note Off	1	$57	0
    18:05:23.585	To Port 1	Note Off	1	$58	0
    18:05:23.585	To Port 1	Note Off	1	$59	0
    18:05:23.585	To Port 1	Note Off	1	$5A	0
    18:05:23.585	To Port 1	Note Off	1	$5B	0
    18:05:23.585	To Port 1	Note Off	1	$5C	0
    18:05:23.585	To Port 1	Note On	1	$5D	127
    18:05:23.585	To Port 1	Note Off	1	$5E	0
    18:05:23.585	To Port 1	Note Off	1	$5F	0
    18:05:23.585	To Port 1	Note Off	1	$64	0
    18:05:23.585	To Port 1	Note On	1	$65	127
    18:05:23.585	To Port 1	Note Off	1	$71	0
    18:05:23.585	To Port 1	Note On	1	$72	127
    18:05:23.585	To Port 1	Note Off	1	$73	0
    18:05:23.585	To Port 1	Pitch Wheel	1	64
    18:05:23.585	To Port 1	Pitch Wheel	2	64
    18:05:23.585	To Port 1	Pitch Wheel	3	64
    18:05:23.585	To Port 1	Pitch Wheel	4	64
    18:05:23.585	To Port 1	Pitch Wheel	5	64
    18:05:23.585	To Port 1	Pitch Wheel	6	64
    18:05:23.585	To Port 1	Pitch Wheel	7	64
    18:05:23.585	To Port 1	Pitch Wheel	8	64
    18:05:23.586	To Port 1	Pitch Wheel	9	4249
    18:05:23.586	To Port 1	Pitch Wheel	10	-8192
    18:05:23.586	To Port 1	Control	1	48	104
    18:05:23.586	To Port 1	Control	1	49	33
    18:05:23.586	To Port 1	Control	1	50	33
    18:05:23.586	To Port 1	Control	1	51	33
    18:05:23.586	To Port 1	Control	1	52	33
    18:05:23.586	To Port 1	Control	1	53	33
    18:05:23.586	To Port 1	Control	1	54	33
    18:05:23.586	To Port 1	Control	1	55	104
    18:05:23.586	To Port 1	Channel Pressure	1	0
    18:05:23.586	To Port 1	SysEx		Unknown Manufacturer 8 bytes	F0 00 00 66 10 21 01 F7
    18:05:23.586	To Port 1	SysEx		Unknown Manufacturer 9 bytes	F0 00 00 66 10 20 00 07 F7
    18:05:23.587	To Port 1	Channel Pressure	1	16
    18:05:23.587	To Port 1	SysEx		Unknown Manufacturer 9 bytes	F0 00 00 66 10 20 01 07 F7
    18:05:23.587	To Port 1	Channel Pressure	1	32
    18:05:23.587	To Port 1	SysEx		Unknown Manufacturer 9 bytes	F0 00 00 66 10 20 02 07 F7
    18:05:23.588	To Port 1	Channel Pressure	1	48
    18:05:23.588	To Port 1	SysEx		Unknown Manufacturer 9 bytes	F0 00 00 66 10 20 03 07 F7
    18:05:23.588	To Port 1	Channel Pressure	1	64
    18:05:23.588	To Port 1	SysEx		Unknown Manufacturer 9 bytes	F0 00 00 66 10 20 04 07 F7
    18:05:23.589	To Port 1	Channel Pressure	1	80
    18:05:23.589	To Port 1	SysEx		Unknown Manufacturer 9 bytes	F0 00 00 66 10 20 05 07 F7
    18:05:23.589	To Port 1	Channel Pressure	1	96
    18:05:23.590	To Port 1	SysEx		Unknown Manufacturer 9 bytes	F0 00 00 66 10 20 06 07 F7
    18:05:23.590	To Port 1	Channel Pressure	1	112
    18:05:23.590	To Port 1	SysEx		Unknown Manufacturer 9 bytes	F0 00 00 66 10 20 07 07 F7
    18:05:23.591	To Port 1	SysEx		Unknown Manufacturer 8 bytes	F0 00 00 66 10 0A 01 F7
    18:05:23.591	To Port 1	SysEx		Unknown Manufacturer 8 bytes	F0 00 00 66 10 0C 00 F7
    18:05:23.591	To Port 1	SysEx		Unknown Manufacturer 8 bytes	F0 00 00 66 10 0B 0F F7
    18:05:24.614	To Port 1	SysEx		Unknown Manufacturer 9 bytes	F0 00 00 66 10 0E 00 03 F7
    18:05:24.703	To Port 1	SysEx		Unknown Manufacturer 9 bytes	F0 00 00 66 10 0E 01 03 F7
    18:05:24.703	To Port 1	SysEx		Unknown Manufacturer 9 bytes	F0 00 00 66 10 0E 02 03 F7
    18:05:24.703	To Port 1	SysEx		Unknown Manufacturer 9 bytes	F0 00 00 66 10 0E 03 03 F7
    18:05:24.703	To Port 1	SysEx		Unknown Manufacturer 9 bytes	F0 00 00 66 10 0E 04 03 F7
    18:05:24.703	To Port 1	SysEx		Unknown Manufacturer 9 bytes	F0 00 00 66 10 0E 05 03 F7
    18:05:24.703	To Port 1	SysEx		Unknown Manufacturer 9 bytes	F0 00 00 66 10 0E 06 03 F7
    18:05:24.703	To Port 1	SysEx		Unknown Manufacturer 9 bytes	F0 00 00 66 10 0E 07 03 F7
    18:05:24.704	To Port 1	SysEx		Unknown Manufacturer 9 bytes	F0 00 00 66 10 0E 08 03 F7
    The Teensy is responding on cable 0, Logic transmits all DAW settings to cable 0 but there's no response on cable 1.

    A short description for anyone not familiar with this subject:
    - Sysex communication is used for initial handshake and discovery and for updating the lcd and led display.
    - Note events turn the LEDs on and off
    - Pitchbend is used for the motorfaders (10bit resolution on the controller side)
    - Channel pressure is for the VU meters
    - Control change messages are used for the led rings around the rotary encoders and for the time display

    Kind regards,

    Gerrit

  20. #45
    Senior Member
    Join Date
    Jan 2017
    Location
    Maastricht
    Posts
    122
    Quote Originally Posted by PaulStoffregen View Post
    Oh, I believe sysex receive may not be properly reporting which cable delivered the message.

    I will work on this soon...
    Thanks, in the meantime I'll be working to finish the hardware which allow for more elaborate testing.

    Kind regards,

    Gerrit

  21. #46
    Senior Member
    Join Date
    Apr 2017
    Posts
    115
    Quote Originally Posted by PaulStoffregen View Post
    Oh, I believe sysex receive may not be properly reporting which cable delivered the message.

    I will work on this soon...
    I don’t believe the SysEx receive is the problem as all midi receive messages get their cable from the same line, so if one didn’t work all of them wouldn’t.

  22. #47
    Senior Member
    Join Date
    Apr 2017
    Posts
    115
    I’ve successfully sent and received SysEx on all ports so it’s likely something wrong with your sketch.

  23. #48
    Senior Member
    Join Date
    Apr 2017
    Posts
    115
    It seems that SysEx messages are not properly terminating and clumping together when the Teensy reads them

    Here is what the Teensy gets
    Click image for larger version. 

Name:	Screen Shot 2018-01-10 at 7.17.35 PM.png 
Views:	25 
Size:	36.5 KB 
ID:	12576

    Here is what is being sent
    Click image for larger version. 

Name:	Screen Shot 2018-01-10 at 7.18.06 PM.png 
Views:	19 
Size:	18.6 KB 
ID:	12577
    Same two messages were sent 3 different times

  24. #49
    Senior Member PaulStoffregen's Avatar
    Join Date
    Nov 2012
    Posts
    18,655
    Quote Originally Posted by vjmuzik View Post
    It seems that SysEx messages are not properly terminating and clumping together when the Teensy reads them
    Which software is sending these messages?

    I have a Macbook Air with the latest High Sierra, but no MIDI software, and no experience with programs like Garageband or Logic. What would I need to do to recreate this here?

  25. #50
    Senior Member
    Join Date
    Apr 2017
    Posts
    115
    Quote Originally Posted by PaulStoffregen View Post
    Which software is sending these messages?

    I have a Macbook Air with the latest High Sierra, but no MIDI software, and no experience with programs like Garageband or Logic. What would I need to do to recreate this here?
    Logic was sending the SysEx messages but I have a program called “MIDI Tools” that you can use to send most midi messages. I haven’t tested it sending multiple midi SysEx messages from it but it should yield similar results.

    The I use “MIDI Monitor” to see what messages are being sent to and from devices.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •