MIDI-Eingang ohne Optokoppler

Hallo!

Ich arbeite momentan an einem Musikprogramm für den ESP32. Das funktioniert soweit. Jetzt möchte ich aber die Möglichkeit, ein Keyboard / einen Synthesizer mit MIDI an den ESP32 anzuschließen. Ich denke, dass das nicht so viel anders bei einem Arduino Uno sein wird. Und ich habe hier (Bei Step 10) einen Aufbau für das Empfangen von MIDI-Signalen gefunden. Mein Problem ist, dass ich dafür einen Optokoppler benötige. Ich würde das aber gerne ohne Optokoppler hinkriegen, da ich gerade keinen rumliegen habe. Ich habe schon mit so einem MIDI/USB-Anschluss versucht, einen COM-Port an meinem PC zu erzeugen, aber der hat das bei Audio-Geräten reingepackt und mit Processing kann ich nur COM-Ports abgreifen.
Meine Frage wäre: Kann man vielleicht aus einer Aufbaut mit Widerständen und Transistoren den Optokoppler in dieser Schaltung ersetzen? Alternativ, kann man den MIDI-Anschluss als COM-Port installieren?

Gruß
HTML-Fan

Nun, MIDI ist eine Stromschleife. Du kannst den Optokoppler natürlich umgehen, aus Kompatibilitätsgründen würde ich es nicht empfehlen.
Also Widerstand ran und ab in den Eingang.

Ich hatte sowas auch schonmal versucht, aber nur komische Ergebnisse gehabt. Aber da hatte ich auch 220 Ohm verwendet, das war nämlich der Widerstand, den ich auch schon verwendet hatte, um MIDI zu verschicken. Welchen Widerstand würdet ihr empfelen?

Bevor wir hier weiter über Lösungen diskutieren: zeig Deinen Aufbau. Wo hast Du was angeschlossen?

HTML-Fan:
Meine Frage wäre: Kann man vielleicht aus einer Aufbaut mit Widerständen und Transistoren den Optokoppler in dieser Schaltung ersetzen?

Bei meinen MIDI-Spielereien vor ein paar Jahren habe ich mir eine Notiz/Bemerkung in den Code geschrieben. Demzufolge habe ich lediglich eine passende DIN-Buchse (-Kupplung, Weible) und einen Widerstand benötigt. Für die Verbindung zum PC habe ich ein MIDI-Gameport-Kabel - ein Ende kommt in den Gameport der Soundkarte, das andere Ende in die erwähnte MIDI-Buchse.

// Anschluss (DIN-Buchse von der Lötseite/hinten gesehen):
// - Der mittlere Anschluss ist mit der Abschirmung verbunden
//   und geht an GND
// - Der rechte Anschluss geht über einen 220-Ohm-Widerstand
//   an +5V
// - Der linke Anschluss geht an TX bzw. RX

Gruß

Gregor

@gregorss Ich habe das mal so aufgebaut und ich bekomme immernoch diese komischen Werte. Hier die hexadezimalen Werte:

0
40
0

bekomme ich, wenn ich die höhste Taste meines Synthesizers drücke, einmal beim Drücken und beim loslassen. Wenn ich das tiefste C spiele, dann gibt das

0
0
0

, aber das kriege ich auch beim tiefsten E.
Das Programm:

#include <SoftwareSerial.h>
SoftwareSerial midi(2, -1);
void setup() {
  Serial.begin(115200);
  Serial.println("Hallo");
  midi.begin(31250);
}
void loop() {
  if(!midi.available())return;
  byte input = midi.read();
  Serial.println(input, HEX);
}

HTML-Fan:
@gregorss Ich habe das mal so aufgebaut und ich bekomme immernoch diese komischen Werte. ...

Hm. Kannst Du ein Schaltbild posten? Mein MIDI-Gebastel von damals habe ich nicht mehr, sonst würde ich ein Foto von der Rückseite der MIDI-Buchse machen. Wenn ich mich recht erinnere, besteht eine MIDI-Nachricht aus mehr als nur einem Byte (Kanal, Note, Befehl oder so).

Gruß

Gregor

PS: Was mir noch einfällt: Bei der Verwendung von SoftwareSerial zum Empfangen ging ab und zu etwas verloren, wenn auf dem MIDI-Bus viel los war.

Hallo,
mein Schaltplan sollte korrekt sein, denn wenn ich stattdessen in den Input meines Synths reingehe, dann kann ich mit dem Midi-Beispielprogramm virtuell auf die Tasten hauen.
Mir ist aus jenem Beispielsketch auch klar geworden, das Midi aus jeweils einem Byte für Kanal, Höhe und Wucht besteht. Ich habe daher erwartet, dass ich zum Beispiel für den tiefsten Ton 0x90 (Kanal 0), 0x00, 0x7F und für den Höhsten sowas wie 0x90, 0x39, 0x7F erwartet.

HTML-Fan:
Hallo,
mein Schaltplan sollte korrekt sein, denn wenn ich stattdessen in den Input meines Synths reingehe, dann kann ich mit dem Midi-Beispielprogramm virtuell auf die Tasten hauen.
Mir ist aus jenem Beispielsketch auch klar geworden, das Midi aus jeweils einem Byte für Kanal, Höhe und Wucht besteht. Ich habe daher erwartet, dass ich zum Beispiel für den tiefsten Ton 0x90 (Kanal 0), 0x00, 0x7F und für den Höhsten sowas wie 0x90, 0x39, 0x7F erwartet.

Was denn jetzt? Im OP schreibst Du was vom Empfangen, jetzt vom Senden. Beschreibe doch wenigstens, was genau Du tun willst, wie Dein Setup aussieht und was nicht funktioniert.

Gruß

Gregor

Ich möchte empfangen. Als Test der Verkabelung habe ich aber mal verschickt. Das ging. Das Problem ist das Empfangen.

HTML-Fan:
Ich möchte empfangen. Als Test der Verkabelung habe ich aber mal verschickt. Das ging. Das Problem ist das Empfangen.

Wie gesagt, beim Empfang über Softserial ging bei mir ab und zu etwas verloren. Was hast Du um zu testen? MIDI-Keyboard und Synthesizer?

Gruß

Gregor

gregorss:
Was hast Du um zu testen?

Zum Testen nutze ich einen Korg DW-6000.

Mein Aufbau ist der, der auch für das IDE-Beispielprogramm Midi verwendet wird. Muss ich vielleicht Pins tauschen, wenn ich statt senden empfangen möchte? Vielleicht + und RX/TX?

Okay, das war's nicht. Wenn ich das tausche, dann bekomme ich nichts mehr, nicht mal 'nen kaputten Arduino. Ich stehe auf dem Schlauch.

Invertier mal das Signal (Schuss aus der Hüfte)