Virtual Midi Cables - 8 ports OSX and PC

Status
Not open for further replies.
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.
 
I've already committed the new code on github.

https://github.com/PaulStoffregen/cores/commit/c9d0122505068854183225a46272da6cc9bcfee7

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.
 
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....
 
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
 
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.

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:
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
 
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.

View attachment 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.
 
This is what I'm planning for the Tools > USB Type menu in 1.41-beta3.

sc.png
 
I published a new beta installer with all the MIDI improvements.

https://forum.pjrc.com/threads/49078-Teensyduino-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: View attachment 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
 
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: View attachment 12573

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.
 
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
 
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?
 
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.
 
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
 
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?
 
Oh, I believe sysex receive may not be properly reporting which cable delivered the message.

I will work on this soon...
 
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
 
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.
 
I’ve successfully sent and received SysEx on all ports so it’s likely something wrong with your sketch.
 
It seems that SysEx messages are not properly terminating and clumping together when the Teensy reads them

Here is what the Teensy gets
Screen Shot 2018-01-10 at 7.17.35 PM.png

Here is what is being sent
Screen Shot 2018-01-10 at 7.18.06 PM.png
Same two messages were sent 3 different times
 
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?
 
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.
 
Status
Not open for further replies.
Back
Top