MIDI senden: GO hängt sich auf

  • Hallo in die Runde,

    ich bereite gerade die Schaltung (simpel) und die Programmierung (komplizierter) dafür vor, dass bei Betätigung eines Registers in GO ein MIDI-Befehl gesendet wird und eine LED anschaltet. Warum? Egal ob ich Register (inkl. Tremulanten und Koppeln) via Maus, oder zukünftig via Registerschalter an der Orgel oder Setzerkombination aufrufe, es soll ein Lämpchen angehen und signalisieren, dass dieses Register angewählt ist.

    Auf der Suche nach möglichen Code-Vorlagen sind wir im Kern auf folgende beiden Herangehensweisen gestoßen, einer mitttels Controlchange, einer mittels NoteOn/Off.

    https://create.arduino.cc/projecthub/Rom…auptwerk-8406c0

    https://www.youtube.com/watch?v=AYx55nj5vSo

    Wenn ich dann den so programmierten Arduino anschließe, wird er als MIDI-Device von GO erkannt. Anschließend progammiere ich ein Proberegister im Senden-Tab und wähle als Noten-/Controller-Nummer eine aus, die ich im Code auch definiert habe, z.B. 72. Getestet habe ich sowohl mit "Alle Geräte", als auch dem gezielten Anwählen des angeschlossenen LED-MIDI-Geräts. In den Einstellungen ist der Arduino auch als Ausgabegerät ausgewählt.

    Nur einmal hat es geklappt, dass die entsprechende LED angegangen ist, d.h. mein Gedankengang hinsichtlich Programmierung kann so falsch nicht sein. Oft genug sind die Test-LEDs auch einfach ausgeblieben. Jedesmal passiert ist hingegen, dass sich GO festgefahren hat. Und zwar so gründlich, dass nicht einmal "Task beenden" gereicht hat. Es ging nur über die Eingabekonsole und taskkill mit Erzwingungszusatz.

    Kann hier einer etwas mit diesem GO-Verhalten anfangen? Was mache ich verkehrt?

  • Hier noch ergänzend die beiden Arduino-Codes, die ich verwendet habe. Vielleicht findet sich hier ja ein Kundiger dazu. In GO habe ich auch nur den separaten Arduino, der zu Testzwecken die LED-Steuerung übernehmen würde, als Output-Device definiert. Sonst sind mir keine weiteren Einstellungen aufgefallen, die ich hätte anpassen können.

    Einmal auf Basis des youtube-Videos für LED-Steuerung über Controlchange.

    Spoiler anzeigen

    Und hier noch der von dem zweiten Link:

    Spoiler anzeigen
  • Midi wird nicht überwacht oder zwangsweise gesendet. Also auch ohne Empfang im Arduino läuft das Midi weiter. Es scheint, dass es einen Code gibt, der nicht gesendet werden kann.

    Dazu müssen Sie Schritt für Schritt alle Codes senden, indem Sie alle STOPS etc. mit der Maus ein- und ausschalten

    Als zweite Möglichkeit kannst du Midi OX installieren und mit GO hinschicken und schauen was kommt. Entfernen Sie den Arduino vom Computer.

    Drittens können Sie den Arduino durch ein separates USB-MIDI-Kabel ersetzen, von dem Sie einfach die MIDI-Seite locker lassen. Probieren Sie das aus, um zu sehen, ob der Fehler von GO verschwunden ist.


    Ich hatte einmal ein falsches Midi-Signal von einem MOTOR STOP, das ich seit Monaten nicht benutzt hatte. Dies führte auch dazu, dass GO bei der Verwendung abstürzte. Nach erneuter Eingabe und Speichern war der Fehler weg.

  • Danke für die Hinweise!

    Zitat

    Midi wird nicht überwacht oder zwangsweise gesendet. Also auch ohne Empfang im Arduino läuft das Midi weiter. Es scheint, dass es einen Code gibt, der nicht gesendet werden kann.

    Dazu müssen Sie Schritt für Schritt alle Codes senden, indem Sie alle STOPS etc. mit der Maus ein- und ausschalten

    Das habe ich ehrlich gesagt nicht verstanden. Das heißt, GO sendet permanent den NoteOn Befehl, bis ich den Register Stop wieder deaktiviere? Und was ist damit gemeint, dass es einen Code gibt, der nicht gesendet werden kann bzw. der Schritt für Schritt für jedes Register gesendet werden soll?


    Das mit Midi OX ist ein guter Hinweis, probiere ich aus. Das USB-Midi-Kabel müsste ich erst beschaffen, würde ich dann im dritten Schritt probieren.

    • Offizieller Beitrag

    gemeint ist wohl dass die MIDI-Befehle gesendet werden auch ohne dass sie empfangen werden. Dabei wird Note on/off nur kurz gesendet und bleibt nicht aktiv.

    Das USB-MIDI-Kabel ist die einfachere Lösung. Es muss nicht programmiert werden und überträgt die Signale in/out

  • Ich versuche jetzt mal meine bisherigen Testbemühungen zusammenzufassen.

    Ich habe mich heute auch noch mit Midistops von Ulliken66 beschäftigt. Diese Software kommuniziert über ein virtuelles MIDI-Kabel mit GO, das loopMIDI heißt. Das habe ich installiert und einen virtuellen MIDI-Port erstellt. Den habe ich nun angesteuert, sprich eine Registeränderung an diesen Port gesendet. Zum einen habe ich mit Hairless MIDI "mitgehört", dort kommen die gesendeten Befehle von GO einwandfrei an. Liegt also nicht an GO. Wenn ich Midistops verwende, werden dort auch die richtigen Register angewählt. GO war also richtig konfiguriert.

    Das Problem scheint mir in irgendeiner Art und Weise der "LED-Arduino" zu sein. Denn wenn dan diesen gesendet werden soll, egal ob direkt von GO oder weitergeleitet von Midistops aus, friert GO oder auch Midistops ein. Und zwar so lange, bis ich das USB-Kabel vom LED-Arduino abziehe. Dann beruhigen sich GO und Midistops wieder. Mein Plan, die ganze Sache durch Midistops zu "filtern" und den Befehl von dort via loopMIDI an den Arduino zu senden funktioniert also auch nicht.

    Ich habe im Code schon angepasst, dass Serial.beginn nur mit 9600 belegt wird, da mit dieser Größe der Arduino im Geräte-Manager angemeldet ist. Bringt aber auch nichts. Ich stehe immernoch vor einem Rätsel.

  • Ich weiß, dass es Probleme mit irgendeiner Art von USB-Chip auf ARduino-Karten gibt.

    Rechteckchip oder Quadratchip machen den Unterschied. Sie sollten dies auf der ARDUINO-Website nachschlagen.

    Als ich meine ARDUINO-Karten gekauft habe, habe ich dort aufgepasst, weil ich Probleme damit bei anderen Benutzern gesehen habe.

    Es gibt auch W10-Treiberprobleme. Siehe zufällige Frage im Forum: https://forum.arduino.cc/t/issue-with-t…indow-10/690638


    Ich verwende auf dem ARDUINO kein USB für MIDI, sondern TX-, RX-Pins. midiSerial.begin(31250).

    Dies führte jedoch auch zu vielen Fehlern, die ich nirgendwo beschrieben gesehen habe: manchmal werden falsche MIDI-Signale empfangen.

    Aber für die Kommunikation /test (Serial.print) ist USB so eingestellt: Serial.begin(38400); (Windows10 usb - ARDUINO-MEGA)

    Selbst bei vielen Fehlern in meinem Arduino-Programm stürzte GO nie ab. Gebaut und getestet habe ich alles unter W7 gemacht. Sowohl GO als auch Arduino.

    ( mein GO läuft heute auf UBUNTU, aber die ARDUINO-Software ist heute auf W10. )

  • Danke für den Hinweis! Ich hatte auch schon so eine Vermutung, ob der Arduino Due, den ich verwende, vlt. der falsche ist. Habe jetzt einen Uno Klon von AZ-Delivery bestellt, denn mit einem Uno wurde auch das oben zitierte Beispiel gemacht. Deinen Hinweisen gehe ich auch noch einmal nach. Danke dafür!

  • Ich habe gute Erfahrungen gemacht mit der Arduino Midi Library + Hairless Midi + LoopMidi. Bei mir läuft dieses Setup mit einem Arduino Mega und Grand Orgue stabiler als in der Variante mit USB-Midi. Man muss der Library allerdings noch beibringen, eine von Hairless Midi unterstützte Baudrate zu verwenden:

    Code
    #include <MIDI.h>
    
    struct MySettings : public midi::DefaultSettings {
      static const long BaudRate = 38400; // Or something else supported by hairless-midiserial
    };
    
    MIDI_CREATE_CUSTOM_INSTANCE(HardwareSerial, Serial, MIDI, MySettings);
  • Den Aufbau habe ich noch nicht ganz verstanden. Werden die MIDI-Signale bei dir vom Arduino MEGA über USB an GO übertragen oder über MIDI-Buchse? Ohne MidiUSB Library wahrscheinlich eher nicht über USB.

  • Nein, ich nutze keine Midi-Buchsen, nur den USB-Port des Arduino. Ich betreibe den Arduino mit der Arduino Midi Library, allerdings ohne den USB-MIDI Transport Layer. Dann meldet sich der Arduino zwar nicht direkt in GO als Midi-Gerät an, aber überträgt die Midi-Befehle dennoch über USB als serielle Schnittstelle (RX0/TX0). In Hairless Midi kann man dann den seriellen Port des Arduino auswählen, und die Midi-Signale so in den virtuellen Loopback-Port von loopMidi einspeisen, der dann in GO auswählbar ist. Ich habe auf diese Weise einige LEDs und Taster für meinen Setzer an GO angebunden, und es funktioniert bislang ganz gut. Man muss allerdings wie oben erwähnt darauf achten, in der Arduino Midi Library die Baudrate passend einzustellen, weil Hairless Midi die Standardbaudrate von 31250 nicht unterstützt.

  • Ich habe deinen Weg mal versucht nachzustellen. Arduino Due mit MIDI-Library, keine MidiUSB. Header wie von dir oben einkopiert. Aber die LEDs gehen nicht an. Vielleicht ein Fehler im Code? Magst du dir den mal anschauen (im Spoiler)?

    Spoiler anzeigen

    GOsend.PNG

    HairlessMIDI.PNG

    loopMIDI.PNG

  • Hast du den Due über den Native- oder den Programming-Port an den Rechner angeschlossen? Die USB-MIDI Variante läuft glaube ich über den Native-Port, die serielle Kommunikation aber über den Programming-Port.

  • Bei dem ersten Test über den Native-Port. So habe ich mir das angewöhnt, weil USB-MIDI darüber läuft, ganz richtig. Jetzt habe ich es eben gerade mit dem Programming Port probiert. Im Ergebnis hat allerdings auch keine LED geleuchtet und es gab merkwürdige Fehlermeldungen in Hairless MIDI.

    Kannst du die deuten?

    HairlessMIDIPort7.PNG

  • Ich weiß zu wenig über diese Programmierung, aber ich vermisse eine Auswahl auf Kanal 10

    Mit: Serial.print(byte channel) u.s.w sieht man die drei Datenwerte, die man im Arduino erhalten hat (Im Monitormodus des ARDUINO)


    MIDI tabel:

    11001001= C9= 201
    Chan 10 Program Change
    Program # (0-127)

    11001010= CA= 202
    Chan 11 Program Change
    Program # (0-127)

    UND

    10111001= B9= 185
    Chan 10 Control/Mode Change

  • Can I use the native MIDI baud rate, 31250bps?

    It would be nice to be able to use the hardware MIDI baud rate, 31250bps. This means the logical signals from Hairless Bridge can be used with real MIDI hardware, with just some electronics to adjust the serial voltages to become MIDI current loop signals.

    Unfortunately, most computer serial ports can’t actually talk at 31250bps. For historical & technical reasons they’re usually limited to multiples of 300bps.

    However, if you’re prepared to hack around a bit, the FTDI USB/Serial chip (as found on the Arduino Duemilanove) can talk the native MIDI rate. Have a read through these Arduino forum posts and you can see how to hack the driver on OS X or Windows, so that when you choose a different rate (like 38400bps) it is actually 31250, behind the scenes.

    This is not a supported configuration for Hairless Bridge, but it can be made to work in some circumstances.


    http://projectgus.github.io/hairless-midiserial/

  • Hier mal ein neuer Zwischenstand, ich bin mittlerweile ein ganzes Stück weiter. Ich will ja von GO MIDI-Informationen an die Arduino-Welt senden. Warum? Aus drei Gründen: 1. LED-Beleuchtung der angewählten Register, 2. Anzeige der Sequenzer-Setzer-Nummer auf einem Display und 3. Anzeige der Öffnungsgrads der Schweller auf einem Display. Letzteres ist optional.

    Mein erster Ansatz war, das einfach von GO in den Äther senden zu lassen in der Annahme, ein über USB verbundener Arduino würde das schon abfangen und verarbeiten können. Aber mit all den hier geschilderten Tricks bin ich nicht weitergekommen, bis auf einen von Canticus.

    Drittens können Sie den Arduino durch ein separates USB-MIDI-Kabel ersetzen, von dem Sie einfach die MIDI-Seite locker lassen. Probieren Sie das aus, um zu sehen, ob der Fehler von GO verschwunden ist.

    Das habe ich letztendlich gemacht, ein USB-MIDI-Kabel, dazu Ausrüstung um das an einen Arduino anzuschließen (Optokoppler, Diode etc.). Das war auch erfolgreich. Eingehende NoteOn/Off Befehle, auch ControlChange, kommen an und werden verarbeitet. Daher ist Punkt 1, LED Beleuchtung, auch gelöst. Dann ich kann mir vom GO mitteilen lassen, welche Register angewählt sind, egal ob ich die manuell oder über Setzer angewählt habe. Haken dran. Muss ich nur noch schalten und verkabeln.

    Doch nun kommt eine knifflige Aufgabe, wo hier vlt. schon jemand seine Erfahrungen gemacht hat. Ich möchte die Sequenzer-Setzer-Nummer als Sysex von GO an Arduino senden und auf 7-Segment-Anzeige bzw. LCD Display anzeigen lassen. Wenn ich das mache, sitze ich jedoch merkwürdigen Phänomenen auf. Sende ich Sysex an LoopMidi, kommt in Hairless folgendes an:

    Code
    000: 0x7d 0x1 0x0 0x1 0x0 0x30 0x30 0x30 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20
      001: 0x7d 0x1 0x0 0x1 0x0 0x30 0x30 0x31 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20
      002: 0x7d 0x1 0x0 0x1 0x0 0x30 0x30 0x32 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20
      003: 0x7d 0x1 0x0 0x1 0x0 0x30 0x30 0x33 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20
      013: 0x7d 0x1 0x0 0x1 0x0 0x30 0x31 0x33 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20
      123: 0x7d 0x1 0x0 0x1 0x0 0x31 0x32 0x33 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20

    Die drei Ziffern vor dem Doppelpunkt sind die Setzeranzeige in Klarschrift. Man sieht, dass die ausschlaggebenden Bytes die Nr. 6-8 sind. 30 ist in HEX die Ziffer 0. Alles was ich für die Anzeige der 123 bräuchte, wäre die Aneinanderreihung von "31 32 33". Das lässt sich dann spielend leicht in die 123 auflösen. Aber bis dahin komme ich gar nicht. In Hairless wie gesagt diese Anzeige.

    Ändere ich in GO als Empfangs-MIDI-Device das MIDI-Kabel, dann kommt im Arduino völliger Blödsinn an. Wenn ich mir dort per Serial.Print einfach nur die empfangenen Daten ausgeben lassen will, sind diese bereits in irgendwelche Dezimalzahlen übersetzt, die keinen Sinn ergeben.

    Ich brauche aus dieser Nachricht im Grunde die Bytes 6,7 und 8 und dort muss das "0x" abgeschnitten werden, damit ich für die 123 den Wert "313233" bekomme.

    Kennt sich hier jemand damit aus?

  • Ich blick's auf die Schnelle nicht, wo du dich gedanklich befindest, aber wenn du SysEx senden willst, dann sendest du das Startbyte 240 (xF0), dann beliebige Bytes und als Abschlussbyte 247 (xF7).

    Liegt die Nachricht als Text vor? Zumindest deutet das "abschneiden" darauf hin. Binär belegen die Werte 1,2,3 zwei Bits, die man mit der Operation "Wert & 3" (in C) aus einem Byte rausfiltern kann.

    Vielleicht erklärst Du mal in kleineren Schritten, was unklar ist.