MIDI Controller selber bauen (Teil 4) Synthie steuern und if-Abfrage


In dieser Folge programmieren wir unsere MIDI-Befehle ins Programm und steuern unseren ersten Synthie mit dem selbst gebauten Controller. Außerdem schauen wir uns an wie eine if-Abfragen funktioniert und planen ein paar Bauteile für die nächsten Folgen.

Hairless MIDI – Serial Bridge:
http://projectgus.github.io/hairless-midiserial/

Die benötigten Bauteile bekommt ihr fast überall, z.B. hier:

4051 Multiplexer IC: http://goo.gl/RNrarw
220 Ohm Widerstand: http://goo.gl/b814BW
Protoboard: http://goo.gl/nEBqBo
MIDI DIN-Buchse: http://goo.gl/WmUh0h
IC Sockel: http://goo.gl/Ya7n1P
Kabel: http://goo.gl/fbYPG3
Lötzinn: http://goo.gl/UW7n3B

Programm-Code: MIDI-Controller senden

int controlChange = 176; // MIDI Kanal 1
 int controllerNummer = 21;
 int controllerWert = 0;
 int potiWert = 0;

void setup() {
 Serial.begin(9600);
}

void loop() {
 potiWert = analogRead(A0);
 controllerWert = map(potiWert,0,1023,0,127);

 Serial.write(controlChange);
 Serial.write(controllerNummer);
 Serial.write(controllerWert);
}

Programm-Code mit if-Abfrage

int controlChange = 176; // MIDI Kanal 1
 int controllerNummer = 21;
 int controllerWert = 0;
 int controllerWertAlt = 0;
 int potiWert = 0;

void setup() {
 Serial.begin(9600);
}

void loop() {

 potiWert = analogRead(A0);
 controllerWert = map(potiWert,0,1023,0,127);

 if (controllerWert != controllerWertAlt) {
  Serial.write(controlChange);
  Serial.write(controllerNummer);
  Serial.write(controllerWert);
 }

 controllerWertAlt = controllerWert;
}

Beteilige dich an der Unterhaltung

29 Kommentare

  1. Servus Götz, ja ich schon wieder..

    nur ne kurze verständnisfrage 😉
    laut meiner idee könnte man den if-sketch ja ganz einfach in ein pushbutton sketch umwandeln, der dann mit hairless ausgelesen wird.
    -> deine variablen belassen, weil eh wurscht
    ->potiWert =digitalRead(2); //mein Aufbau
    ->controllerWert =map(potiWert, 0, 1, 0, 127); //0 bis 1 weil naja..ein und aus halt, oder auch 0 bis 1023 weil bei beiden MIN bis MAX?

    so..jetzt bekomm ich die befehle zwar ans hairless aber anscheinden zu wenig bytes um sie richtig zu bearbeiten?
    hast du ne idee?

    grüße noch mal,
    Roman

  2. Update: es funktioniert nun alles prima, so wie oben beschrieben funktionierts auch auf einmal 😉

  3. Sorry, hab deinen Kommentar irgendwie übersehen…
    Ja, theoretisch geht dein Programm – aber du hast ja inzwischen sicher die Folge zu den Push-Buttons gesehen, in der das ganz anders gelöst wird.. 😉
    VG
    Götz

  4. Hallo Götz
    Woher bekomme ich denn den Potiwert der bei dir von 0-1023 geht ? Hat das einen Zusammenhang mit dem KiloOhmWert? mein Poti hat leider nur 4,7 KOHM ( Auf der Rückseite steht 4k7) Mit freundlichen Grüßen

  5. Hallo Icky,

    0-1023 kommt vom 10-Bit-Wandler im Arduino der die anliegende Spannung in einen digitalen Wert umwandelt. Bei 10-Bit gibt es eben 1024 verschiedene Stufen.

    Wenn du das Poti nur nutzen willst, um dessen Wert mit dem Arduino auszulesen (wie z.B. bei unserem MIDI-Controller) dann ist der Wert nicht so wichtig, solange er ca. zwischen 2K und 20K liegt. Außerhalb dieses Bereiches werden die Messergebnisse ungenauer. Du solltest aber darauf achten, dass du ein lineares Poti hast und kein logarithmisches. Wenn LIN draufsteht isses top, wenn LOG draufsteht, wirf das in die Kiste für Audioanwendungen.
    VG
    Götz

  6. Hallo Götz.
    Erstmal ein großes Lob für die wahnsinnig guten Videos!

    Eine Frage stellt sich mir aber noch.

    Mein Ziel ist ein MIDI-EQ zur Plugin-Bedienung in ProTools.
    Bei 5 Bändern (Freq, Q, Gain) + In, Out usw. kommt ja einiges an Potis zusammen.
    Wenn ich jetzt anfangen würde, die alle erstmal über „MidiCC learn“ zu zuweisen, ist der Spaß ja schnell vorbei.
    Gibt es die Möglichkeit ein festes Mapping anzulegen?

    Beste Grüße und vielen Dank,
    Finn

  7. Hallo Finn,
    vielen Dank! 🙂

    Das feste Mapping ist kein Problem, wenn du ein EQ-Plug-In hast, welches sich durch CC-Befehle steuern lässt (z.B. alle Plug-Ins von http://www.bluecataudio.com ). Öffne dein EQ-Plugin, weise deine Controllernummer durch MIDI-learn zu und speichere ein neues Preset ab (ganz oben in der ProTools-Leiste des Plug-Ins über den kleinen Pfeil neben „Preset“).

    Jetzt musst du nur noch dafür sorgen, dass dein neues Preset jedes Mal automatisch geladen wird, wenn du eine neue Instanz des Plug-In öffnest. Das geht so: wähle dein Preset aus und wähle dann im Preset-Menü „Als Benutzerstandard festlegen“. Nun noch im gleichen Menü „Voreinstellungen“ -> „Plug-In Standardeinstellung festlegen auf“ -> „Benutzereinstellungen“.

    Der Nachteil in Pro Tools ist, dass es leider keine globalen Einstellungen für eine MIDI-Steuerung gibt, wie z.B. in Ableton Live oder Logic. Du kannst nur einen EQ steuern, der MIDI von Hause aus mitbringen (meines Wissens die wenigsten) und du musst jedes Mal auch den MIDI-Send manuell umstellen, damit dein Controller auch den richtigen EQ in deiner Session steuert.

    Viel Erfolg
    Götz

  8. HuHu wollte dir auch nochmal ein Lob aussprechen echt klasse die Aufmachung und Umsetzung deiner Videos.
    Bin jetzt soweit wie du in diesem Video aber jetzt hab ich das Problem das ich kein Netzteil habe möchte aber gern das am Keyboard ausprobieren. Hatte in 9v Netzteil dran das allerdings nichts am Arduino zum Leuchten bring ich vermute da es von einem Distorsion für die Gitarre ist das vielleicht die + und – Seiten vertauscht sind am Anschluss. ( Kann das USB Kabel nicht nutzen als Spannungsversorgung oder ? )
    Und muss ich bei einem YAMAHA Keyboard noch etwas umstellen zum Beispiel SynthProgramm oder fkt der MidiController bei dem Standart Piano auch ?

    Mit freundlichen Grüßen !

  9. Danke! 🙂

    Du kannst immer das USB-Kabel oder auch eine Batterie zur Stromversorgung nehmen, das ist kein Problem.

    Entscheidend ist, dass dein Synthesizer auch mit der Controller-Nummer etwas anfangen kann die du von deinem MIDI-Controller sendest. Das ist allerdings nicht genormt. Am besten du sendest erst einmal eine der wenigen Nummern die von fast allen Keyboards verstanden werden, z.B. 1 für Modulation, 7 oder 11 für Lautstärke.

    Viel Erfolg!
    Götz

  10. jetz geht es bis folge 4, jetz mus ich die midi out anbringen. es werd bei mir nur ein wert bis 92 bei Hair MIDI Bridge an gezeigt es ist wohl die LED die ich mit verbaut habe

  11. Guten Morgen Götz
    Ich fasse mich kurz: Ich habe mir mal alle Videos angeschaut und finde Dich einfach super. Ich habe mal ein wenig erfahrung auf den Sprachen C und C#. Also wirklich nurr wenig 😉 .Du erklärst das hier super einfach, dass man auch mitkommt.
    Ich habe mir dann gleich mal ein wenig Material eingekauft. Dass hiesst: EInem Arduino Mega, weil Du in einem anderen Video erklärst, dass man mit dem Uno mal „nur“ 48 Kanäle belegen kann. Mit dem Mega sind es dann 128 wenn ich richtig gerechnet hab. Die ich brauchen werde, weil ich mir ein Steuerungsmischpult für CUbase und Ableton bauen will mit 20 Fadern und je Fader 5 Potis.
    Dazu kommen noch einige potis und sonst verschiedene Kleinsachen.

    Ich habe jetzt ein Problem mit meinem einzelnen Poti. Es funzt bis MIDI<Serialbridge alles bestens. Der wert steht bis ich am poti drehe usw. Jetzt wollte ich auf meinem Ableton Live9 diesen Poti mal austesten und ich bekomme beim besten Willen kein Signel ins Live.

    Hast Du da irgendeine Idee?
    Ich mache mal weiter mit deinen Workshops und hoffe auf eine baldige Antwort.

  12. Hi Götz!
    Ich habe meine Frage selber beantwortet und möchte hier schnell schreiben wie es möglich war.

    Also jetzt gehts los:
    Ich weiss nicht ob es an Windows oder am Ableton Live liegt, aber wenn man mit diesen zwei Plattformen arbeitet, braucht man noch ein Zusatzprogramm. Habe das auf der Hairless-Homepage herausgefunden. Sie empfehlen: LoopMIDI.
    mit diesem kann man einen Virtuelen MIDI-Eingang simulieren und den dann mit Hairless und Ableton koppeln.

    Funzt jetzt ohne Probleme.
    So long

  13. Hi Götz!

    Habe die Lösung gefunden:
    Ein zusätzliches Programm names LoopMIDI.
    Stellt einen virtuellen MIDI-Kanal her. Den dann mit Hairless und Ableton „verbinden“ und alles geht.
    loopMIDI findet ihr auf der Hairless-Homepage

  14. Hallo Hanspeter,
    jupp, du hast den Fehler schon richtig erkannt! 🙂 Unter Windows brauchst du dieses kleine Hilfstool, der Mac hat die virtuellen MIDI-Verbindungen mit dem sog. IAC-Bus schon von Haus aus dabei.

    Die „48 Kanäle“ wie du sagst bezogen sich auf die Kombi aus einem Arduino Uno (6 analoge Inputs) x 6 4051 Multiplexer-ICs = 48 analoge Inputs z.B. für 48 Fader. Damit wollte ich mal zeigen wie stark sich das erweitern lässt. Du kannst aber natürlich auch z.B. 16-fach Multiplexer nehmen, dann sind’s schon 96 Inputs. Oder die Multiplexer selbst nochmals multiplexen und somit noch mehr Eingänge schaffen!
    VG
    Götz

  15. Moin Götz,

    erstmal herzlichen Dank für die Videos! Sehr gut geklärt!

    Ich hätte eine Frage und zwar bezüglich dieser Fehlermeldung in Hairless:

    Error: unexpected data byte 0x0

    Hairless kriegt zwar Daten von Arduino, kann sie aber nicht als MIDI erkennen. Was könnte man da tun?

    Besten Dank und weiter so!

    VG
    Misagh

  16. hallo zusammen. ich habe meinen controller mit dem 4051 jetzt zusammengebaut. die schieberegler zeigen bei der abfrage 0 an und wenn ich sie komplett hoch schiebe 2023. trotz der if abfrage, schaff ich es nicht die midiabfrage zu stoppen. sie rasseln und rasseln…… ich verzweifle noch ;-(

  17. Hallo Götz,
    Nachdem ich die Videos schon mal gesehen, wollte ich das jetzt nachbauen. Das mit dem Poti auslesen klappt problemlos. Die Werte zwischen 0 und 1023 werden ausgelesen. In der nächsten Folge mit der If Abfrage und Hairless hakt es dann. Statt der Werte zwischen 0 und 127 kommt jetzt eine Anzeige in Hairless „+87.605 – Error:got unexpectet data byte 0x0“. Wenn ich am Poti Drehe ändert sich der Zahlenwert. Ich benutze den Arduino UNO R3. Kann es sein dass der die Anweisung „map“ nicht richtig interpretiert?

  18. Hallo Michael, der häufigste Fehler ist, dass immer noch serial.print verwendet wird. Du musst aber überall serial.write verwenden. Vielleicht ist das bei dir auch der Fall. Zweithäufigster Fehler ist, dass die Übertragungsgeschwindigkeit zwischen Arduino und Hairless nicht gleich ist.

  19. Hey Götz haben das selbe Problem an den Serial.print Befehlen liegt es nicht.
    Wie finde ich denn heraus das die Übertragungsgeschwindigkeit zwischen Hairless und Arduino nicht gleich ist ?

    Danke schonmal im voraus und deine super Tutorials 🙂

  20. Die Übertragungsgeschwindigkeit legst du im Arduino-Sketch fest: Serial.begin(9600); Die gleiche Geschwindigkeit (in diesem Fall 9600) stellst du in der Hairless-Bridge ein: Menü „Preferences“ erste Option Baud rate: 9600.

  21. Ich habe für mich eine Lösung gefunden. Da ich mir nicht sicher war ob das an meinem Arduino liegen könnte, habe ich die Print Befehle im Sketch gegen Serial.println getauscht um zu sehen ob im Monitor überhaupt die richtigen Werte angezeigt werden. Das war OK. In anderen Kommentaren war zu lesen, dass es mit der Hairless-Bridge Probleme unter Windows gibt. Da ich auch mit Windows arbeite, habe ich wieder die Serial.write Befehle(Sketch aus Folge 4) eingesetzt, Dann habe im Serial.begin() Befehl die Geschwindigkeit nach MIDI Protokoll auf 31250 gesetzt und die DIN Buchse für MIDI Out angeschlossen. Danach habe ich die Schaltung über ein MIDI Kabel und USB Adapter mit dem PC verbunden und konnte schließlich problemlos einem Plug IN über MIDI Learn beibringen auf den Contoller zu reagieren. Die Hairless Bridge verwende ich nicht mehr. Götz arbeitet mit Mac, da ist von Hause aus einiges implentiert, was man unter Windows erst hinzufügen muss. Da es über USB Adapter und DAW bestens funktioniert, konzipiere ich jetzt einen Controller, wie er am besten zu mir passt. Danke an Götz für die tolle Serie! Ich habe auch einen Arturia Beat Step. Toller Sequenzer, aber die Endlosregler für Controller taugen für den Zweck nicht. Ein analoges Poti bringt da deutlich mehr 🙂

  22. Moin und Mahlzeit…
    Vielen Dank für Deine ausführlichen Erklärungen…damit hat das alles wunderbar geklappt.
    Haben einen Controller mit 6 Potis die über den Nano alles senden.
    Eine Frage habe ich dennoch:
    Der Nano sendet ja aktiv und ich gehe von meinem Controller in ein Midi Keyboard und von da raus in eine externe Soundkarte.
    Kann man irgendwas damit kaputt machen ?
    Dadurch das mein Controller jetzt aktiv is und ins Masterkeyboard geht?

    Das Masterkeyboard ist ein SK2000 von Doepfer und die Soundkarte von Lexicon.
    Vielleicht hat jemand eine Antwort.
    LG Lisa

  23. Moin Lisa,
    eigentlich nicht, denn dein MIDI-In im Doepfer erwartet ja Signale mit 5V und hat ja zum Schutz auch einen Optokoppler im MIDI-In eingebaut. Sofern du also nicht mehr Spannung reinschickst sollte nichts passieren.
    LG
    Götz

  24. Guten Morgen Götz,
    zu erst mal vielen Lieben dank für deine Tutorials die mir ständig begleiten 🙂
    Hätte da ein problem den ich nicht so ganz bewältigen kann.
    Zur mein vorhaben…..
    Arbeite gerne mit Studio One und würde gerne den neuen Tisch zur einer DAW Console umwandeln. Hier sollte nichts großartiges sein. 32 Fader mit jeweils Potis Pan LR, Buttons für Mute, Solo, Rec., Select. Und noch Taster für Play, Record, Bank 1,2,3 usw..

    Bin momentan nur am Anfang um es überhaupt den FAder bzw. Poti zum laufen zu bringen. Soweit Alles ok.
    Studio One erkennt den Fader, aber nur im plus Bereich vom +8 – +10. Ich kann die Lautstärke nicht runter drehen. 🙁
    Die Hardware = 1 Poti , 1 Anschluss Brett, 1 Arduino Ono. Angeschlossen nach deinem Tutorial, A0- 5v- GND.
    Software = Arduino, Hairless, Midi Monitor, Studio One.
    Der Code…
    int controlChange = 176; // MIDI Kanal 1
    int controllerNummer = 39;
    int controllerWert = 0;
    int controllerWertAlt = 127;
    int potiWert = 0;

    void setup() {
    Serial.begin(57600);
    }

    void loop() {

    potiWert = analogRead(A0);
    controllerWert = map(potiWert,0,1023,0,127);

    if (controllerWert != controllerWertAlt) {
    Serial.write(0xB0);// Mdi Channel.
    Serial.write(0x21);// Channel Nummer Volume DAW Mixer HUI Control
    Serial.write(controllerWert);
    }

    }
    Bitte um Rat.
    LG Hugo

  25. Hallo Götz …
    ich bin nun fast am verzweifeln . Ich habe alles gemacht wie in deinem video beschrieben . aber anstatt zahlen spuckt mein serial Monitor nur Fragezeichen und andere komische Zeichen aus . hab darauf mein mac komplett neu auf gesetzt und die Arduino software neu geladen … alles an geschlossen und wider das selbe Problem …
    kannst du mir da irgend nen rat geben 🙁

  26. Hallo Jan,
    die meisten Leute machen den Fehler, dass sie mit einem falschen Befehl MIDI senden oder zusätzliche Daten schicken. Überprüfe deinen Sketch mal darauf, dass du nur drei Bytes mit Serial.write schickst. Da darf kein Serial.print oder ähnliches drin sein, kein vierter Serial.irgendwas Befehl und auch die Werte müssen passen.
    Viel Erfolg
    Götz

Schreibe einen Kommentar

Schreibe einen Kommentar zu KRInfardy Antworten abbrechen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert