MIDI-Daten über USB senden

  • Hallo


    ich bin auf der Suche nach einer Lösung leider im Netz auf nichts Passendes gestoßen, vielleicht kann mir einer weiterhelfen:


    Ich wüsste gern, wie ich MIDI-Daten (Noten-Events, Controller-Werte, etc) über USB verschicken kann.




    Hintergrund ist folgender:


    Ich würde mir gern meinen eigenen MIDI-Controller mit diversen Buttons und Potis bauen. Diese will ich per GPIO mit dem Raspi verbinden. Für den Raspi will ich mir dann ein Programm schreiben, dass die über GPIO gelesenen Daten auswertet und in MIDI-Daten übersetzt, welche dann auf den USB-Port gelegt werden. Den Raspi würde ich dann über USB-A auf USB-A mit meinem Rechner verbinden, wo die MIDI-Daten ankommen sollen.
    Hat jemand sowas schonmal gemacht?


    Gruß


    Sancho

  • Hi,


    ... dann über USB-A auf USB-A mit meinem Rechner verbinden, wo die MIDI-Daten ankommen sollen.
    ...


    Das wird nicht funktionieren. Der RPi müsste sich als Gerät am USB "anmelden". Das geht aber mit dem Raspi nicht. Das heisst: Du hast zwar einen physikalische Verbindung zwischen Rechner und RPi ... aber die Logikschicht fehlt. Du kannst also keine Verbindung zum vom PC zum RPi aufbauen ...
    Aber mal angenommen, es würde funktionieren, wie geht's dann weiter?
    Ich meine, dann tropfen Dir irgendwelche Daten aus dem USB-Port ... was geschieht damit?


    cu,
    -ds-

    • Official Post

    Ohne Raspi, dafür mit Arduino hab sich sowas ähnliches hier schon mal gebaut. Es gibt auch ne Arduino midi lib, so dass man direkt Steuersignale senden kann (aber ich mag ja python und es war für mich der einfachere Weg die Signale erst am PC zu bauen;) )

    Der Unterschied zwischen Genie und Wahnsinn definiert sich im Erfolg.

    Edited once, last by dbv ().

  • Ja, wie gesagt, ich dachte das würde irgendwie gehen und hatte auf Tipps gehofft. Ja genau, ich dachte auch, es müsste ja auf PC-Seite dann irgendeinen USB-Treiber geben, der mit meinem Controller kommuniziert. Ist es doch nicht so machbar wie ich dachte...
    dbv: Ich versteh deinen Thread jetzt nicht vollständig, aber mir scheint, du gibst deine Signale nicht über USB aus, sondern über MIDI.


    Würde es denn funktionieren, wenn ich ich am Raspi über GPIO stinknormale MIDI-Signale aussende, und dann ein MIDI-to-USB-Interface verwende?

  • Hallo Sancho,


    Dir geht es doch lediglich darum, irgendwelche Einstellungen, die über GPIO des RPi erfasst wurden, an einen PC weiter zu geben. Wenn es über USB nicht gehen sollte, bleibt Dir doch immer noch über LAN / WLAN / UART.


    Für LAN benötigst Du (sofern nicht vorhanden) einen LAN-Switch und zwei LAN-Kabel.


    Wenn der PC über WLAN verfügt, dann brauchst Du einen WLAN-Stick für den RPi. Wie solch ein Teil eingerichtet wird, ist hier im Forum breitgetreten worden.


    Und UART solltest Du eigentlich nicht benötigen. Wenn doch, gibt es hier im Forum auch einige Ansätze, die zum Ziel führen.



    Das Hauptproblem wird dann nur in der Hardware für den MIDI-Controller bestehen und der Software für den RPi, was er mit den GPIO-reignissen anstellt und was er wie an den PC sendet. Und das klingt auch nicht so wahnsinnig kompliziert ;)


    Beste Grüße


    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    • Icon-Tutorials (IDE: Geany) - GPIO-Library - µController-Programmierung in Icon! - ser. Devices - kein Support per PM / Konversation

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

  • dbv: Ja genau das will ich.


    Andreas: WLAN wäre natürlich noch cooler. Aber ich stehe hier grundsätzlich irgendwie auf dem Schlauch.


    Ich weiß erstmal, wie ich mit dem Raspi auf GPIO in & out zugreifen kann. Soweit so gut. Aber wie dann weiter? Wie kann ich dann über USB (oder noch besser über WLAN) MIDI-Events verschicken? Wie bring ich meinem PC bei, dass einen MIDI-Controller einrichtet, der über USB bzw. WLAN funktioniert?


    Gibt's dazu irgendwelche konkreten Code-Beispiele? Ich will ja erstmal im Trockenen üben: Also irgendein Testprogramm mit dem Raspi-Schreiben, das beliebige MIDI-Signale über USB/Wifi verschickt und sehen, wie die an meinem Rechner ankommen ...

    • Official Post

    Dann mach das ganze per simplen Socketserver/client. Der Pi ist der Client und schickt Veränderungen zum PC (auf welchem der Socketserver läuft). Der nimmt sich das gesendete und baut ein MIDI Signal dauas, welches du an virtuelles MidiInterface sendest (z.B. loopMidi).
    Z.B. sendet mein "Client" einfach nur btn_1 sobald Knopf1 gedrückt wurde, der Server weiss dann, dass er sobald er btn_1 empängt ein bestimmtes CC Signal (MidiChannel1, Value 127 oder 0) bauen soll

  • Hallo Sancho,


    die Idee von dbv mit Sockets hatte ich auch gerade.


    Das kannst Du Dir so vorstellen:
    Auf dem PC läuft eine Software (Socket-Server), der einen Port auf einer URL-Adresse / Netzwerk-Adresse öffnet.


    Auf dem RPi läuft eine Software (Socket-Client), der sich auf diesem Port des Servers einwählt. Üblicherweise folgt hier ein Authentifizierungsschritt, damit sich niemand anders, der zufälligerweise diese Zugangsdaten hat, sich auch einwählen und irgendwelchen Unfug anstellen kann.
    Entweder: Authentifizierung gescheitert => Server trennt die Leitung
    Oder: Authentifizierung erfolgreich => Server lauscht auf Daten des Client.


    Danach wertet der Client die GPIO-Ereignisse (interrupt-basiert) aus und schreibt jede neue Erkenntnis in einem Format, das Client und Server "verstehen". Dies kann MIDI sein - kann aber auch ein Phantasie-Produkt sein.


    Der lauschende Server liest dann (ereignisbasiert) die Mitteilungen des Client und kann damit z.B. eine MIDI-Software steuern.


    Das Grundgerüst für Server und Client sind ca. 20 Zeilen Code. Dann steht die Verbindung. Alles weitere dient der Sicherheit (Authentifizierung) und der Ereignisbehandlung bzw. Interrupt-Handling sowie der Übertragung eines Datenformats, damit der Server damit etwas anfangen kann.


    Ebenso sollte der Client auf Mitteilungen des Servers lauschen können, um z.B. Mitteilungen zu bestätigen oder Checksummen auszutauschen.


    Unter Lazarus gibt es ein Paket lNet, dass Dir fast alles an Entwicklung abnimmt. Du musst Dir eigentlich nur noch Sachen zusammenklicken und mit Code hinterlegen. Als ich mich damit beschäftigt habe, hat die erste Socket-Verbindung nach 10 Minuten gestanden. Beide Seiten haben gelauscht, beide Seiten konnten senden, beide konnten empfangen. Der Rest ist dann reine Fleißarbeit - beiden Seiten beizubringen, was als Reaktion auf welches GPIO-Ereignis passieren soll - und was der Server mit den Daten anstellt.



    Beste Grüße


    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    • Icon-Tutorials (IDE: Geany) - GPIO-Library - µController-Programmierung in Icon! - ser. Devices - kein Support per PM / Konversation

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    Edited once, last by Andreas ().

  • Verstanden. Wie ich nen Server und nen Client schreibe, weiß ich auch. Ich stricke mir also mein eigenes Protokoll zwischen Raspi und PC. Jetzt ist nur noch die Frage: Wie erzeugt der Server dann lokale MIDI-Events?


    dbv: Hab schon gesehen, dass du loopMidi empfiehlst. Scheint aber ne Windows-Lösung zu sein. Gibt's solche Loopback-MIDI-Interfaces auch für Ubuntu?