Teensy MIDI und SysEx-Daten über 255byte

Gast #4413498
Ich habe meinen Teensy 3.2 mit meinem Blofeld Synthesizer via einem USB 
Host Board, das USB-MIDI in MIDI umwandelt verbunden (möchte mir einen 
Controller für den Synth bauen).

Controller-Daten senden und empfangen klappt und auch der Empfang von 
kleinen SysEx-Daten vom Synth funktioniert. Ich möchte aber auch einen 
Sound-Dump empfangen, der 256byte groß ist. In der MIDI.h - Bibliothek 
kann man die maximale Größe des SysEx-Arrays verändern, die 
standartmäßig auf 255byte gestellt ist.
1
#define MIDI_SYSEX_ARRAY_SIZE 255   // Maximum size is 65535 bytes.

Wenn ich die Größe des Arrays dort nun vergrößere auf 256 oder mehr, 
hängt sich der Teensy auf, sobald er irgendwelche SysEx-Daten vom Synth 
empfängt (auch kurze).

Die Daten greife ich folgendermaßen ab:
1
  if (MIDI.read()) {
2
  byte type = MIDI.getType();
3
  switch (type) {
4
     case ControlChange:
5
        cc = MIDI.getData1();
6
        val = MIDI.getData2();
7
        Serial.print("CC: ");
8
        Serial.print(cc);
9
        Serial.print(" Value: ");
10
        Serial.println(val);
11
        break;
12
     case SystemExclusive: 
13
       const byte* SysExA = MIDI.getSysExArray();
14
        ArLenght = MIDI.getData1();
15
        for (int i=0;i<ArLenght;i++)
16
          {
17
            Serial.print(" ");
18
            Serial.print(SysExA[i]);
19
            Serial.print("; ");
20
          }
21
        Serial.println();
22
        break;
23
  }
24
  }

Irgendjemand eine Idee woran das liegt und wie man das behebt?
Es liegt wahrscheinlich daran:

Jonas schrieb:
> ArLenght = MIDI.getData1();

(In Unkenntnis der Library gehe ich einfach mal davon aus, daß 
MIDI.getData1() ein empfangenes MIDI Byte zurückgibt)

Hintergrund: über MIDI können nur Datenbytes mit Werten bis max. 127 
übertragen werden, da jedes Byte mit MSB=1 (also >= 0x80 bzw. 128) als 
neues Statusbyte interpretiert wird.
Die Länge eines SysEx-Datensatzes muss also irgendwie anders übertragen 
werden, als einfach nur in einem Datenbyte, wenn der Zahlenwert 127 
überschreitet.
Die Library macht dies für jedes SysEx:
1
mMessage.data1 = (mPendingMessageIndex+1) & 0xFF;  
2
mMessage.data2 = (mPendingMessageIndex+1) >> 8;

Du musst also die Länge aus diesen beiden Werten wieder zusammensetzen:
1
ArLenght = MIDI.getData1() | (MIDI.getData2() << 8);
Gast
Erstmal Danke für eure Antworten!

Die Array-Längen Bestimmung hätte so wohl tatsächlich nicht geklappt, 
wie ich es vor hatte, ich denke
1
unsigned int ArLenght = MIDI.getSysExArrayLength();
tut es aber.

Leider löst es aber nicht mein Problem.
Ich habe jetzt mal alles auskommentiert und mir nur einen Text ausgeben 
lassen:
1
  if (MIDI.read()) {
2
  byte type = MIDI.getType();
3
  switch (type) {
4
     case ControlChange:
5
        cc = MIDI.getData1();
6
        val = MIDI.getData2();
7
        Serial.print("CC: ");
8
        Serial.print(cc);
9
        Serial.print(" Value: ");
10
        Serial.println(val);
11
        break;
12
     case SystemExclusive:
13
        Serial.println("Jawoll");
14
        break;
15
  }
16
  }

Wenn es irgendwas mit der Array-Lenght zutun hätte, müsste es ja jetzt 
funktionieren, da ich ja nur abfrage, welchen Typ von Daten ich 
empfange.
Mit MIDI_SYSEX_ARRAY_SIZE = 255 spuckt er mir ganz artig mein "Jawoll" 
aus, wenn ich die aber auch nur ein Byte höher setze, reagiert der 
Teensy garnicht nicht mehr, sobald die ersten SysEx-Daten vom Synth 
gesendet wurden.. Also auch ControlChange Daten werden nicht mehr 
ausgespuckt, bis ich den Teensy neu starte..
Gast
Okay anscheinend hab ich die Lösung gefunden, falls jemand auch auf das 
Problem stößt:

In der midi.ccp - Datei (aus der MIDI-Bibliothek)
1
case 0xF7:
2
            if (getTypeFromStatusByte(mPendingMessage[0]) == SystemExclusive) {
3
              
4
              // Store System Exclusive array in midimsg structure
5
              for (byte i=0;i<MIDI_SYSEX_ARRAY_SIZE;i++) {

das Statement zu
1
for (unsigned int i=0;i<MIDI_SYSEX_ARRAY_SIZE;i++) {

ändern und dann funktionierts!

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 10 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.