Midi SysEx empfangen und Midi Noten senden

Hallo zusammen.

...ich habe folgendes Problem.

Möchte gerne Midi SysEx Daten, die mein Keyboard an den Teensy 3.6 über USB sendet, auswerten und dann jeweils zum Tempo pro Schlag (1/4 schlag) Midi Noten ausgibt.

Dabei funktioniert der Sketch anfangs noch und gibt pro schlag die jeweilige Note, die einmal pro schlag gesendet wird, aus.
Doch sobald andere (mehrere) SysEx Daten den Teensy erreichen, werden die Midi Noten nicht mehr zeitgerecht und auch wild durcheinander ausgegeben.

Ist es vielleicht ein Buffer Problem, oder einfach schlecht programmiert? ich tippe auf letzteres... :wink:

Könnt ihr mal ein Blick auf den Sketch werfen? Möchte dazu sagen, dass ich blutiger Anfänger bin.

Vielen Dank.

byte sysexRx[7]; // eingehende SysEx Daten die von Keyboard gesendet werden

//SysEx Variablen 
byte D[7] =     {240,67,126,0,11,127,247};
byte Dfill[7] = {240,67,126,0,19,127,247};

//usbMIDI Clock Variablen
int zaehler = 0;  //variable usbMIDIClock
int schlag = 0;   // 1-2-3-4 1-2-3-4

int statusStyle;

//Schleifen Variablen
boolean l1;
boolean MainDl4;
boolean MainDl5;
boolean MainDl6;
boolean MainDl7;


void setup() {
  
  usbMIDI.setHandleClock(usbMIDIClock);
  usbMIDI.setHandleSystemExclusive(handle_sysex);
  
}

void loop() {

usbMIDI.read();


if (statusStyle == 11){ //Main D

switch (schlag){            
  case 1: if (MainDl4 == 0){ // schlag 1 
    usbMIDI.sendNoteOn(61,50,1);  //Midi Note On wird 1x gesendet 
    MainDl4 = 1; 
    MainDl7 = 0;
 }
  break;
  case 2: if (MainDl5 == 0){ // schlag 2 
    usbMIDI.sendNoteOn(62,50,1);  //Midi Note On wird 1x gesendet
    MainDl5 = 1; 
    MainDl4 = 0;
 }
  break;
  case 3: if (MainDl6 == 0){ // schlag 3 
    usbMIDI.sendNoteOn(63,50,1); //Midi Note On wird 1x gesendet
  MainDl6 = 1; 
  MainDl5 = 0;
 }
  break;
  case 4: if (MainDl7 == 0){ // schlag 4
    usbMIDI.sendNoteOn(64,50,1);  //Midi NoteOn wird 1x gesendet
  MainDl7 = 1; 
  MainDl6 = 0; 
 }
  break;
}

}



}
//SysEx:
void handle_sysex(byte* a,unsigned int sizeofsysex){  // bei Arduino (const byte* a,unsigned sizeofsysex)

 for(int i=0;i<8;i++){

  sysexRx[i] = (a[i]);
 }
 //SysEx Daten die von Keyboard gesendet werden, werden verglichen

if ((memcmp(Dfill, sysexRx,7) == 0))  { statusStyle = 10; }
if ((memcmp(D, sysexRx,7) == 0))      { statusStyle = 11; }

}


void usbMIDIClock(){
 zaehler++;
 if (zaehler == 25){
  zaehler = 1;
  }
if (zaehler == 1 && l1 == 0){
  schlag++; 
  l1=1; 
}
if (zaehler == 2){
   l1=0;
}
if (schlag == 5){
  schlag = 1;
}

 
}

Ohne genauere Analyse, meine IDE wirft diese Warnungen aus:

```
Test_Forum: In function 'void handle_sysex(byte*, unsigned int)':
Test_Forum:74: warning: iteration 7u invokes undefined behavior
  sysexRx[i] = (a[i]);

^

C:\Users...\Test_Forum.ino:72:15: note: containing loop

for(int i=0;i<8;i++){

^
```

Könnte das mit Deinem Problem zusammenhängen?

letztes Element +1 == Anzahl Elemente

Hallo agmue,

tut mir Leid, i weiß leider nicht was du mir damit sagen willst. :confused:

Bei mir gibt der Compiler keine Warnung aus.
Kannst Du mir das vielleicht genauer erläutern?

Danke.

arduinoknight:
Bei mir gibt der Compiler keine Warnung aus.

Gehe mal unter Datei - Voreinstellungen - "Ausführliche Auasgabe während: " und Haken bei Kompilierung

my_xy_projekt:
Gehe mal unter Datei - Voreinstellungen - "Ausführliche Auasgabe während: " und Haken bei Kompilierung

Danke für den Tipp, doch der Compiler bringt bei mir trotzdem keine Fehlermeldung.

arduinoknight:
Danke für den Tipp, doch der Compiler bringt bei mir trotzdem keine Fehlermeldung.

Dann kann ich leider nicht weiterhelfen, da Dein Code hier gänzlich nicht compiliert. Vermutlich wegen fehlender Bibliotheken.

my_xy_projekt:
Dann kann ich leider nicht weiterhelfen, da Dein Code hier gänzlich nicht compiliert. Vermutlich wegen fehlender Bibliotheken.

Die Bibliotheken werden je nach USB-Type automatisch eingebunden.

arduinoknight:
Danke für den Tipp, doch der Compiler bringt bei mir trotzdem keine Fehlermeldung.

Wie hast Du den USB-Type eingestellt?

agmue:
Die Bibliotheken werden je nach USB-Type automatisch eingebunden.

Ah ja; man sollte das richtige Board einstellen zum kompilieren. :frowning: