Forum: Mikrocontroller und Digitale Elektronik MIDI senden: was ist 0, was 1?


von Pekka (Gast)


Lesenswert?

Guten Abend,


ich habe Schwierigkeiten mit MIDI OUT. Auf
http://www.personal.kent.edu/~sbirch/Music_Production/MP-II/MIDI/midi_physical_layer.htm 
lese ich:

"A zero current is a 'logical 1' for MIDI"

Und auf http://www.doc.ic.ac.uk/~nd/surprise_97/journal/vol1/aps2/

"Every MIDI message transmitted starts with a 'Start Bit', this is when 
the signal current drops to 0mA, and is followed by a byte of data (Most 
Significant Bit (MSB) is transmitted first) and finishes with a "Stop 
Bit", which is when the current returns to 5mA"


Kann es sein, dass hier "5 mA current" und "und 5V voltage" (die ja 0 mA 
bedeuten) verwechselt werden?

In einem älteren Thread schrieb Knut Ballhause:

> Genau das ist falsch. Der Ruhepegel bei MIDI ist zwar HIGH, aber es
> fließt in dem Moment kein Strom durch die MIDI-Leitungen, da diese
> zwischen Treiberausgang und VCC mit jeweils einem Widerstand in Serie
> verschaltet sind. Der Treiber gibt also High aus und das entspricht VCC:
> es fließt kein Strom. Bei Low am Treiber hingegen fließt Strom über das
> Kabel und die LED des Optokopplers am Empfänger nach VCC. Schließt man
> eine normale LED polrichtig an eine MIDI-OUT Buchse, kann man also die
> LOW-Pulse sehen, bei HIGH ist die LED aus.


So hatte ich es eigentlich auch verstanden: Eine Strom-Schleife, bei der 
ein Pin an 5 V ist und der andere am UART. Wenn der auf LOW gezogen 
wird, fließt Strom und im Optokoppler gegenüber blinkt es. Der 
Ruhe*pegel* ist HIGH, also kein Strom, das Startbit LOW, das Stopbit 
wieder HIGH.
Aber wie ist das mit den Datenbits? Ich dachte eigentlich, dass ein 
LOW-Pegel auch eine 1 bedeutet, aber dann las ich das hier: 
http://www.electronics.dit.ie/staff/tscarff/Music_technology/midi/midi_messages.htm

Da ist es so beschrieben, dass das Startbit mit einem LOW-Pegel erzeugt 
wird, Datenbits aber mit HIGH.

Ich habe zum Testen nur einen Yamaha RY-8 und ein PICKit mit Logic 
Analyzer da. Leider haut der RY-8 zu jeder Zeit Signale raus, auch wenn 
er gestoppt und jeglicher MIDI-Output abgeschaltet ist, sodass ich nicht 
gezielt bestimmte Daten senden und lesen kann. Diese Daten sind genau 
128 µS lange LOW-Pulse. Da ein Bit 32 µS dauert, heißt das es wird nach 
dem Startbit noch 3 x LOW gesendet. Würde HIGH wirklich einer Daten-1 
entsprechen, wäre das Byte 00011111 = 0x1f. Das ist aber keine gültige 
MIDI-Message. Anders herum schon: 11100000 = 0xE0 = Pitch Bend. 
Allerding folgen dann keine Datenbytes. Der RY-8 kann (Gitarren) Töne 
vom Audio-Eingang in MIDI umwandeln. Vielleicht versucht er das 
permanent und sendet einfach Pitch Bend ohne Daten wenn kein Audio 
anliegt.


Oder ist es doch so, dass im Ruhezustand Strom fließt?

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Pekka schrieb:
> Würde HIGH wirklich einer Daten-1
> entsprechen, wäre das Byte 00011111 = 0x1f. Das ist aber keine gültige
> MIDI-Message.

Wie mein DX7 wird dein Gerät einfach ActiveSense Signale senden (0xFE). 
Das machen m.W. viele Yamaha Geräte.
http://www.midi.org/techspecs/midimessages.php
Wenn du noch Sync Features nutzt, könnte es auch die Timing Clock (0xF8) 
sein.

: Bearbeitet durch User
von Clemens L. (c_l)


Lesenswert?

Pekka schrieb:
> "Most Significant Bit (MSB) is transmitted first"

Die MIDI-Spezifkation sagt: "Bytes are sent LSB first."

> Kann es sein, dass hier "5 mA current" und "und 5V voltage" (die ja 0 mA
> bedeuten) verwechselt werden?

Nein; MIDI funktioniert als Stromschleife. Die Spezifikation sagt 
"Logical 0 is current ON." (Eine gewisse Spannung wird für die LED des 
Optokopplers benötigt, aber die wichtige Größe ist der Strom.)

Siehe http://www.midi.org/techspecs/electrispec.php :
Die Ausgangsschaltung wandelt High- bzw. Low-Pegel in 0 mA bzw. 5 mA um.
Der Optokoppler in der Eingangsschaltung wandelt 0 mA bzw. 5 mA in High- 
bzw. Low-Pegel um.

> Aber wie ist das mit den Datenbits? Ich dachte eigentlich, dass ein
> LOW-Pegel auch eine 1 bedeutet

Auch für die Datenbits gilt "Logical 0 is current ON".

> Leider haut der RY-8 zu jeder Zeit Signale raus, auch wenn
> er gestoppt und jeglicher MIDI-Output abgeschaltet ist, sodass ich nicht
> gezielt bestimmte Daten senden und lesen kann. Diese Daten sind genau
> 128 µS lange LOW-Pulse. Da ein Bit 32 µS dauert, heißt das es wird nach
> dem Startbit noch 3 x LOW gesendet.

Ein Active Sense-Byte wäre ein 64-µs-Puls. Bist du sicher, dass die 128 
µs korrekt gemessen wurden?

von Pekka (Gast)


Lesenswert?

Ha! Die obigen Quellen widersprechen sich auch noch, was die 
Bit-Reihenfolge angeht: Einmal heißt es MSB first, einmal LSB.

Mit LSB first und active HIGH (Bit=1 bei Spannung, also wenn kein Strom 
fließt) macht es endlich Sinn: Die Strom-Bitfolge 1110000 wird zu 
11111000 = 0xF8 = Clock. Gelegentlich gibt es auch 10000000, daraus wird 
dann 11111110 = 0xFE = Active Sense.

Dieses Internet aber auch... jede Menge Infos, aber die Hälfte ist 
einfach falsch.

von Pekka (Gast)


Lesenswert?

Clemens L. schrieb:
> Nein; MIDI funktioniert als Stromschleife. Die Spezifikation sagt
> "Logical 0 is current ON." (Eine gewisse Spannung wird für die LED des
> Optokopplers benötigt, aber die wichtige Größe ist der Strom.)

Eben deshalb ist das hier Quatsch:

"Every MIDI message transmitted starts with a 'Start Bit', this is when
the signal current drops to 0mA, and is followed by a byte of data (Most
Significant Bit (MSB) is transmitted first) and finishes with a "Stop
Bit", which is when the current returns to 5mA"

Im Ruhezustand fließen 0 mA. Wenn die Spannung auf 0V fällt, fließen 5 
mA = "logical 0" = Start Bit. Dann kommt das LSB. Also Spannung, Strom 
und Bitreihenfolge verwechselt.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Angehängte Dateien:

Lesenswert?

Vllt. hilft das beiliegende Schema noch ein wenig. UART bezeichnet hier 
direkt die Pins am MC, also mit CMOS/TTL Pegel und nicht das bei RS232 
benutzte Spannungsschema.
Da sieht mans also nochmal:

Clemens L. schrieb:
> Auch für die Datenbits gilt "Logical 0 is current ON".

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Die Bitreihenfolge entspricht bei MIDI der bei RS232 verwendeten - d.h. 
jede UART, die mit Pegelwandlern für RS232 verwendet werden kann, kann 
auch für MIDI verwendet werden, sofern man die MIDI-spezifische Baudrate 
von 31250 Baud einstellen kann.

Und so kann man mit einem AVR und einem "glatten" Quarz (also keinem 
sogenannten "Baudratenquarz") recht unproblematisch MIDI-Geräte bauen, 
denn 31250 lässt sich glatt aus 1 MHz und entsprechenden Vielfachen 
davon erzeugen.

von Pekka (Gast)


Lesenswert?

Danke Euch.

von Pekka (Gast)


Lesenswert?

Super, jetzt funktionierts (MIDI senden). Gleich noch eine Frage:

In der Stromschleife fließen im Kurzschluss ca. 8 mA, über den MIDI-Port 
des RY-8 sind es noch 3,5 mA. Das ganze läuft bei 3,3 V. Muss ich noch 
Widerstände einbauen? Eigentlich ist das eher schon etwas knapp, weil es 
ja 5 mA sein sollten, oder?

von Clemens L. (c_l)


Lesenswert?

3,5 mA sind zu wenig; deine Widerstände sind zu groß. Wie sieht denn 
deine Schaltung aus?

von Pekka (Gast)


Lesenswert?

Die "Schaltung" sieht so aus, dass das MIDI-Kabel direkt am Link-Port 
eines Game Boy Advance hängt. Ohne Widerstände, weniger geht also nicht.

Ich sende dem RY-8 seit 10 Minuten MIDI-Clock und er läuft brav im Takt, 
aber das kann natürlich bei anderen MIDI-Geräten anders aussehen. Ist 
halt eine experimentelle Bastellösung, die aber so simpel ist, dass man 
sie einfach mal ausprobieren kann, bevor man sich einen teuren Adapter 
kauft (Arduinoboy, MIDI Bastl). Zumindest kann man bei diesen geringen 
Strömen nichts kaputt machen.

von Clemens L. (c_l)


Lesenswert?

Viele Optokoppler schalten ab 1,6 mA, aber es gibt auch MIDI-Geräte, die 
wirklich 5 mA verlangen.

Ich vermute mal, dass der Ausgang des Gameboy-Mikrocontrollers einfach 
zu schwach für 5 mA ist. (Deshalb hat die offizielle Schaltung auch zwei 
Inverter.)

von Pekka (Gast)


Lesenswert?

Das ist jetzt etwas OT, aber ich versteh das MIDI-Clock Schema nicht so 
ganz:

Wenn ich dem RY-8 ein Start sende, braucht er noch 6 mal Clock, bis er 
wirklich startet. Ich hätte gedacht, das es gleich beim ersten Clock 
losgeht.

Ist das wirklich der Standard, dass der Slave erst mal eine 1/16 Note 
wartet, bevor es losgeht? So eine Art Vorzählen?

von Clemens L. (c_l)


Lesenswert?

Wahrscheinlich weiß der RY-8 noch nicht, wie schnell er laufen soll, 
weil vor dem Start keine Clocks kamen, oder weil er sie da ignoriert 
hat.

von Pekka (Gast)


Lesenswert?

Das muss er auch nicht wissen, dafür bekommt er doch den Takt? Naja, 
wenn das die Norm ist, passe ich halt die Software entsprechend an, ggf 
mit einstellbaren vor-Clocks. Nur verstehen tu ichs hat nicht so ganz.

von Pekka (Gast)


Lesenswert?

Der RY-8 braucht einfach nur eine Millisekunde zwischen Start und dem 
ersten Clock (steht auch so in der MIDI-Spec), dann gehts. Er hat zwar 
immer noch eine konstante Latenz von 8 Millisekunden, bis mal ein Ton 
kommt, aber das kann man ja am Master kompensieren, wartet der halt 
bissl.

von J. S. (engineer) Benutzerseite


Lesenswert?

Ich glaube auch, dass der einfach intern noch etwas arbeitet, bis er 
loslegt und da nur zufällig noch 6 Starts kommen, wenngleich 8ms etwas 
langsam sind. Mein RM1X ist da offenbar flinker.

Was ich nicht sehe, ist, das am Master zu kompensieren. Ohne MTC musst 
du brav sequenziel abspielen, die Latenz bleibt ja ...(?)

Wegen des Themas der Optokopplertreiberleistung: Ich würde einen 
Aktivsplitter hernehmen, also einen Verteiler auf elektrischer Ebene, um 
mehrere Geräte zu timen und zu versorgen. Also keinen MIDI-Verteiler und 
auch keine "THROUGH"-Ketten.

von MIDIMAN (Gast)


Lesenswert?

Welchen empfiehst Du da ?

von J. S. (engineer) Benutzerseite


Lesenswert?

Alle, die das hardwaremässig machen, also das Signal direkt wieder als 
MIDI-Stromschleifensignal, möglichst entkoppelt, zur Verfügung stellen, 
also kein logisches Routing verwenden. Das musst Du im Einzelfall in der 
GA nachlesen. Suche mal nach MIDI Patchbay.

Ich selber mache das direkt in DIY-Hardware. Ansonsten verwende ich eine 
MIDI IF von MIDIMAN und MOTU allerdings alle mit logischem Routing.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.