Pages: [1]   Go Down
Author Topic: Arduino Mega 2560 MIDI Controller Input-Befehle werden nicht richtig gelesen  (Read 647 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 2
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Guten Abend!

Ich habe mir einen MIDI-controller gebaut welcher über meinen arduino läuft.
Alle MIDI-OUT befehle funltionieren super, nur beim Lesen gibt es Probleme:

Die Programmierung scheint soweit korrekt zu sein, da es ca. jedes 3 Mal funktioniert.

Code:
void midilesen()
{
  if(Serial.available())
  {
    // MIDI-Daten lesen und speichern
    commandByte = Serial.read();
    noteByte = Serial.read();
    velocityByte = Serial.read();
   
    //Note erkennen für LED (playledlinks)
    if(commandByte==144)
    {
      if((noteByte==23)&&(velocityByte>0)) //NoteON
      {
        digitalWrite(playledlinks, HIGH);
      }
      if((noteByte==23)&&(velocityByte==0))  //NoteOFF
      {
        digitalWrite(playledlinks, LOW);
      }
    }
  }
  while(Serial.available()) //Serial-Buffer lehren
  {
    Serial.read();
  }
  // Variablen zurücksetzen
  commandByte = 0;
  noteByte = 0;
  velocityByte = 0;
}

Was könnte ich tun, damit der Befehl für die LED fehlerfrei gelesen wird?

PS: Es treten sogar fälle auf, bei denen die LED angeht, obwohl sie ausgehen sollte :/
Logged

Offline Offline
Edison Member
*
Karma: 21
Posts: 1419
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Du liest 3 Mal aus der seriellen Verbindung, ohne zu prüfen ob überhaupt Daten vorhanden sind. Du prüfst nur einmal am Anfang der Funktion und das Serial.available() liefert auch bei einem Byte schon TRUE.
Code:
    commandByte = Serial.read();
    noteByte = Serial.read();
    velocityByte = Serial.read();
Serial.read() wartet nicht auf Daten sondern liefert "-1" wenn keine da sind. Manchmal werden die Daten schnell genug überragen, manchmal aber nicht.
Ich würde einfach statt
Code:
if(Serial.available())
ein
Code:
if(Serial.available()>=3)
verwenden.
Und warum löscht Du nach einem erkannten Befehl alle folgende aus dem Puffer. Das ist keine gute Methode, da Du so folgende Befehle "vernichtest".

Mario.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 2
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Vielen Dank, werde ich morgen ausprobieren.
Ich bin davon ausgegangen, dass mir die eingehenden MIDI-befehle immer 3 Bytes liefern, daher habe ich auch sofort alle drei abgefragt.
Ich habe am Ende alle weiteren gelöscht, um zu verhindern, dass eventuell halbe Befehlsfetzen liegen bleiben, welche bei der nächsten abfrage zu falschen ergebnissen führen (war ein verzweifelter korrekturversuch).
Dabei bin ich davon ausgegangen, dass der Controller schnell genug ist, um vor der nächsten eingabe alles gelöscht zu haben.

Gruß

edit: Hat sehr gut funktioniert, Danke!
« Last Edit: February 27, 2013, 05:26:10 am by Katofffel » Logged

Pages: [1]   Go Up
Jump to: