Midi über Uart

Gast #393575
Lesenswert?

Hallo, ich versuche schon länger ein Midi-Signal über die Uart
einzulehsen. Ich habe ein Midi-Keyboard über einen Optokoppler am
RXT-Pin angeschloßen, und die Bautrate auf 31250 gestellt. Dann hab ich
mich über das Midi-Protokoll informiert, und erfahren, das ich 3 bytes
einlesen muß. Und genau da liegt mein Problem. Wie lese ich diese 3
Bytes richtig ein ( mit Bascom ) ? Muß das irgendwie Syncronisiert
werden ? Für Hilfe bin ich sehr Dankbar!!!
Gast #393578
Lesenswert?

Hmmm, der folgende Code geht leider auch nicht. Ich trete irgendwie auf
der Stelle. Könnte mir jemand weiter helfen ? Wie beckomme ich
wenigstens das erste (Statusbyte) richtig eingelesen ???

Danke !


$regfile = "m16def.dat"
$crystal = 12000000
$baud = 31250

Dim I(3) As Byte , A As Byte , X As Byte

Cls

X = 0

Do



   A = Udr
   If A.7 = 1 Then
      I(1) = Udr
   End If
   A = Udr
   If A.7 = 1 Then
      I(2) = Udr
   End If
   A = Udr
   If A.7 = 1 Then
      I(3) = Udr
   End If





   Locate 1 , 1
   Lcd Bin(i(1))
   Locate 2 , 1
   Lcd I(2)
   Locate 3 , 1
   Lcd I(3)


Loop
Gast #393580
Lesenswert?

Ich habe auch mal einen Midi-Analyzer programmiert, ist gar nicht so
einfach. Stelle Dir das ganze Midi-Protokoll wie eine große
State-Machine vor.

Warte auf ein Byte, untersuche es und springe davon abhängig in einen
anderen State.
Mit den drei hintereinanderfolgenden if-Abfragen wie in Deinem Beispiel
klappt das nicht, da Du keine States hast.

Wenn mich nicht alles täuscht, habe ich -nachdem ich es in Pascal
programmiert hatte- im Netz ein ganz ähnliches C-Programm gefunden.

Soll ich es Dir heraussuchen?
Gast #5781566
Lesenswert?

Es sind nicht immer 3 Byte Befehle:
Es gibt auch 2 Byte Befehle, z.B. channel Aftertouch, ProgrammChange
sowie auch 1 Byte Befehle, z.B. MIDI Clock, Start, Stop, Continue, Tune 
Request.
Nicht zu vergessen MTC, da sind es 32 Bytes, noch schlimmer wird's bei 
SysEx Befehlen, da ist die Anzahl der Bytes ungewiss. Man weiß erst nach 
Eintreffen von F7 wie viele Bytes eingetrudelt sind.
Dann ist auf jeden Fall noch der Running Status zu berücksichtigen, 
wobei Status-redundanten Channel Befehle nicht gesendet werden und zwar 
so lange bis der Status gewechselt wird. Ausnahme sind System- und 
Realtime messages. All dies muss berücksichtigt werden um einen 
MIDI-Analyzer erfolgreich zu programmieren.
Ist aber kein Hexenwerk.
Man muss nur die eingehenden Daten in der richtigen Reihenfolge 
abfragen.
1st System messages, alle Daten & 0xF0
2nd Channel messages, alle Daten & 0x80
3rd running status, dazu am besten eine eigene RS_Byte Variable 
verwenden:

RS_Byte is cleared at power up
RS_Byte stores the status when a ChannelMessage 0x80...0xEF is received.
RS_Byte is cleared when a SystemMessage 0xF0...0xF7 is received.
Nothing is done to RS_Byte when a RealTimeMessage is received.
Any data bytes are ignored when RS_Byte is cleared.

Das sollte helfen

lg Rolf

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren