Beiträge von techlit

    Nutzt du vier einzelne Sevsegs oder eines mit vier 7-Segment-Ziffern?

    Habe jetzt etwas herumprobiert, jedoch noch mit keinem positiven Ergebnis. So langsam vermute ich auch, ob ggf. mein MIDI-USB-Kabel nicht ganz in Ordnung ist. Immerhin kommen völlig unterschiedliche Sachen an, je nachdem ob ich an MIDI-Kabel oder LoopMidi sende. Ich glaube ich probiere es mal mit einem Kabel eine Stufe qualitativer...

    Ich nutze kein fertiges Modul, sondern einzelne 7-Segmente, die über einen MAX7219-Treiber angesteuert werden. Der MAX7219 kann insgesamt 64 Leds schalten, das reicht sowohl für die 7-Segmente als auch für alle anderen Leds an meinem Spieltisch. Für den Treiber gibt es auch eine passende Arduino Library.

    Die Lösung mit LoopMidi + HairlessMidi ist meines Erachtens recht robust. Ich hatte jedenfalls bislang keine Probleme mit fehlenden oder fehlerhaften Nachrichten. Mit MIDI-Kabeln habe ich noch keine Erfahrung gemacht.

    Ich bin damit nicht so vertraut. Diese Sysex sind aber statisch wenn man es einmal eingerichtet hat? Dann würde es ja reichen den Hex einfach zu prüfen um was es sich handelt ohne ihn umwandeln zu müssen oder?

    Was meinst du mit "umwandeln"? Die Sysex versenden die Werte der Labels als Text, zusammen mit ein paar HW-spezifischen Steuerinformationen. In dem Beispiel wird die Setzernummer also nicht als Zahl, sondern als ASCII-codierter Text übertragen. Wenn man die Steuerinformationen von der Sysex-Nachricht abschneidet, kann man sie dann z.B. einfach auf ein LCD-Panel ausgeben.

    Okay, dann muss man es wirklich nicht machen. Hat sich das mal geändert? Ich weiß noch damals (zwei jahre oder so) habe ich nicht diese Signale rausbekommen.

    Ich nutze GO in Version 3.9.0, und da ist das Verhalten wie beschrieben. Mit früheren Versionen habe ich keine Erfahrung, daher kann ich nicht sagen ob sich das irgendwann mal geändert hat.

    Ich würde trotzdem eher nicht Sysex nutzen sondern pures Midi. Ist einfacher weil man sich beim auslesen mit MIDIUSB das konvertieren spart.

    Für Labels wie z.B. die Setzernummer geht das leider nicht, weil man die in GO nur per Sysex versenden kann. Für normale Schalter ist pures Midi natürlich die bessere Wahl.

    Ganz einfach, weil du bei der Zweiwege Lösung neben einer Setzer Logik im Arduino zusätzlich den Abgleich mit GO über ein komplexes Protokoll wie Midi abwickeln musst. Beide Teile müssen ja die identischen Informationen haben. Bei einem Spieltisch der einfach nur Taster hat ist das noch ganz simpel. Midisignal für den zugewiesenen Setzer schicken und fertig. Aber wenn der Spieltisch dann auch signalisieren soll welche Register nun aktiv sind (was erst einmal nur GO weiß), dann muss deine Steuerung irgendwie an die bei GO hinterlegten Daten kommen und abgleichen.

    Diesen Gedanken verstehe ich ehrlich gesagt noch nicht, aber vielleicht reden wir auch über verschiedene Dinge. Wieso braucht es überhaupt eine Setzer-Logik im Arduino? Der Arduino, der meinen Spieltisch kontrolliert, speichert zum Beispiel gar keinen eigenen Zustand sondern zeigt einfach immer nur das an, was GO per Midi übermittelt (also vor allem den Zustand der Setzerschalter, die Setzernummer und die Registerschalter). GO schickt dabei die Midi-Nachrichten immer dann, wenn sich der Zustand eines Schalters in GO ändert, unabhängig davon wie der Schalter betätigt wurde. Es ist also egal ob ich ein Register mit der Maus einschalte, oder mit dem physischen Schalter (d.h. per noteOn-Nachricht vom Arduino an GO). In beiden Fällen schickt GO eine noteOn/noteOff-Nachricht zurück an den Arduino, wodurch die Led des betreffenden Registerschalters ein- bzw. ausgeschaltet wird. Ich muss mir im Arduino gar nicht merken, welche Register gerade ausgewählt sind, sondern einfach nur auf die eingehenden Midi-Nachrichten reagieren. Wenn ich den Setzer weiter schalte, schickt GO nicht nur per Sysex-Nachricht die neue Setzer-Nummer, sondern automatisch auch alle noteOn/noteOff-Nachrichten für diejenigen Register, die sich geändert haben. Eine Synchronisierung zwischen dem Arduino und GO, wie du sie ansprichst, ist somit eigentlich nicht nötig (oder ich verstehe nicht, was du damit meinst). Der Arduino muss einfach immer nur den Zustand ausgeben, den GO per Midi meldet. Mit den Callback-Handlern der Arduino Midi Library funktioniert das auch ganz wunderbar und ergibt schön einfachen Code :).

    GO benutzt hier das Sysex-Nachrichtenformat von Hauptwerk. Das erste Byte 0x7d ist die feste Herstellerkennung, das darauffolgende Byte 0x01 ist der Code für eine LCD-Nachricht. Dann folgen zwei Bytes für die ID des anzusteuernden Panels (hier 0x01), und schließlich noch ein Byte für die Farbcodierung (hier 0x00). Danach kommt dann der Text als 32 Byte 7-bit ASCII. Nachzulesen ist das alles in der Bedienungsanleitung von Hauptwerk. Wenn man nur ein Panel selbst ansteuern will, kann man die ersten 5 Bytes der Nachricht auch ignorieren und nur die benötigten Bytes aus dem Text extrahieren. Diese lassen sich dann auch ganz einfach ausgeben, es handelt sich ja bereits um Text.

    Ich stelle mir nun die Frage, was muss ich tun, um die dreistellige Anzeige aus GO via Arduino auf ein Display zu transportieren. Denn genau dafür kann die Anzeige doch Sysex senden.

    Benutzt du weiterhin die Arduino Midi Library auf dem Controller? Falls ja, kannst du die Sysex-Nachrichten ganz einfach über einen Callback abfangen, und dann dein Display direkt mit dem empfangenen Text ansteuern.

    Dieses Beispiel schreibt die empfangene Setzer-Nummer auf drei 7-Segment-Anzeigen. Wenn du stattdessen ein LCD-Panel ansteuern willst, kannst du einfach dafür eine passende Library nehmen. Bei der Ansteuerung ist noch darauf zu achten, dass data hier am Anfang auch das Startbyte 0xF0 und am Ende das Abschlussbyte 0xF7 enthält. Hairless-Midi zeigt dir in den Debug-Nachrichten nur die Sysex-Nachricht zwischen Start- und Endbyte an, daher ist im Code der Index um eins höher als man vielleicht erwartet.

    Falls dir ein ausführlicheres Codebeispiel für den Arduino bei der Programmierung hilft, kannst du mal hier schauen. In MIDIControl.cpp findest du unter anderem den Code, den ich benutze um aus GO heraus die Setzer-Nummer mit einem Arduino auf einem 7-Segment-Panel anzuzeigen (allerdings versende ich in GO 16 Byte String Werte statt 32 Byte LCD Werte, das Prinzip ist aber das gleiche).

    Ich würde dir den Ratschlag geben nur über deinen Spieltisch zu arbeiten. Bedeutet dein Arduino kümmert sich um alles und sendet nur noch was für Register gewählt werden sollen. Dann musst du zwar eine Logik schreiben welche die Daten speichert, aber das ist kein Problem. Beispiel du hast 30 Register und 10 Setzer. Dann erstellst du für jeden ein Array mit 30 Felder. Dort speicherst du einfach für jedes Register 0=Aus oder 1=An. Wenn du nun Taste 1 drückst, dann sendet dein Programm in einer Schleife einfach für jedes Register NoteON/OFF. Da deine Steuerung weiß was los ist kann sie auch selbstständig LED's schalten und ein Display ansteuern. GO müsste nur einmalig ein Signal senden wenn es gestartet wurde, damit dein Arduino den aktuellen Stand beim Start senden kann.

    Ja, das kann man natürlich auch machen. Mir stellt sich allerdings die Frage, wieso es gerade für Programmiereinsteiger einfacher sein sollte gleich die ganze Setzerlogik selbst zu implementieren, anstatt einfach den internen Setzer von GO zu benutzen :) Der lässt sich über MIDI ja prinzipiell genauso ansteuern wie etwa die Registerschalter.

    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 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);