DIY MIDI Steuergerät, oder ich schalt mir die Welt, wie sie mir gefällt.

Dieses Thema im Forum "Effekte" wurde erstellt von Willie, 7. September 2018.

  1. Willie

    Willie Rock on...

    Bassix:
    ß32.548
  2. JD94

    JD94 Member

    Bassix:
    ß1.800
    Wirklich eine schöne Idee :bier:

    Also mein Wunschprojekt wäre einfache Software in der ich jedem meiner Songs einen bestimmten Midi Kanal eines Midi fähigen Geräts (in meinem Fall ein EQ Pedal oder eine Zerre)zuordnen kann (eventuell sogar von 2 Midi Geräten gleichzeitig)
    Die Songs kann ich dann in einer Setlist eine bestimmte Reihenfolge zuordnen. Die Steuerung der Software würde mit einem Fußtaster (UP und DOWN Befehle) verwirklicht. Sobald der nächste Song ausgewählt wird, wird ein
    "Program Change" Befehl an das Midi Gerät gesendet.
    Der Vorteil wäre das ich keinen Stepptanz mehr aufführen muss und das ich mir nicht merken muss, welcher Sound für den jeweiligen Song eingeplant war.

    Gruß JD
     
  3. Willie

    Willie Rock on...

    Bassix:
    ß32.548
    Ich presche mal etwas vor. Für mich wäre eine Implementierung auf Arduino Hardwarebasis gut. Weil kenn ich mich mit aus.
    Die einfachste Variante wäre das hier:
    https://www.arduino.cc/en/Tutorial/Midi
    Es gibt aber auch ein paar schöne Shields, die man direkt auf den Arduino stecken kann. Z.b.
    einfache Variante
    https://www.ebay.de/itm/MIDI-Shield...701147?hash=item3f9611fddb:g:NPsAAOSw-NFaoQ~v
    bessere Variante
    https://www.exp-tech.de/module/audio/6474/sparkfun-midi-shield
    Im Prinzip erspart man sich damit das selber löten. Obwohl das Spakfun muss man noch zusammen löten.

    Was wir dann noch bräuchten wären
    1 Arduino (https://www.az-delivery.de/collections/arduino-kompatible-boards/products/uno-r3?ls=de)
    1 Midi board
    2 Taster (up/down) https://www.musikding.de/2PDT-Fusstaster
    1 Display (https://www.az-delivery.de/products/4-digit-display?ls=de), wir wollen ja auch was sehen.
    1 Gehäuse (https://www.musikding.de/Looper-Gehaeuse-15cm)

    und ein bisschen Software...
     
  4. JD94

    JD94 Member

    Bassix:
    ß1.800
    Klingt nach einem super Plan! Ich habe riesiges Interesse an dem Projekt :great: Vielen Dank schon mal, dass du dich damit beschäftigst.

    Leider hab ich im Bereich Hardware Elektronik wenig Erfahrung und das Thema Arduino ist noch komplett Neuland für mich. Aber ich versuche mich da "rein zu fuchsen"!

    Gruß JD
     
  5. JD94

    JD94 Member

    Bassix:
    ß1.800
    Also was wäre jetzt der Start?
    Ich bestelle den Arduino und das MIDI Shield, welches dann auf den Arduino gesteckt wird. Sehe ich das richtig?
     
  6. lord-of-fire

    lord-of-fire tappt im dunkeln

    Bassix:
    ß15.443
    Ich hab den Thread schon abonniert und warte erstmal ab, wie sich die Sache entwickelt. Hab noch ein paar Projekte, die vorher fertiggestellt werden wollen bzw müssen. Bis die erledigt sind, gibts hier vermutlich schon was fertiges, das ich nachbauen oder für mich anpassen kann.
     
  7. Willie

    Willie Rock on...

    Bassix:
    ß32.548
    Ja, richtig, genau so geht das.
    1 Schritt ist erstmal die Hardware besorgen.
    Welche ist mir Wurscht. Ich würd, glaubl ich, erst mal mit der billigen anfangen. Arduinos hab ich zur genüge...
    Ich brauch nur das Display und das MIDI Shield.
    Werd ich mal bestellen. Dauert leider etwas.
     
  8. Willie

    Willie Rock on...

    Bassix:
    ß32.548
  9. JD94

    JD94 Member

    Bassix:
    ß1.800
    Also bestelle ich die gleichen Teile wie du am Besten und wir arbeiten parallel daran? Oder wie hast du dir den Ablauf vorgestellt? Dann mache ich das heute Abend.
     
  10. zeppo3000

    zeppo3000 Well-Known Member

    Bassix:
    ß29.699
    Vielleicht hab ich was überlesen; was soll das Teil denn genau machen?
     
  11. lord-of-fire

    lord-of-fire tappt im dunkeln

    Bassix:
    ß15.443
    Die Entwicklung der Idee ging wohl hier los.
     
  12. zeppo3000

    zeppo3000 Well-Known Member

    Bassix:
    ß29.699
    Also ein Midi-Fußschalter, richtig?
     
  13. Ratterbass

    Ratterbass Well-Known Member

    Bassix:
    ß17.563
    Wozu das Midi Shield?


    Arduino können doch inzwischen nativ midi verarbeiten, die richtige Bibliothek vorausgesetzt.

    Mit den seriellen Schnittstellen lassen sich dann Taster auslesen und Relais ansteuern. Dazu brauchts eigentlich nur einen Arduino (Nano reicht), ne Handvoll Taster, Buchsen, Relaisn und ein paar Widerstände und natürlich die entsprechenden Programmierskills.

    Mit meinen ist es leider nicht weit her. Mein größtes Projekt war ein Fußschalter um verschiedene program changes rauszuschicken (z.B. für die Presetwahl in einem Line6 M5).
     
  14. Willie

    Willie Rock on...

    Bassix:
    ß32.548
    Richtig. Du kannst auch alles auf Lochraster machen. Aber ehrlich, für 5€ bekommen ich ein fertiges Teil, was ich nur aufstecken brauch. Da hab ich dann gleich die Midi Buchsen drauf, und noch etwas Hühnerfutter, was ich sonst händisch verdrahten müsste.
    Auch so‘n Nano kannste selber bauen. Muss man aber nicht.
    3.39_ATMega328_minimum.png
     
    Zuletzt bearbeitet: 9. September 2018
    netzbandit gefällt das.
  15. Willie

    Willie Rock on...

    Bassix:
    ß32.548
    Die erste Variante ist der von @Ratterbass vorgeschlagene einfache Midi Controller, der einfach je nach Tastendruck eine Reihe von Midibefehlen aussendet.
    Dazu muss man wissen, wie ein Midibefehl aufgebaut ist.
    Wikipedia ist da dein Freund. https://de.wikipedia.org/wiki/Musical_Instrument_Digital_Interface#Nachrichtentypen
    Da wir ja eher keine Noten senden wollen, wäre für uns wahrscheinlich am wichtigsten die Befehle Control Change und Program change. Während Control Change ein 3 Byte Befehl ist, ist der Program Change ein 2 Byte Befehl.
    Jedes Midigerät hört nur auf Befehle, die auf seinem Kanal gesendet werden. (das ist das n)
    Wollen wir z.B. einen Program Change 56 auf Kanal 12 senden, müssen wir über die Schnittstelle folgende Byte Kombination senden: CC (Program Change auf Kanal 12) , 38. Das ist die übliche Hexadezimale Schreibweise. Normal dezimal wäre das also: 204, 56.
    Manche Dinge werden auch über sog. Controller gesteuert. Z.B. irgendwelche Expression Pedal oder auch das Haltepedal beim Keyboard. Das sind normalerweise 3 Byte Befehle (Ausnahmen gibt es da aber auch)
    z.B. Haltepedal an auf Kanal 4 wäre dann B4, 40, 40
    Die Schnittstelle selber ist eine popelige serielle Schnittstelle mit einer Baudrate von 31250 ein Startbit, ein Stoppbit keine Parität. Zusätzlich sollte man erwähnen, dass Midi als Stromschnittstelle implementiert ist, wobei 5mA den Wert 0 entspricht und kein Strom dem Wert 1.
    Eingang ist üblicherweise ein Optokoppler, sodass man auf der Empfangsseite eine galvanische Trennung hat.
    Da wir nur Senden ist uns der Empfangsteil eigentlich Schnuppe. Auf dem Shield ist er aber richtig implementiert. Nur für den Fall...

    So und nun schon mal ein einfaches Arduino Beispiel, wie wir einen Midibefehl senden können. Wir nehmen an, wir haben die Midischnittstelle auf die 1. serielle Schnittstelle geschaltet. (Achtung: da diese auch für die Programmierung verwendet wird, müssen wir immer zwischen Midishield und Programmierung hin und herschalten. Dafür ist ein Jumper oder manchmal auch ein Schalter auf dem Midishield.)
    Wir senden mal einen Program Change wie oben:

    Code:
    void setup() {
      setMidiBaudrate();
    }
    
    void loop() {
      changeProgram(0x0C, 0x38);
    }
    
    const byte PROGRAM_CHANGE = 0xC0;
    
    void changeProgram(byte channel, byte program) {
      Serial.write(PROGRAM_CHANGE + channel);
      Serial.write(program); 
    }
    
    void setMidiBaudrate() {
        Serial.begin(31250);
    }
    
    0x ist übrigens das Kennzeichen für Hexadezimalwerte. Warum nehmen wir die? Weil es im Quelltext besser aussieht. (Das ist kein Scherz) Wer sich ein bisschen mit Programmierung beschäftigt, wird festellen, daß programmieren zu 90% aus lesen von Quelltexten besteht. Um das effizienter zu machen, ist es einfach wichtig, das solche Quellen sehr gut und schnell lesbar werden. Ein m.M.n. gutes Programm lässt sich lesen wie ein gutes Buch. Es erzählt uns eine Geschichte, nämlich die Geschichte seines Zwecks. (Und nicht die seiner Historie...)
    Sorry etwas Offtopic, aber ich bin leidenschaftlicher Verfechter von Clean Code. Und damit verdiene ich mein tägliches Brot.
    So reicht erstmal für heute.
     

    Anhänge:

    Zuletzt bearbeitet: 9. September 2018
  16. JD94

    JD94 Member

    Bassix:
    ß1.800
    Super Arbeit :bier:

    Ich verstehe noch nicht genau wie das mit dem zuordnen der Sounds auf die Songs ablaufen soll. Hast du da schon einen Plan?
    Die Zuordnung müsste ja irgendwo gespeichert werden
     
  17. Willie

    Willie Rock on...

    Bassix:
    ß32.548
    Ja, kommt in dem nächsten Post. Gibt da verschiedene Ansätze... von Simpel bis Komfortabel...
    Aber wir sind ja noch bei den Grundlagen... erstmal muss die Komunikation stehen...
     
  18. Willie

    Willie Rock on...

    Bassix:
    ß32.548
    So,
    weiter geht's. Solange wir noch auf die Boards warten, hier schon mal ein kleines 4 Taster Projekt.
    Ich möchte mit 4 Tastern jeweils eine belibiege Sequenz an Midibefehlen schicken.

    Arduino MIDI Out 4 Switches_Steckplatine.png
    Hardware technisch sehe das so aus. Wobei den rechten Teil macht später das Midishield.
    Links sind 4 Lechtdioden für die Rückmeldung und 4 Taster. Die sollen die späteren Fußtaster darstellen.

    Programm hängt mit dran.
    Ich hab den Quellcode in 2 Dateien aufgeteilt.
    Einmal das Steuerprogramm: Switch_Program_Change.ino und den Teil, der unsere Midi Implementierung aufnimmt midi.h.

    Und da ich ein fauler Sack bin, verwende ich für die Auswertelogik für die Taster eine externe Bibliothek.
    Die gibbet im Arduino Library Manager und heisst Switch von Albert van Dalen. Die wertet die SChalter vernünftig aus, weil Schalter und Taster können prellen. Kann man selber machen, muss man aber nicht. Wenn ihr die Lib nach nicht habt, müßt ihr die ersteinmal installieren. Das geht über den Library Manager sehr gut.
    Das Programm ist einfach straigt forward geschrieben.
    Im setup initialisiere ich zunächst die LEDs und die Midi Schnittstelle. Die Schalter werden über die Konstrukte Switch switch_1 = Switch(SWITCH_1); schon richtig initialisiert.
    Dann sende ich direkt die für den Switch 1 vorgesehenen Midisequenz und schalte die entsprechende LED ein.
    In der loop verarbeite ich zunächst evtl. Tasstendrücke und dann, je nachdem welcher Taster gedrückt wurde, sende ich dessen Midi Sequenz und schalte die LED ein.

    Zur Midisequenz:
    Jeder Taster hat ein zugehöriges Array mit den Midi Befehlen.
    Für Taster 1 z.B.
    const byte SEND_1[] = {0xC1, 0x01};
    0xC1 bedeutet: Sende auf Kanal 1 einen Programchange
    0X01bedeutet: zu Programm 1. Will man das erweitern, schreib man einfach die nächsten Befehle als weitere Werte kommasepariert dahinter. z.B. ein weiteren Programchange auf Kanal 2 mit Program 16.
    const byte SEND_1[] = {0xC1, 0x01, 0xC2, 0x10};
    So und nun viel Spass damit.

    Kommen wir nun zum Thema: Speichern und Programmieren der zu sendenden Befehle.
    Hier hab ich ja schon Variante 1 gezeigt. Für den Selbstprogrammierer ist das die einfachste Lösung. Einfach die Sendebefehle mit in den Quelltext packen, neu kompilieren und hochladen. Fertig.
    Auf der Bühne natürlich nicht so einfach machbar. Und wenn man alles in ein Gehäuse gebaut hat, wäre das auch nciht so prikelnd.
    Also wie bekomme ich die Daten in den Switch ohne USB Anschluss. Naja, wir haben im Arduino auch noch ein sog. EEPROM, das ist ein nicht flüchtiger Speicher (Im gegensatz zum RAM) den man vom Programm aus überschreiben kann. Das bleibt auch nach dem Ausschalten erhalten. Also könnte man dort die Midi Sequenzen speichern. Zum Ändern müßte man dann irgendwie dem Controller die neuen Daten schicken. Im Midi Umfeld gibt es da schon was, das nennt sich SysEx. Damit kann man belibige Daten an einen Midicontroller schicken. Der Controller selber entscheidet dann, ob er damit was anfangen kann. Die Struktur ist bis auf einen Header frei wählbar. So könnten wir unsere Befehlsfolgen einfach per SysEx an den Midi In schicken und müßten im Programm n ur auf diesen DAtenstrom entsprechend reagieren und die Daten im EEPROM ablegen.
    Wie das geht, zeige ich das nächste Mal.
     

    Anhänge:

  19. JD94

    JD94 Member

    Bassix:
    ß1.800
    ... also meine Bauteile sind alle angekommen :bier:

    Gruß JD
     

    Anhänge:

  20. Willie

    Willie Rock on...

    Bassix:
    ß32.548
    :great:
    Na dann hau rein. Ich hab noch nix bekommen.