Schritt 13: Die Bibliothek
In der Einführung dieses Instructable versprach ich Ihnen eine einfache Möglichkeit, Ihre eigenen MIDI-Controller zu programmieren. Nun, ist hier es!
Es ist eine Bibliothek, die versucht, Kompromisse zwischen große Anpassbarkeit und benutzerfreundlichen Code, zugänglich für Arduino-Anfänger.
Derzeit unterstützt Potentiometer, Regler, Schalter, Knöpfe, Drehgeber, und hat eine einfache Funktion zum Senden von MIDI-Befehlen.
Ich plane, in naher Zukunft mehr LED-Ausgang und Pitch-Bend-Steuerung-Unterstützung hinzufügen.
Installation der MIDI_controller-Bibliothek
Diese Bibliothek stützt sich auf die MIDI-Funktionalitäten der Software, die wir früher installiert (Teensyduino, TeeOnArdu, HIDUINO etc.) so gehe zurück zu Schritt 6 & 8 und installieren Sie sie. Lasst euch nicht entmutigen durch die scheinbar lange Installation Verfahren, wenn Sie die Anweisungen, Sie sollten in Ordnung sein. Sobald alles eingerichtet ist, ist es wirklich einfach zu bedienen!
Die MIDI_controller-Bibliothek selbst ist wie jede andere Arduino-Bibliothek installiert.
Dies sind die Anleitungen für Arduino IDE 1.0.6:
- Die Bibliothek herunterladen hier.
- Klicken Sie im Menü "Skizze" auf "Import-Bibliothek..." und dann "Bibliothek hinzufügen...".
- Navigieren Sie zu Ihrem Download-Verzeichnis, doppelklicken Sie darauf und wählen Sie in der rechten Spalte MIDI_controller.zip.
- Klicken Sie auf "Ok".
- Neustart der IDE um die Keywords zu laden, (so dass Sie die orange Farbe für Funktionen etc..)
Das war's.
Wie man es benutzt
Erst Ihre Skizze fügen Sie hinzu, die Bibliothek indem Sie einfach diese Zeile am oberen Rand der Datei:
Die Bibliothek hat derzeit 4 Klassen: Analog, Digital, DigitalLatch und Encoder.
Eine Klasse hat eine Reihe von Funktionen und eine Reihe von Variablen. Einige sind privat und dienen innerhalb der Klasse, andere sind öffentlich und können von außerhalb der Klasse aufgerufen werden. Mehr über Klassen hier.
Der erste Schritt bei der Verwendung einer Klasse ist ein Mitglied der Klasse erstellen. Dies geschieht vor allem vor der Einrichtung, so können Sie das Mitglied überall im Programm.
Beispielsweise können ein Mitglied der Klasse Analog "Potentiometer" hinzuzufügen:
Analoge Potentiometer (bla, bla, bla...);
(Vorerst ignorieren Sie einfach die bla)
Nun, da das Element erstellt wird, können wir die Funktionen der analogen drauf, zum Beispiel die Refresh-Funktion verwenden:
potentiometer.refresh();
Genau wie Arduino Funktionen wie DigitalWrite können nicht Sie diese Funktionen außerhalb der Einrichtung oder der Schleife verwenden.
Erklärung was die Funktionen tun und was sie gemacht sind lesen Sie nach Verweis.
Analog
Die analoge Klasse richtet sich an analogen Eingängen, wie Potis und Fader (oder analoge Sensoren, die einen Wert zwischen 0 und 5V Ausgang). Eine ungültige Pin-Nummer führt die LED an Pin 13 blinkt mit 1 Hz.
Element erstellen
- Analog (Byte Pin, Byte-Controller, Byte-Kanal, Byte-Auflösung);
PIN ist die analoge Pin aus zu lesen. Es ist an der Scheibenwischer des Potentiometers angeschlossen.
Controller ist die MIDI-Controller-Nummer (Daten 1 in der MIDI-Nachricht). Dies ist, wie es in Ihrer MIDI-Software, wie eine eindeutige Adresse angezeigt wird.
Kanal ist der MIDI-Kanal.
Auflösung ist die Auflösung der analogen lesen. Eine Auflösung von 2 geben würde nur 2 mögliche Werte (0 bis 127), einer Auflösung von 3 würde 3 mögliche Werte (0, 63 und 127). Eine Auflösung von 128 gibt 128 möglichen Werte (0-127), dies ist die Standardeinstellung, weil es alle 7-Bit-Zahlen. (MIDI verwendet 7-Bit-Zahlen für den Versand Werte) Verwenden Sie einen Wert niedriger als 128, wie 64, wenn gibt es eine Menge Lärm auf Ihren Eingaben, zum Beispiel, wenn der Controller hält auf senden 0,1,0,1,0,1,0,1,... Verwenden Sie 128, wenn Sie die maximale Auflösung verwenden möchten.
Funktionen
- Refresh ();
Diese Funktion überprüft die Eingabe, und wenn sie seit dem letzten Mal geändert hat, aktualisieren aufgerufen wurde, sendet den neuen Wert über MIDI (über die vordefinierten Controller-Nummer und Kanal).
- Bank (Pin Byte, Byte-Controller, Byte Channel);
Mit dieser Funktion können Sie einen analogen Eingang (zusammen mit einem Schalter) für mehrere Steuerelemente verwenden. Wenn der Schalter im OFF ist zu positionieren, den Controller und Kanal werden diejenigen, die während der Elementerstellung, definiert wurden, wenn der Schalter in der Position ist, werden den Controller und Kanal, die als Argumente für diese Funktion eingegeben wurden.
PIN ist der digitale Stift mit dem Schalter verbunden. Die internen Pull-up-Widerstand wird aktiviert.
Controller ist der Controller zu verwenden, wenn der Schalter aktiviert ist.
Kanal ist der Kanal zu verwenden, wenn der Schalter aktiviert ist.
- detachBank();
Diese Funktion deaktiviert die Bank-Funktionalität, die mit der Funktion Bankeingerichtet wurde. Der Controller und der Kanal werden diejenigen sein, die unabhängig vom Zustand des Schalters während Elementerstellung wiederum definiert wurden.
Die Pin des Schalters in der Bank -Funktion definiert wird als Eingang ohne Pull-up-Widerstand neu eingestellt werden.
Konstanten
- Keine.
Beispiele
- Analog_example
- Analog_bank_example
Digital
Die Digital-Klasse ist für die Verwendung mit Schalter und Knöpfe gemeint. Es sendet eine NoteOn Nachricht, wenn die Taste gedrückt wird, und eine NoteOff-Nachricht beim Loslassen der Taste. Ihr wechselt zwischen der Pin und dem Boden zu verbinden, die internen Pull-up-Widerstände verwendet werden. Eine ungültige Pin-Nummer führt die LED an Pin 13 blinkt mit 1 Hz.
Element erstellen
- Digital (Byte Pin, Byte Hinweis, Byte-Kanal, Byte Geschwindigkeit);
PIN ist der digitale Stift mit dem Button verbunden.
Hinweis ist die MIDI-Note zu senden. 60 ist das mittlere C, und jede halbe Note ist plus oder minus eins. Sie können dies an die Controller-Nummer analog vergleichen.
Kanal ist der MIDI-Kanal.
die Geschwindigkeit ist die Notiz wie hart getroffen. Dies spielt keine Rolle für eine normale Schaltfläche, solange es nicht ist 0. (Es spielt jedoch für empfindliche Touch pads zum Beispiel.)
Funktionen
- Refresh ();
Diese Funktion überprüft die Eingabe und wenn sie aktualisieren hieß seit dem letzten Mal geändert hat, sendet es die entsprechende Nachricht: NoteOn wenn die Taste gedrückt ist, NoteOff wenn die Taste losgelassen wird.
- Bank (Pin Byte, Byte Hinweis, Byte Channel);
Mit dieser Funktion können Sie eine Taste (zusammen mit einem Schalter) für mehrere Steuerelemente verwenden. Wenn der Schalter im OFF ist zu positionieren, die Notiz und Kanal werden diejenigen, die während der Elementerstellung, definiert wurden, wenn der Schalter in der Position ist, werden den Hinweis und Kanal, die als Argumente für diese Funktion eingegeben wurden.
PIN ist der digitale Stift mit dem Schalter verbunden. Die internen Pull-up-Widerstand wird aktiviert.
Hinweis ist der Ton zu verwenden, wenn der Schalter aktiviert ist.
Kanal ist der Kanal zu verwenden, wenn der Schalter aktiviert ist.
- detachBank();
Diese Funktion deaktiviert die Bank-Funktionalität, die mit der Funktion Bankeingerichtet wurde. Der Hinweis und der Kanal werden diejenigen sein, die unabhängig vom Zustand des Schalters während Elementerstellung wiederum definiert wurden. Die Pin des Schalters in der Bank -Funktion definiert wird als Eingang ohne Pull-up-Widerstand neu eingestellt werden.
Konstanten
- Keine.
Beispiele
- Digital_example
- Digital_bank_example
DigitalLatch
Die DigitalLatch-Klasse soll mit Kippschalter, verwenden, die nicht vorübergehend. Es sendet eine NoteOn und eine NoteOff Nachricht, jedes Mal, wenn sich der Zustand ändert. Die Verzögerung zwischen der ein- und Ausschalten Nachricht eingestellt werden. Wenn der Zustand ändert, bevor die Verzögerung beendet hat, die NoteOff sowieso Nachricht, und ein weiterer "Impuls" wird gestartet: ein weiterer NoteOn Nachricht gesendet wird, und nach der eingestellten Verzögerung ist auch die NoteOff-Nachricht gesendet.
Diese Klasse ist nützlich, wenn Sie möchten, verwenden Sie die Schaltflächen "mute" oder "Solo" in Ihrer Software mit nicht-momentane ein/aus schaltet. Wenn Sie den Netzschalter, die entsprechende Spur stummgeschaltet, wenn Sie den Schalter wieder, die abseits werden un-gedämpften, zum Beispiel.
Ihr wechselt zwischen der Pin und dem Boden zu verbinden, die internen Pull-up-Widerstände verwendet werden. Eine ungültige Pin-Nummer führt die LED an Pin 13 blinkt mit 1 Hz.
Element erstellen
- DigitalLatch (Byte Pin, Byte Hinweis, Byte-Kanal, Byte Geschwindigkeit, Int Verzögerung);
PIN ist der digitale Stift mit dem Schalter verbunden. Die internen Pull-up-Widerstand wird aktiviert.
Hinweis ist die MIDI-Note zu senden. 60 ist das mittlere C, und jede halbe Note ist plus oder minus eins. Sie können dies an die Controller-Nummer analog vergleichen.
Kanal ist der MIDI-Kanal.
die Geschwindigkeit ist die Notiz wie hart getroffen. Dies spielt keine Rolle für einen normalen Schalter, solange es nicht ist 0.
Delay ist die Verzögerung zwischen den NoteOn und NoteOff Nachrichten, in Millisekunden. 100ms funktioniert super. Geben Sie 0 ein.
Funktionen
- Refresh ();
Diese Funktion überprüft die Eingabe und sendet die entsprechende Meldung, wie in der Beschreibung dieser Klasse erläutert. (Hinweis: die NoteOff-Nachricht wird nicht gesendet, wenn diese Funktion erneut aufgerufen wird, nach dem Senden der Nachricht NoteOn. Wenn Sie dies in Ihrer Schleife setzen, aber sollten Sie feine.)
- Bank (Pin Byte, Byte Hinweis, Byte Channel);
Mit dieser Funktion können Sie einen Schalter (zusammen mit einem Bank-Schalter) für mehrere Steuerelemente verwenden. Ist die Bank Schalter im OFF zu positionieren, die Notiz und Kanal werden diejenigen, die während der Elementerstellung, definiert wurden, wenn der Bank-Schalter in der Position ist, werden den Hinweis und Kanal, die als Argumente für diese Funktion eingegeben wurden.
PIN ist der digitale Stift mit dem Schalter verbunden. Die internen Pull-up-Widerstand wird aktiviert.
Hinweis ist der Ton zu verwenden, wenn der Schalter aktiviert ist.
Kanal ist der Kanal zu verwenden, wenn der Schalter aktiviert ist.
- detachBank();
Diese Funktion deaktiviert die Bank -Funktionalität, die mit der Funktion Bank eingerichtet wurde. Der Hinweis und der Kanal werden diejenigen sein, die unabhängig vom Zustand des Schalters während Elementerstellung wiederum definiert wurden. Die Pin des Schalters in der Bank -Funktion definiert wird als Eingang ohne Pull-up-Widerstand neu eingestellt werden.
Konstanten
- Keine.
Beispiele
- DigitalLatch_example
- DigitalLatch_bank_example
Drehencoder
Diese Bibliothek soll mit einer Quadratur Encoder verwenden. Es ist aus PJRC Encoder Bibliothekangepasst. Relative Nachrichten sendet. Die Art und Weise negative Werte behandelt werden kann eingestellt werden. Die gemeinsame Pin des Gebers auf den Boden zu verbinden, die internen Pull-up-Widerstände verwendet werden. Eine ungültige Pin-Nummer führt die LED an Pin 13 blinkt mit 1 Hz.
Element erstellen
- Drehencoder (Byte pin1, pin2 Byte, Byte-Controller, Byte-Kanal, Int SpeedMultiply, Byte PulsesPerStep, Byte-Modus);
PIN1 ist die erste Interrupt-Pin mit dem Encoder verbunden.
PIN2 ist den zweiten Interrupt-Pin mit dem Encoder verbunden.
Controller ist die MIDI-Controller-Nummer (Daten 1 in der MIDI-Nachricht). Dies ist, wie es in Ihrer MIDI-Software, wie eine eindeutige Adresse angezeigt wird.
Kanal ist der MIDI-Kanal.
SpeedMultiply ist der Wert, der mit der Relativverschiebung multipliziert wird, wenn der Encoder nicht schnell genug in Ihrer Software. Wenn beispielsweise SpeedMultiply auf 5 festgelegt ist, und der Encoder waren eine '+ 1' Nachricht senden wird nun eine '+ 5'-Nachricht gesendet werden. Standardwert ist 1.
PulsesPerStep ist die Anzahl der Impulse, die der Encoder gibt, wenn Sie eine Stufe oder klicken Sie auf. Dies ist eine normale Drehgeber 4. Wenn Sie es auf 4 festlegen, ändert sich 1 Einheit in Ihrer Software pro Klick, wo Sie, statt 4 wiederum. Dies ist meist eher logisch. Für Jog-Wheels möchten Sie es auf 1, um die volle Auflösung des Rades nutzen einstellen. Verwenden Sie "NORMAL_ENCODER" oder "Joggen" als Argument.
Modus ist die Art und Weise die MIDI-Nachricht gesendet wird (um eine unterzeichnete Zahl zu machen). Es gibt 3 Modi zur Verfügung. Verwenden Sie "ADD_64", "SIGN_BIT" oder "POS1_NEG127" als Argument.
Funktionen
- Refresh ();
Diese Funktion überprüft die Encoder-Position, und wenn sie seit dem letzten Mal geändert hat, ist die relative Änderung über MIDI gesendet.
Konstanten
- NORMAL_ENCODER
setzen Sie PulsesPerStep auf 4, für normale Drehgeber.
- JOG
festlegen Sie PulsesPerStep auf 1, für die Jog-Wheels.
- ADD_64
Ersten Modus für relative MIDI-Nachrichten. Dies ist wahrscheinlich die einfachste. Diese Karten im Grunde 0 bis 64 (das 128/2). Zum Beispiel wenn ich-1 senden möchten, fügen ich 64, = 63 und ich es schicken. Wenn ich + 1 senden möchten, ich auch hinzufügen, 64, 65 =. Wenn ich nur 64 schicken, der Computer wird nichts tun, weil es weiß, dass es eine Verschiebung von 0. (Auf der Computerseite, subtrahieren sie nur 64, und können Sie das Ergebnis, wie nichts passiert.)
- SIGN_BIT
Zweiten Modus für relative MIDI-Nachrichten. Signierte Werte werden auf Computern meist mit einem Vorzeichenbit gespeichert. Das Vorzeichenbit ist das höchstwertige Bit. Wenn es 0 ist, die Zahl, die durch die anderen Bits definiert ist positiv, wenn es 1, die Zahl ist negativ. In einer MIDI-Nachricht, das ist etwas 6 (7. Bit, denn es ist 0-basiert). Zum Beispiel: + 4 wäre 0b00000100, und-4 wäre 0b01000100.
- POS1_NEG127
3. Modus für relative MIDI-Nachrichten. Definieren Sie + 1 als 1 und-1 als 127. Wir können dies weiter: + 2 = 2 und-2 = 126, etc. bis + 63 = 63 und-63 = 65.
Beispiele
- Encoder_example
sendMidi.h
Dies ist keine Klasse, es ist nur zwei Funktionen. Es findet automatisch heraus welche Arduino du verwendest, und wählt die richtigen Einstellungen eine MIDI senden. (Hinweis: Es ist bereits automatisch enthalten, wenn Sie die MIDI_controller-Bibliothek enthalten, da es die Klassen für die MIDI-Kommunikation verwenden.)
Funktionen
- SetupMidi (Byte-LedPin, Verzögerung);
Die MIDI-Verbindung setzt. Einmal im Setup ausführen.
LedPin ist die Pin mit der LED angeschlossen. In der Regel handelt es sich um 13. Die LED blinkt, jedes Mal, wenn eine Nachricht gesendet wird. Verwenden Sie wenn Sie dies nicht wünschen, oder wenn Sie Ihre Pins als Eingänge verwenden möchten, "NO_BLINK".
Delay ist die Verzögerung (in Millisekunden) hinzufügen nach jeder Nachricht, die gesendet. 5 oder 10 ms funktioniert einwandfrei. Für die Stabilität zu erhöhen, für schnellere Reaktion zu verringern. Einsatz "NO_DELAY" weiter, sobald die Nachricht, ohne Verzögerung gesendet wird. (Hinweis: Es ist normal, dass die "blink led" werden sehr dunkel verwenden Sie kurze oder keine Verzögerung, ist dies nur, weil die Zeit sehr kurz ist.)
- SendMidi (Byte MessageType, Byte-Kanal, Byte data1, data2 Byte);
Ein MIDI-Signal.
MessageType ist die Art der Nachricht, wie NoteOn, NoteOff oder CC. Dies ist ein 4-Bit-Zahl.
Kanal ist der MIDI-Kanal. Dies ist ein 4-Bit-Zahl auch.
Data1 ist das erste Datenbyte. Dies ist eine 7-Bit-Zahl.
Data2 ist das zweite Datenbyte. Dies ist auch eine 7-Bit-Zahl.
Hinweis: Lesen Sie Schritt 6 für weitere Informationen zu MIDI-Messages.
- SendMidi (Byte MessageType, Byte-Kanal, Int Daten);
Ein MIDI-Signal
MessageType ist die Art der Nachricht, wie Programmwechsel oder Pitch Bend.
Kanal ist der MIDI-Kanal. Dies ist ein 4-Bit-Zahl auch.
Daten ist der Wert gesendet werden. 7-Bit bei einem Programmwechsel, wählen Sie ein Instrument für einen Kanal oder eine Zahl zwischen-8192 und 8191 bei einem Pitch-Bend.
Konstanten
- NO_BLINK
Die LED blinkt nicht blinken, wenn eine Nachricht gesendet wird. Die LED-Pin wird auch nicht als Ausgang gesetzt.
- NO_DELAY
Keine Verzögerung wird hinzugefügt werden, nachdem die Nachricht gesendet wird.
- NOTE_ON
Nachrichtentyp: 0x90, verwenden um eine Notiz einzuschalten. Verwenden Sie NOTE_OFF oder senden Sie erneut mit der Geschwindigkeit = 0 wieder ausschalten.
- NOTE_OFF
Nachrichtentyp: 0 x 80, verwenden um einen Hinweis deaktivieren.
- CC
Nachrichtentyp: 0xB0 (Control Change), verwenden um Analogwerte, wie Werte aus einem Potentiometer zu senden.
- PROGRAM_CHANGE
Nachrichtentyp: 0xC0 (Program Change), verwenden um das Instrument eines bestimmten Kanals einzustellen. (Kanal 10 ist Percussion).
- PITCH_BEND
Nachrichtentyp: 0xE0 (Pitch Bend) verwenden, um große analoge Werte senden.
Debug
In den MIDI_controller-Library-Ordner ist eine Datei "debug.h". Wenn Sie mit Ihrem MIDI-Nachrichten Probleme kommentieren Sie die Zeile "#define DEBUG". Dies sendet alle MIDI-Nachrichten über seriell, mit 9600 Baud, in HEX-Notation. Tools wie "Midisnoop" können Sie um MIDI-Messages zu beheben.
Hinweis: vergessen Sie nicht, den Line out wieder kommentieren, um USB-MIDI wieder zu verwenden.
Beispiele
- sendMidi_example_intoxicated