Morsetaste als MIDI-Haltepedal mit Arduino

Ich habe ein großes MIDI-Keyboard mit 76 Tasten, aber leider kein Haltepedal dafür. Wer schon einmal Klavier gespielt hat weiß, wie groß der Einfluss des Haltepedals auf den Klang ist, weshalb wir uns in diesem Artikel anschauen wollen, wie man sich ein Ersatz-Haltepedal zusammenbauen kann.

Hardware

Zuerst wollte ich aus Kosten- und Zeitgründen nur Materialien verwenden, die ich sowieso schon rumliegen haben. Hierzu gehört ein Arduino Leonardo und eine Morsetaste.

Arduino und Morsetaste nebeneinander
Die Bauteile: ein Arduino Leonardo und eine Morsetaste

Der Schaltkreis ist sehr simpel: der Arduino soll auslesen ob der Taster gedrückt ist und dementsprechend den Wert an den Computer über USB weitergeben. Dafür kann man die internen Pullup-Widerstände verwenden; man legt die eine Seite des Tasters auf Masse (GND) und die andere an den Eingabe-Pin an. Ist der Schalter nicht gedrückt, „zieht“ der Pullup-Widerstand die Eingabe auf einen hohen Pegel und verhindert so, dass der Wert zwischen einem hohen und niedrigen Pegel schwebt. Mehr dazu findet man in der englischsprachigen Arduinodokumentation über digitale Pins.

Folglich benötigen wir nur zwei Kabel von der Morsetaste an den Arduino. Eines der Kabel schließen wir an Pin 12, das andere an GND.

Anschlüsse auf der Rückseite der Morsetaste

Software

Digitale Instrumente geben ihre Eingabewerte fast immer über das MIDI-Protokoll an den Rechner weiter. Das Protokoll ist sehr simpel, es werden einzelne 3-Byte-Datenpakete gesendet wenn eine Taste gedrückt oder losgelassen wird bzw. andere Ereignisse auftreten. „Andere Ereignisse“ bezeichnet hier die sogenannten Continuous Controller, genauer: den Hold-1-Controller – dieser gibt nämlich den Zustand des Haltepedals an. Aus der Tabelle des Wikipedia-Artikels liest sich heraus, dass das hexadezimale Format für Hold-1-Controller-Pakete Bn 40 vv ist wobei n den MIDI-Kanal und vv den Wert des Haltepedals angibt. Wählen wir beispielhaft Kanal 1, dann sehen die Nachrichten für das Drücken bzw. Loslassen des Pedals so aus:

Drücken:   B1 40 1F
Loslassen: B1 40 00

Wie können wir diese Pakete nun vom Arduino aus senden? Glücklicherweise hat sich jemand schon die Mühe gemacht, dafür eine Softwarebibliothek zu schreiben: MIDIUSB.

Hier mein Arduino-Sketch:

#include <MIDIUSB.h>

const int PEDAL_PIN = 12;
const byte MIDI_CHANNEL = 1;

midiEventPacket_t midiPacket = {
  0x0B, // event type: control change
  0xB0 | (MIDI_CHANNEL & 0b1111),
  0x40, // Hold 1
  0x00  // Value
};

void setup() {
  Serial.begin(115200);
  pinMode(PEDAL_PIN, INPUT_PULLUP);
}

void loop() {
  delay(10); // Debounce
  
  int pedalValue = digitalRead(PEDAL_PIN);
  byte midiValue = (pedalValue == 0) ? 127 : 0;
  midiPacket.byte3 = midiValue;
  
  MidiUSB.sendMIDI(midiPacket);
  MidiUSB.flush();
}

In der setup-Methode wird der Pullup-Widerstand des Eingabepins aktiviert. In der loop-Methode lesen wir dann kontinuierlich den Wert der Morsetaste und setzen midiValue auf den Höchstwert 127 falls sie gedrückt ist und Masse anliegt (also Wert 0) oder auf 0 falls die Taste nicht gedrückt ist (dann liegt ein hoher Signalpegel an). Zu guter letzt wird das Paket entsprechend des gelesenen Wertes modifiziert und abgesendet.

Test

Nachdem der Sketch hochgeladen ist, kann man überprüfen ob die richtigen Pakete ankommen. Unter Linux geht das mit dem Befehl amidi. Zuerst sucht man das richtige Gerät heraus:

$ amidi --list-devices
Dir Device    Name
IO  hw:2,0,0  USB Device 0x7104:0x2202 MIDI 1
IO  hw:2,0,1  USB Device 0x7104:0x2202 MIDI 2
IO  hw:3,0,0  Arduino Leonardo MIDI 1
$ amidi --dump --port hw:3,0,0
B1 40 00
B1 40 00
B1 40 00
B1 40 00
B1 40 00
B1 40 00
-- Pedal gedrückt --
B1 40 7F
B1 40 7F
B1 40 7F
B1 40 7F
B1 40 7F

Fazit

Dank der Arduino-Bibliothek lassen sich sehr schnell eigene MIDI-Geräte konstruieren, und auch wenn eine Morsetaste bezüglich der Haptik einem echten Klavierpedal unterlegen ist, ist es dennoch viel besser als gar keins zu haben!

Kommentare

Um einen Kommentar hinzuzufügen, schreibe eine E-Mail mittels dieses Links.