Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Manufacturing Technology >> Herstellungsprozess

Unopad - Arduino MIDI-Controller mit Ableton

Komponenten und Verbrauchsmaterialien

Arduino UNO
× 1
Schaltaktor, beleuchtete Drucktastenschalter der Serie APEM A01
× 9
Jumper (generisch)
× 1

Notwendige Werkzeuge und Maschinen

Lötkolben (generisch)
Optional

Apps und Onlinedienste

loopMidi
Haarlose MIDISerial Bridge
Ableton Live 10 Testversion

Über dieses Projekt

Zusammenfassung

Die meisten Tutorials und Projekte für Midi-Controller basieren nur auf einer Erklärung der Arduino-Arbeit, aber nicht so sehr auf der Verwendung in der DAW selbst. Ich möchte ein Tutorial mit allen notwendigen Dingen an einem Ort erstellen. Mit diesem Projekt wollte ich Anfängern helfen, den Prozess der Erstellung und Verwendung eines Controllers besser zu verstehen, und ich hoffe, dass es für jemanden nützlich sein wird.

Ich wollte schon lange einen Midi-Controller machen und habe es endlich geschafft und jetzt werde ich das Projekt mit Ihnen teilen. Ich habe einen Arduino Uno verwendet, der keine MIDI-Nachrichten über USB senden kann, daher mussten dafür spezielle Programme verwendet werden (wird später im Text erklärt).

In den folgenden Abschnitten werden die elektrische Schaltung, der Arduino-Code sowie die Verbindung zu einem Computer und einer DAW, in diesem Fall Ableton, beschrieben.

Schaltung

Es ist eine sehr einfache Schaltung. Ich habe 9 Drucktasten verwendet, aber nicht in der Matrix, weil ich die Möglichkeit haben wollte, mehrere Tasten zu drücken (es ist einfacher und ich habe unbenutzte digitale Pins - ich verwende 9, in der Matrix wären 6).

Taste 3 ==> D2 Taste 2 ==> D3 Taste 1 ==> D4 Taste 6 ==> D5 Taste 5 ==> D6 Taste 4 ==> D7Taste 9 ==> D8 Taste 8 ==> D9 Taste 7 ==> D10  

MIDI-Zuordnungen

Ich habe 9 MIDI-Noten von 36 bis 45 sowie NOTE_ON und NOTE_OFF definiert.

Dieses MIDI-Tutorial wird Ihnen helfen zu verstehen, wie Sie die MIDI-Sprache verwenden können, um jedes Gerät zu steuern, das das MIDI-Protokoll verwendet.

#define NOTE_ONE 36#define NOTE_TWO 37// Definiere alle Noten hier.#define NOTE_ON_CMD 0x90#define NOTE_OFF_CMD 0x80#define MAX_MIDI_VELOCITY 127  

MIDI über USB

Da Arduino Uno selbst keine MIDI-Noten an die DAW senden kann, müssen wir zwei zusätzliche Programme verwenden - LoopMidi und Hairless MIDI<->Serial Bridge.

Mit LoopMidi erstellen wir einen virtuellen MIDI-Port, den wir in Hairless Midi verwenden können, um eine Verbindung mit dem Arduino-Port herzustellen.

Codeerklärung

Ich habe die Button-Klasse erstellt und verwende sie wie folgt:

int NUMBER_BUTTONS =9;Button Button1(4, NOTE_ONE);Button Button2(3, NOTE_TWO);Button Button3(2, NOTE_THREE);Button Button4(7, NOTE_FOUR);Button Button5(6, NOTE_FIVE);Button Button6(5, NOTE_SIX);Button Button7(10, NOTE_SEVEN);Button Button8(9, NOTE_EIGHT);Button Button9(8, NOTE_NINE);Button *Buttons[] {&Button1,&Button2,&Button3,&Button4,&Button5,&Button6 ,&Button7,&Button8,&Button9};  

Weitere Informationen zur Implementierung von Schaltflächen finden Sie unter Buttons.cpp.

Da wir keine Widerstände verwenden, sondern nur den Taster mit dem digitalen Pin und Masse verbinden, verwenden wir INPUT_PULLUP anstelle von INPUT.

//Buttons.cpppinMode(_pin, INPUT_PULLUP);  

Der einzige knifflige Teil dabei ist, dass Sie nicht nach einem HIGH suchen signalisieren, wie Sie vielleicht vermuten – Ihre Taste gibt LOW (0) wenn es gedrückt wird.

 // Schaltfläche wird gedrückt if (state ==0) { midiNoteOn(Buttons[i]->Note,127); } // Taste wird nicht gedrückt if (state ==1) { } 

Dies bedeutet auch, dass der anfängliche Schaltflächenstatus 1 und nicht 0 ist.

//Buttons.cpp _state =1; 

Jede NOTE ON-Nachricht erfordert ihre entsprechende NOTE OFF-Nachricht. Wenn die Taste gedrückt wird, wird die NOTE_ON-Nachricht gesendet. Wenn die Taste losgelassen wird, sendet sie die Nachricht NOTE_OFF, also habe ich zusätzlich zum Anfangszustand den zuletzt gespeicherten Zustand zum Code hinzugefügt.

//Buttons.cpp _lastState =1; 

Wir senden nur MIDI-Nachrichten, wenn sich der aktuelle Status vom letzten Status unterscheidet.

//Buttons.cppif(state!=_lastState){//....} 

Verwenden Sie diese beiden Funktionen, um MIDI-Meldungen zu senden. Funktionsparameter sind Hinweis und midiVelocity (Ich habe die maximale Geschwindigkeit verwendet).

void midiNoteOn (byte note, byte midiVelocity) { Serial.write (NOTE_ON_CMD); Serial.write (Hinweis); Serial.write (midiVelocity);} ungültiges MidiNoteOff (Byte-Notiz, Byte MidiVelocity) { Serial.write (NOTE_OFF_CMD); Serial.write (Hinweis); Serial.write(midiVelocity);} 

Ich lege die Programmlogik in die Funktion updateButtons Funktion.

void updateButtons() { for (int i =0; i getButtonState(); // Taste wird gedrückt if (state ==0) { midiNoteOn(Buttons[i]->Note,127); } // Button ist nicht gedrückt if (state ==1) midiNoteOff(Buttons[i]->Note,0); } } 

Die Funktion wird innerhalb der Schleifenmethode aufgerufen.

void loop() { if (NUMBER_BUTTONS !=0) updateButtons();} 

Verwenden Sie Ihren Controller mit DAW (Ableton Live)

Als Anfänger im Umgang mit DAWs wusste ich nicht, wie man dort etwas anschließt. Als ich meinen Korg Nanokey angeschlossen habe, hat Ableton ihn selbst erkannt und ich konnte sofort den Controller verwenden. Dies war beim Arduino-Controller (natürlich) nicht der Fall, da es sich nicht um ein HID-Gerät handelt und der PC ihn immer noch als Arduino erkennt.

Ich werde Ihnen hier zeigen, wie Sie Ihren Arduino MIDI-Controller in Ableton Live 10 anschließen und verwenden.

  • Mit Ableton verbinden

loopMIDI öffnen und erstellen Sie einen neuen virtuellen MIDI-Port wie auf den nächsten Bildern.

Öffnen Sie haarloses Midiserie und weisen Sie den seriellen Port, MIDI Out und MIDI In wie auf den nächsten Bildern zu. Für den seriellen Port wählen wir den Arduino Uno-Port und für den MIDI-Eingang und -Ausgang verwenden wir den virtuellen MIDI-Port, den wir im vorherigen Schritt erstellt haben.

Stellen Sie die Baudrate in Ihrer Arduino-Skizze auf die gleiche Rate ein. Gehen Sie zu Datei>Einstellungen , und dort sollten Sie die Baudrate einstellen.

Wenn alles richtig gemacht ist, können Sie die vom Controller gesendeten MIDI-Meldungen debuggen. Drücken Sie die Taste auf dem Controller und prüfen Sie, ob in Hairless MIDI eingehende MIDI-Nachrichten empfangen werden.

Schließen Sie kein haarloses MIDI!

Öffnen Sie Ableton Live und gehen Sie zur Registerkarte Optionen und dann zu Einstellungen. Die Registerkarte Link MIDI sollte wie in diesem Beispiel aussehen.

Um zu überprüfen, ob alles gut verbunden ist und Ableton MIDI-Nachrichten liest, schauen wir in die obere rechte Ecke von Ableton. Das obere Feld sollte blinken, wenn die Taste am Controller gedrückt wird, wie im nächsten Beispiel gezeigt.

Controller ist einsatzbereit!

  • Controller als Drum-Rack verwenden oder Tastatur

Wählen Sie die MIDI-Spur aus. Im Monitor Abschnitt wählen Sie In , statt Automatisch , und in MIDI zu Wählen Sie Ihren Lautsprecherausgang. Sie sollten jetzt Ihre Tastatur hören. Das gleiche sollte für das Drum-Rack gemacht werden.

Mein fertiges Projekt

Ich habe für dieses Projekt eine alte Lautsprecherbox und etwas Plastik verwendet, das ich zu Hause gefunden habe. Ich schneide beide Plastikplatten auf die Maße des Gehäuses zu und bohre Löcher für die Knöpfe und eine LED, die ich später hinzufügen werde.

Ich habe auch einen anderen alten Lautsprecher mit demselben Gehäuse, den ich für einen anderen MIDI-Controller verwenden werde, diesmal mit Knöpfen und Joysticks.

Zu tun

- Taste lang drücken, um in den CC-Modus zu wechseln.

Code

  • MidiDrumPad.ino
  • Buttons.cpp
  • Buttons.h
MidiDrumPad.inoArduino
#include "Buttons.h"//------Notizen-------------#define NOTE_ONE 36#define NOTE_TWO 37#define NOTE_THREE 38#define NOTE_FOUR 39#define NOTE_FIVE 40#define NOTE_SIX 41#define NOTE_SEVEN 42#define NOTE_EIGHT 43#define NOTE_NINE 44#define NOTE_ON_CMD 0x90#define NOTE_OFF_CMD 0x80#define MAX_MIDI_VELOCITY 127//------------------ ------int NUMBER_BUTTONS =9;Button Button1(4, NOTE_ONE);Button Button2(3, NOTE_TWO);Button Button3(2, NOTE_THREE);Button Button4(7, NOTE_FOUR);Button Button5(6, NOTE_FIVE);Button Button6(5, NOTE_SIX);Button Button7(10, NOTE_SEVEN);Button Button8(9, NOTE_EIGHT);Button Button9(8, NOTE_NINE);Button *Buttons[] {&Button1,&Button2,&Button3,&Button4,&Button5,&Button6 ,&Button7,&Button8,&Button9};int red_light_pin=11;int green_light_pin =12;int blue_light_pin =13;void setup() { Serial.begin(9600);}void loop() { if (NUMBER_BUTTONS !=0) updateButtons( );}void updateButtons() { for (int i =0; i getButtonState(); // Taste wird gedrückt if (state ==0) { midiNoteOn(Buttons[i]->Note,127); } // Taste ist nicht gedrückt if (state ==1) { midiNoteOff(Buttons[i]->Note,0); } }}void RGB_color (int red_light_value, int green_light_value, int blue_light_value) { analogWrite (red_light_pin, red_light_value); analogWrite (green_light_pin, green_light_value); analogWrite (blue_light_pin, blue_light_value);} // MIDI-Note ONvoid MidiNoteOn senden (Byte-Note, Byte MidiVelocity) { Serial.write (NOTE_ON_CMD); Serial.write (Hinweis); Serial.write (midiVelocity);} // MIDI-Note senden OFFvoid midiNoteOff (Byte-Note, Byte MidiVelocity) { Serial.write (NOTE_OFF_CMD); Serial.write (Hinweis); Serial.write(midiVelocity);}
Buttons.cppArduino
#include "Buttons.h"Button::Button(int pin, kurze Anmerkung){ _pin =pin; pinMode(_pin, INPUT_PULLUP); _zustand =1; _lastState =1; Hinweis =Hinweis;}int Button::getButtonState(){ int returnValue =-1; int-Zustand =digitalRead (_pin); if(state ==_lastState) return 5; if(state!=_lastState) { if(state ==0) { returnValue =0; aufrechtzuerhalten. Sonst { Rückgabewert =1; } } _lastState =Zustand; return returnValue;}
Buttons.hArduino
#ifndef Buttons_h#define Buttons_h#include //Button (Pinnummer, Notennummer)class Button{ public:Button(int pin, short note); int getButtonState(); int Hinweis; privat:int _pin; kurze _note; int_state; int _lastState;};#endif
Sie können Code von meinem Github herunterladen
https://github.com/sadreactonly/MidiDrumpad

Schaltpläne


Herstellungsprozess

  1. Dimmen von Lichtern mit PWM über Drucktasten
  2. Arduino-Gyroskop-Spiel mit MPU-6050
  3. DHT11-Sensor mit LEDs und einem Piezo-Lautsprecher
  4. Iron Man
  5. Einfacher Hindernissensor mit Arduino
  6. Finde mich
  7. Arduino-Befeuchtersteuerung
  8. 4x4x4 LED-Würfel mit Arduino Uno und 1sheeld
  9. Arduino-Joystick
  10. Schrittzähler (Arduino 101)