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?
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.
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?
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.
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.
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".
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.
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?
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.
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.)
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?
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.
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.
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.
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.