Archiv verlassen und diese Seite im Standarddesign anzeigen : per MIDI 6 Relais schalten, Arduino Uno Sketch Frage
Hallo zusammen,
ich bin Musiker und möchte ein kleines Gerät bauen, bei dem ich per angeschlossener Keyboard-Tastatur über MIDI-Note-On/-Off jeweils ein Relais an- bzw. ausschalten kann (mit unterschiedlichem Schaltverhalten). Konnektivität wird mit den "alten" MIDI-Buchsen realisiert, also an den UNO Rx/Tx per vorgeschalteter Elektronik mit Optokoppler usw. Ich habe gegoogelt und diverse Sachen gelesen, aber ich verstehe es nicht, wie es gemacht wird. Daher meine Frage hier ins Forum: würde es unter Euch jemanden geben, der mir für den Arduino Uno einen solchen Sketch schreibt? Selbstverständlich gegen Bezahlung, die vorher vereinbart wird. Falls "ja", bitte per PM oder hier im Thread antworten.
Andi
Für den Controller ist MiDi eine ganz normale serielle Schnittstelle mit den Parametern 31250b/sek 1 Startbit 1Stopbit kein Parity Bit (31250,8,N,1).
Senderseitig kommt eine MiDi Leitung per 220 Ohm Widerstand an +5V, die andere Midi Leitung per 220 Ohm an den Ausgangspin des Controllers.
Empfängerseitig wird ein Optokoppler ( laut Spezifikation ein PC900 von Sharp ) per 220 Ohm Widerstand an diese beiden Leitungen angeschaltet.
Am Ausgang des Optokopplers kann man dann die MiDi Signale wieder abgreifen ( !Pull Up widerstand ).
Andere Optokoppler gehen auch - Von Lösungen mit CNY 17 Optokopplern würde Ich aber absehen - Das hat bei mir noch nie richtig funktioniert, auch wenn im Internet anderes behauptet wird.
Hier ein Beispiel mit MiDi in und Thru. (https://www.pjrc.com/tech/midi-drums/sch-midi.html)
Ein Note On Befehl besteht aus 3 Bytes.
1. Note On = 9x ( das x steht hier für den Midi Kanal auf dem die Note gesendet wird; 0...F )
2. Die gedrückte Note = XX ( Das XX ist hier die gewälte Note; 00...FF )
3. Und zuletzt die Anschlagstärke ( Velocity )= XX (Das XX ist hier die Anschlagstärke = 00...FF)
Beispiel:
0x91,0x80,0x80 wäre ein Note On befehl auf Kanal 2! in der Mitte der Tastatur ( welche Note genau müsste Ich jetz nachschlagen - Google hilft ) mit mittlerer Anschlagdynamik.
Tabellen wären hier. (https://www.google.com/search?source=univ&tbm=isch&q=midi+noten+tabelle&client=firefox-b-d&fir=xr7kkfF0QImS0M%252CA4F_Uu8Tm8QJBM%252C_%253Boa Xwb-Hd3dhszM%252CWCoB7VueU7RQ7M%252C_%253BiWsJgD7hn8Mg yM%252CU8enksrVoUKewM%252C_%253BQIFfLyQhJnQc-M%252CFZbDvPpyQo1v1M%252C_%253BQA1Ic5VqbzXzIM%252C A4F_Uu8Tm8QJBM%252C_%253BMQgcaB1m4ljTXM%252CUGI1Al g4jf6xpM%252C_%253BucscSfqU_r2gqM%252CrE1z60Eog7Yc OM%252C_%253Bo6yblCXoOjAm4M%252CefHajitdnH4VXM%252 C_%253BG-4tCOf6vVttRM%252CGM8bq-4L1KU4yM%252C_%253BwocSq-Avd0xGTM%252CcYFIW2oDHohMUM%252C_%253BRbXrSuCbOGt3 DM%252CDYK9Z_c0lyXR9M%252C_%253BPEBXEgd_TZUguM%252 CtcQSJDLGhcYR4M%252C_%253BOZo5a1udAtFYvM%252Cj_XD4 6A4yO4lwM%252C_%253BCwbTk6Uj6B2UqM%252Czubtt1gkp6z d2M%252C_%253BU-52pZRWfGjMdM%252CYFXPlZ9Wmkqr3M%252C_%253BMEOYBarc aUVq3M%252CL9Fe-DB-zI6M2M%252C_%253BEE7f79DtYmN8LM%252Cesorq-LmUMLiRM%252C_%253BsDGT02cCag8v7M%252CDYK9Z_c0lyXR 9M%252C_&usg=AI4_-kQhQTT9fPj6UORM90CMRTPHTKHDxQ&sa=X&ved=2ahUKEwiO8eXbnLT5AhVGO-wKHXomD68QjJkEegQIAhAC&biw=1680&bih=897)
Ein Note off Befehl ist genauso aufgebaut, lediglich das erste Byte ist 8x.
Ein Note On Befehl mit der Velocity 00 bewirkt das gleiche wie ein Note Off Befehl und wird deshalb von vielen Herstellern auch so benutzt.
Das musst Du für dein Keyboard selbst rausfinden wie das dort gemacht wird.
Für Midi selbst gilt, das Befehle immer >=80 (hex) sind.
Das lässt sich prima für einen Empfänger brauchen, da man bei Werten über 0x80 immer weiss, das es sich um einen Befehl handelt und je nach Befehl noch eine gewisse Anzahl von Bytes kommen müssen.
Eine Besonderheit ist hier der sog. MiDi Running Mode.
Hierbei wird der Befehl - also das erste Byte - Nur einmal gesendet.
Danach folgen nur noch Parameterwerte bis sich der Befehl wieder ändert.
Ob das bei Deinem Keyboard benutzt wird, sollte sich in der MiDi Spezifikation deines Instruments finden lassen.
Es ist ein Option die nicht zwingend benutzt werden muß!
Eines deiner Probleme wird sein, das wenn Du eine Taste losslässt, für diese Taste ein Note On mit der velocity 0 oder ein Note Off gesendet wird.
Das ließe sich meiner Meinung nach ändern, wenn Du das mit Toggeln machst.
Ein Note on mit velocity >00 schaltet das Relais ein. Ein weiteres Note On der selben Taste Velocity >00 schaltet das Relais wieder ab.
Auch ein Ein und Ausschalten über eine Oktave wäre möglich. Ein C auf der tieferen Oktave schaltet das Relais aus. Ein C auf der höheren Oktave schaltet das Relais ein.
Bei mehr als 7 Relais kannst Du ja auch die Halbtöne zwischen den Oktaven mit verwenden.
Noch ein Tipp:
Ich würde die Notenwerte zumindest für das erste Relais aus im EEPROM des Controllers speichern.
Du kannst dann dein Relais Interface in einen "learn Modus" bringen ( z.B. ein schalter ) - Auf dem Keyboard die entsprechede Taste drücken - Der Controller speichert das im EEPROM ab (Note On + Notenwert ).
Somit liesse sich das Ganze sehr schnell an jedes Keyboard anpassen, ohne sich Gedanken über Notenwerte oder MiDi Kanäle machen zu müssen.
Die restlichen Werte für die weiteren Relais kann der Controller dann sehr einfach berechnen.
Zum Treiben der Relais könntest Du ein ULN2803 IC verwenden.
Direkt an die Controller Pins würde Ich die Relais nicht anschalten.
Solche Relais Platinen mit Treiber gibts bei diversen Internethändlern zu kaufen.
Ich hab mir da auch mal ein Buch besorgt "MiDi in Theorie und Praxis" vom Elektor Verlag.
Das Buch ist leider etwas unstrukturiert, zeigt aber viele Beispiele vor allem an Hardware.
Bei der Erstausgabe des Buchs war der 8051 Controller aktuell - Beispiele für den Arduino sind da somit nicht drin.
Eventuell gibts ja eine Bücherei, die das Buch führt?!
Ja - Dann kannst Du ja schon mal mit dem Basteln beginnen!
Wow! Danke für Deine sehr umfangreiche Antwort!
Die MIDI-Listen, Note-On/-Off, CC usw kenne ich, den Aufbau z.B. eines Bytes für Note-On oder -Off ebenfalls. Die Theorie dbzgl. ist mir nicht unbekannt bzw. gibt es dazu ja viele Infos im www. Die Hardwareseite (Aufbau MIDI-Interface für den UNO) kenne ich auch, hab davon schon mehrere gebaut und seit Jahren fehlerfrei im Einsatz. Die "Hürde" auf meiner Seite liegt nicht im Verständnis bzw. Realisierung der Hardware, sondern tatsächlich im Schreiben eines solch speziellen Sketches. Es geht ja hier nicht einfach um das Schalten einer LED mit einem Taster (obwohl auch das schon eine Voraussetzung ist, um weiterführende Sketches zu schreiben), sondern um das "Übersetzen" von MIDI-Bytes in Schaltbefehle. Hier stosse ich persönlich an meine Grenzen. Analoge Technik verstehe ich, Programmiersprachen aber sind (und bleiben es wohl auch) für mich Alien-Technologie. Was für Dich möglicherweise völlig selbstverständlich klingt (in Deinen Ausführungen), lässt mir den Kopf rauchen ;-) Heisst nicht, ich könnte das nicht verstehen irgendwann, aber das dauert einfach Wochen und Monate bei mir (auch aus Zeitgründen).
Ich habe 2 Module gefunden, die industriell hergestellt werden. Aber leider sind die nur begrenzt für mich verwendbar, da die von mir gewünschten Schaltvorgänge und Einflussnahme von diesen Geräten nicht angeboten werden. Ausserdem möchte ich die Möglichkeit haben, den Sketch zu verändern (andere Bytes einsetzen, Schaltfunktionen ändern).
Wenn Du so in der Materie steckst, wie ich es auf Grund Deiner obigen Antwort vermute, könntest Du Dir vorstellen, mir diesen Sketch zu schreiben? Bezahlung nach Absprache usw.
Andi
Im Prinzip kannst Du Dich an jedem Sketch bedienen der eine MiDi In Funktion hat.
Die Schnittstellenparameter passen da ja schon.
Ein sog. Parser zum auseinanderdröseln der MiDi Bytes dürfte da auch enthalten sein.
Guck mal nach MiDi zu CV oder MiDi zu Drum Convertern - Die könnte man evtl. problemlos umwandeln.
Dü müsstest dann eigentlich nur eine Tabelle aufbauen, bei der die benötigten MiDi Daten drin sind.
Passt eine eingegangene MiDi Message mit einer aus der Tabelle zusammen, wird eine Reaktion ausgelöst - Also Relais Ein bzw. Aus.
Um da was selber anzupassen musst Du allerdings verstehen wie der Sketch zumindest grob funktioniert.
Wie gesagt die Einstellungen für die Hardware sollten ja schon mal passen.
Mit einem konkreten Arduino Sketch kann Ich Dir leider nicht dienen. Ich progge die AVR- Controller noch immer mit reinem C, weil Ich meine Platinen auch selber entwerfe.
Schade, aber hab trotzdem Dank für Deine Antworten!
"...evtl. problemlos umwandeln..." Wenn's so einfach wäre ;-)
Andi
Guck mal hier (https://github.com/one-quaker/midi-to-relay/blob/master/MIDI_note_Input.ino), Das sollte doch ausbaufähig sein?!
Hier vielleicht als Ergänzung: Die Teensy Boards arbeiten auch mit der Arduino IDE und wohl auch mit der originalen Midi Library. Da gibt es in der Doku auch ein paar Grundlagen zu Midi
https://www.pjrc.com/teensy/td_libs_MIDI.html
Eigene Erfahrung damit habe ich aber nicht.
@wkrug: Ohhh, das auf Github sieht sehr interessant aus. Das könnte ein Ansatz werden. Lieben Dank für den Hinweis!
@Mxt: Ebenso vielen Dank. Der Teensy... der kommt immer wieder aufs Spielfeld... Mit dem hab ich mich noch nicht näher befasst, aber gerade für MIDI scheint der einige Vorzüge zu haben. Dein Link gibt da ja schon interessante Infos! Vielen Dank für Deine Antwort + Link.
Andi
Hallo,
hier muss ich zunächst erstmal selbst paar Sachen richtig verstehen, denn 0x90 meint nicht ein MIDI-Byte (Data-Byte) ausserhalb der 127er MIDI-Tabelle (0x7F), sondern das Statusbyte für Note-On.
Daher habe ich meinen ursprünglichen Thread hier wieder gelöscht.
Asche auf mein Haupt!
Danke für Eure Antworten bisher.
Andi
Und hier die Erfolgsmeldung!
Es funktioniert. Die Hürde lag u.a. darin, dass ich Hex und MIDI-Note durcheinandergebracht hatte. Ich war zunächst der Annahme (entsprechend der mir vorliegenden Dokumentation), dass der vorgegebene Wert 0x90 die MIDI-Note definiert (also das 2 Byte im 3er-Pack Note-On/-Off), aber das galt tatsächlich für das erste Byte (Statusbyte), und dort ist lt. MIDI-Spezifikation 0x90 bzw. 0x80 eben für Note-On bzw. -Off vorgemerkt. Ich bin stutzig geworden, weil 0x7F eigentlich die höchste MIDI-Note ist, und 0x90 war da doch sehr weit drüber.
Na gut, dadurch habe ich gleich in meinen eigenen Unklarheiten bzgl. dieser MIDI-Befehle ein wenig Ordnung gemacht.
Der Sketch, den Du mir verlinkt hattest (@wkrug), ist für mein Vorhaben eine sehr gute Basis. Nochmals lieben Dank!!!
Andi
Denk bitte auch noch dran, das 0x90 nur für den MiDi Kanal 1 gilt.
Das zweite nibble gibt noch den Kanal an ( Bei MiDi gibt es 16 ) also von 0x90 .... 0x9F sind also alles Note On Befehle auf dem jeweiligen Kanal.
Darum auch der Vorschlag mit der "Learn" Geschichte weiter oben, da man meistens nicht genau weiss auf welchem Kanal das Keyboard gerade sendet.
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.