MIDI-Controller selbst bauen

  • Ersteller BonesLazy
  • Erstellt am
Mittlerweile habe ich rausgefunden, dass man in Bitwig eine API einbinden kann und dort einen relativen ControlChange anlegen kann. Mit meinem bisherigen Halbwissen müsste es so funktionieren, dass wenn ein CC-Wert von Null gesendet wird, der Wert eines Reglers in Bitwig um Eins gesenkt wird. Wird ein CC-Wert von 127 gesendet, dann wird der Regler in Bitwig um Eins erhöht.
Folglich reicht es, wenn der Hardwarecontroller bei einen Linksdreh einen CC-Wert von 0, und bei einem Rechtsdreh einen Wert von 127, sendet.

Versteh ich nicht ganz. Klingt so, als würdest du nur CC-Werte von 0 bzw. 127 senden wollen. Das würde mit einfachen Tastern auch gehen. <Was ist mit den Zwischenwerten?

Ein Encoder arbeitet mit einem 2-Bit-Quadrature-Code. D.h. er hat 3 Anschlüsse aus dem eimal ein Impuls und die Drehrichtung hervorgeht. Entweder brauchst du dazu eine Hardware oder du machst das im Sketch softwaremäßig. Aber beides ist nicht ohne.

Ich will mir gerade einen Monitorcontroller mit einem Arduino-Uno bauen und versuche das als Hybridlösung - also Hardware- und Software - zu lösen. Damit habe ich den geringsten Aufwand.
 
Ich will mir gerade einen Monitorcontroller mit einem Arduino-Uno bauen und versuche das als Hybridlösung - also Hardware- und Software - zu lösen.
Weil ich mit der Haptik aller mir bekannten MIDI-Controllern nicht zufrieden bin, möchte ich mir meinen eigenen Hardwarecontroller bauen. So wie du auch mit einem Arduino.
Weil mich das Ganze ziemlich fordert, möchte ich erste einmal eine abgespeckte Version bauen. Mein Controller braucht einen Drehimpulsgeber (Rotary Encoder), welcher vorerst einen festgelegten ControlChange sendet. Außerdem möchte ich drei Taster haben, mit welchen ich die Geschwindigkeit des Drehgebers bestimmen kann.

Ich habe mich nun für diesen Drehgeber entschieden:
CNC-Drehgeber.jpg


Der hat einen Durchmesser von 60mm und macht 100 Impulse pro Umdrehung. Die 100 Impulse sind mir wichtig, weil man bei den handelsüblichen Hardwarecontrollern mit nur 24 Impulsen mehrere Umdrehungen braucht, um von 0 auf 127 zu regeln. Bei dem hier ist das fast mit nur einer Drehung möglich.

Ganz wichtig ist mir auch, dass der Controller im RelativeModus arbeitet. Und hier weiß ich noch nicht genau, wie das geht. Eigentlich ist in der MIDI-Spezifikation vorgesehen, dass CC-Nummer 96 und 97 Increment-, bzw. DecrementWerte sendet und man irgendwie die ControlChangeNummer angeben kann. Hier nochmal ein Link dazu: http://www.doepfer.de/controller/overview.htm
Das werde ich wahrscheinlich so nicht lösen. Ich habe als DAW Bitwig. In Bitwig hat man die Möglichkeit eigene Controllerscripts einzubinden.

Bisher ist mein Konzept folgendes:

-Hardware mit einem Arduion Uno bauen.
-Die MIDI-Daten über USB in den PC schicken.
-Das Programm Hairless https://projectgus.github.io/hairless-midiserial/ empfängt die Daten und sendet diese zu
-LoopMIDI https://www.tobias-erichsen.de/software/loopmidi.html welches die Daten für Bitiwg bereit stellt.
-In Bitiwg wird ein ControllerScript erstellt, welches die Daten verarbeitet.
 
Der hat einen Durchmesser von 60mm und macht 100 Impulse pro Umdrehung. Die 100 Impulse sind mir wichtig, weil man bei den handelsüblichen Hardwarecontrollern mit nur 24 Impulsen mehrere Umdrehungen braucht, um von 0 auf 127 zu regeln. Bei dem hier ist das fast mit nur einer Drehung möglich.

Wenn du später einmal die Empfindlichkeit feiner machen willst, dann geht das nur mit einer entsprechenden Hardwareänderung oder über Software. Indem du z.B. jeden 2. oder 3. Impuls übergehst. Ansonsten wird es zur Frimelei nur um 1en Impuls zu erhöhen bzw. zu erniedrigen.
 
Indem du z.B. jeden 2. oder 3. Impuls übergehst.
So habe ich mir das vorgestellt.
Für eine langsame Geschwindigkeit wird jeder Impuls eine MIDI-Message auslösen. Für eine normale Geschwindigkeit wird jeder zweite oder dritte Impuls übersprungen und für eine schnelle Geschwindigkeit werden pro Impuls drei MIDI-Messages vom Controller gesendet.

Für MIDI 1.0 sind 100 Impulse pro Umdrehung eventuell viel zu fein. Ich möchte den Controller aber auch in Hinblick auf MIDI 2.0 bauen, wenn der Wertebereich eines ControlChange viel größer als von 0 bis 127 sein wird.
 
Für eine langsame Geschwindigkeit wird jeder Impuls eine MIDI-Message auslösen. Für eine normale Geschwindigkeit wird jeder zweite oder dritte Impuls übersprungen und für eine schnelle Geschwindigkeit werden pro Impuls drei MIDI-Messages vom Controller gesendet.

Für MIDI 1.0 sind 100 Impulse pro Umdrehung eventuell viel zu fein. Ich möchte den Controller aber auch in Hinblick auf MIDI 2.0 bauen, wenn der Wertebereich eines ControlChange viel größer als von 0 bis 127 sein wird.

Bedenke: Bei 100 Impulsen bei einer Umdrehung hast du einen Drehwinkel von 3,6 Grad. Wenn du einen Midiwert nur um einen Zähler erhöhen bzw. verkleinern willst dann schießt du schnell übers Ziel hinaus und hast gleich mehere Werte übersprungen. Da musst du dann sehr vorsichtig den Encoder drehen. Also schnelles Arbeiten wird dann nicht mehr möglich sein.
 
Wenn du einen Midiwert nur um einen Zähler erhöhen bzw. verkleinern willst dann schießt du schnell übers Ziel hinaus und hast gleich mehere Werte übersprungen.
Darum werde ich in der Arduinosoftware bei der langsamen Einstellung ein oder zwei Impulse überspringen lassen, bevor der MIDI-Wert um eins hochgezählt wird.
 
Das ist bei meinem Kenntnisstand Overkill. o_O
LEDs kommen bei mir nicht in Frage, weil ich gerne einen großen Knopf haben möchte.
 
Wenn es Dir nur um den Geber geht: Ich verwende in meinem Workstation-Controller einen solchen:
Das sind Geber für schnell drehende Achsen auch Maschinen, haben 6mm Achse, teilweise mit Abflachung. Gibt es in 600 ... 1200 Pulsen je Umdrehung. Damit kann man ein sehr feines jog-wheel aufziehen. Wenige Winkelgrade reichen schon für eine ausreichende Zahl an Pulsen, um auch eine Beschleunigungsauswertung zu machen.

Maschinengeber.jpg
 
LEDs sind auch bei mir inzwischen überwiegend obsolet. Mein aktueller MIDI-Controller ist inzwischen komplett virtualisiert und gibt seine Daten auf FPGA-Video aus. D.h. man kann das skalieren und anzeigen wie man will. Unter anderem die Stellung aber auch eine Skalenrückmeldung, z.B. den Pegel / Audiometer oder den RMS.
midicontroller15pcscreen.jpg
 
Wenn es Dir nur um den Geber geht: Ich verwende in meinem Workstation-Controller einen solchen:
Das sind Geber für schnell drehende Achsen auch Maschinen, ... Gibt es in 600 ... 1200 Pulsen je Umdrehung... Wenige Winkelgrade reichen schon für eine ausreichende Zahl an Pulsen, um auch eine Beschleunigungsauswertung zu machen.

