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