Danke für den Tipp. Bisher hatte ich noch keine gesehen, die so viele Impulse erzeugen können. Solch ein Drehimpulsgeber kommt dann in meinen ultimativen MIDI-OneKnobController MK III. Dafür, dass ich zur Zeit noch viel zu viel zu lernen und auszuprobieren habe und mir bis vor Kurzem noch nicht sicher war, dass ich das Projekt stemmen kann, ist der mir zu teuer. Ich habe Preise um die 70€ dafür gesehen.
Ich denke mit MIDI 1.0 komme ich noch gut mit 100 Impulsen/Umdrehung zurecht. Wenn sich MIDI 2.0 mal etabliert hat werde ich sicherlich auf einen solchen Drehgeber zurück kommen.

Ich komme schon einigermaßen voran. Ein kleiner Teil des Codes für den Arduino Uno ist schon fertig.
Wenn ich mit dem ersten Prototypen fertig bin, wird auch ein Display eingeplant. Schließlich soll man mit meinem OneKnobController mehrere CCs senden können und muss diese Umschalten können. Dafür werde ich zusätzlich ein Nummernpad einbauen.
 
Wenn sich MIDI 2.0 mal etabliert hat werde ich sicherlich auf einen solchen Drehgeber zurück kommen.
Darauf wollte ich nicht warten. Ich habe schon vor fast 20 Jahren angefangen, mit MIDI Controller zu bauen, die wenigstens 230k konnten und auch höhere Auflösungen hatten. Zunächst für den DIY-Synth im TMS320 und später für die FPGA-Plattform. Mit der wird der schnelle Controller auch ausgewertet. Der ist aber auch für MIDI 1.0 Geräte nutzvoll, weil es ja einfach um das schnelle und genaue Senden von MTC geht. Einen normalen Drehgeber muss man 3-4 Stellungen drehen, um überhaupt eine sichere Bewegung mit Geschwindigkeit ausgeben zu können. Das sind beim einem 24er schon 50-60 Grad. Damit kriegt man keine sinnvolle Transportfunktion hin. Wenn es um das genaue Stellen geht, z.B. auch bei DJ-Funktionen kommt man um einen guten Drehgeber nicht herum.

Im Gegensatz zu den typische optischen / magnetischen Versionen ist der mechanisch einfach unschlagbar stabil, weil er komplett kugelgelagert ist. Du musst also kein Lager mehr vorsehen und brauchst keine Passung oder hast Spiel und es leier aus wie die vielen Plastiklösungen auf dem DJ-Controller Markt. Man muss nur einen schweren Aluknopf montieren, damit die Trägheit überwunden ist und er eine gute Haptik abgibt. Ich habe mit im Werkstudentenpraktikum mal einen gedreht - es gibt aber auch breite Aluknöpfe in der Bucht zu kaufen. Die sind zwar kein Vollmaterial sondern innen hohl, aber da kann man ein paar schwere Stahlmuttern einkleben, um Masse zub bekommen. Zusammen ist man mit 15,- dabei.
 
Was bedeutet 230k? 230.000 ist klar, aber wofür 230k?
Ich gehe davon aus, dass damit die Übertragungsgeschwindigkeit ( Baud- Rate) gemeint ist. Beim normalen MIDI Protokoll (5pol DIN) liegt diese nur bei 31250.
 
Ja, das normale MIDI macht nur 31,5k. Daher gab es ja schon Ende der 90er Keyboards mit einem "to host" Interface, die mit z.B. 230k liefen. Das war damals (unter Windows) das Machbare. Ich habe mir dazu selber Controller gebaut:
http://www.96khz.org/htm/midicontroller16.htm

In der Automatisierung und der Medizintechnik ging das protokollmäßig stringent weiter - vor allem mit der Auflösung. Ich habe mal ein Panel entwickelt, dass mit Windows-CE lief und an das mehrere Drehencoder angeschlossen wurden. Das lief schon mit 460k unter Linux mit den Anfang der 2000er erhältlichen UARTs und Treibern. Heute fahren wir serielle Protokolle vom USB-Chip in PLDs / FPGAs mit 3Gbps.

Leider ist die Musikbranche stehengeblieben und dudelt heute immer noch mit 31,5k, obwohl die MIDI-Optokoppler (auch in Stromschleifentechnik) erheblich mehr könnten. Nur unter USB kriegt man vernüftige Bandbreite, bei umständlichem Protokoll.

Was die Geber angeht, liefern die professionellen Versionen genug Impulse, um binnen ms die Drehzahlen von Maschinen um die 3000UPM konstant zu regeln, sie nehmen also geringe Drehzahländerungen war. Die Auswertung erfordert digitale Auflösungen im MHz-Bereich, also schon schnelle Controller oder eben programmierbare Bausteine.

Für uns reichen hier die einfachsten Chinabauten. Die sind so fein gelagert, dass fast kein Spiel existiert, sie sind auch träge und reibend genug, dass ein Fingerschnipp an der Achse zu gerade einer halben Drehung führt, obwohl sie kein Rastmoment haben. D.h. sie sind ohne Startkraft zu drehen, aber Erschüttungen des Gerätes führen nicht zu einer Werteänderung.

Gekauft habe ich die bei unterschiedlichen Herstellern in der Bucht. Ein Link macht wenig Sinn, weil die Aktionen rasch enden, aber man kann nach folgendem Suchen:
"600 Inkrementaler Drehgeber Incremental Rotary Encoder"
"Rotary Encoder Schaft 6mm Welle 2-Phasen"
Da kommen einige Händler, letztlich wahrscheinlich nur 2-3 unterschiedliche Hersteller.

Der Anschluss erfolgt über z.B. 6V-15V mit open-Kollektor-Ausgang und man bekommt je nach Modell bis zu 2400 Impulse je Drehung (2 digitale Signale im 90 Grad-Versatz). Wenn ich eine vollständige 2-Fingerbewegung mache und einen üblichen Drehknopf für 6er Achse, also z.B. einen 20mm Knopf nehme, bekomme ich über 1000 Impulse / 2 Zehntelsekunden mit einem Maximum von 8000 / Sekunde. Der Encoder kann mehr, als das Doppelte. Für einen großen 30mm Drehknopf und ausreichend genaue Transportfunktion, bekommt man zwischen 10 und 20 Winkelgrade = 60-120 Pulse.

Als Anwendungsgebiete gibt der Lieferant an:
- Guillotine-Maschinen mit fester Länge aus Leder
- Rennroboter für Studenten
:)
 
Als Anwendungsgebiete gibt der Lieferant an:
- Guillotine-Maschinen mit fester Länge aus Leder
- Rennroboter für Studenten
:):):)

Der Anschluss erfolgt über z.B. 6V-15V mit open-Kollektor-Ausgang
Ist da irgendwas anders als bei meinen 08/15-Drehgeber? Bisher brauchte ich nur VCC und Ground vom Arduino Uno nehmen und die Schaltkontakte des Encoders über Pullupwiderstände an die Eingänge des Arduino anschließen.
 
die haben open collector, d.h. die Treiben aktiv. Die darf man nur über Widerstände betreiben.

Mein optischer Drehgber hat die Bezeichnung LPD3806. Aus Beschreibungen habe ich herausgefunden, dass man die Signalwege A und B direkt an die Inputs des Arduino anschließen kann, wenn man (die internen) Pullupwiderstände nutzt. Allerdings soll man aufpassen, dass man die Signalwege nicht versehentlich an VCC anschließt, da sonst die Treiber des Drehgebers kaputt gehen.
Wenn ich darauf aufpasse, dann kann ich eigentlich nichts kaputt machen, oder?
 
Jetzt habe ich den optischen Drehgeber einfach mal wie die anderen Drehgeber über externe Pullupwiderstände an die Inputs des Arduino angeschlossen und die Spannung für den Drehgeber direkt aus dem Arduino geholt. Leider funktioniert das nicht. Ich vermute die Spannung am Arduino bricht ein, weil die On-LED auf der Arduinoplatine ausdimmt und nach wenigen Sekunden nicht mehr leuchtet.

Hier sind nähere Infos zu meinem Drehgeber:
http://domoticx.com/sensor-lpd3806-optical-rotary-encoder/

EDIT: Ich hatte Plus und Minus vertauscht. Die Spannung am Arduino ist jetzt stabil. Leider funktioniert der Encoder nicht. Habe ich den etwa zerschossen, weil ich die Polarität verwechselt habe?

EDIT: Nix passiert. Der Drehgeber ist noch in Ordnung und funktioniert. Ich habe meine externen Pullupwiderstände entfernt und die internen Pullupwiderstände verwendet. Nun funktioniert es prinzipiell.
 
Zuletzt bearbeitet:

Neue Antworten


Oft gelesene Themen

Zurück
Oben