MIDI Pedal / Stompbox (Peavey Vypyr VIP 1 und Sanpera Pedal)

 

Für simple MIDI Controller viel Geld bezahlen? Quatsch, das mach‘ ich selber!

MIDI ist ein Standard. Und Standards kann man studieren und umsetzen. Warum also nicht ein bisschen Zeit opfern, Wissen aneignen und Geld sparen zugleich? Ich habe recherchiert und kam nach Supportanfrage bei Peavey zu dem Ergebnis, dass es eigentlich möglich sein sollte sich so ein Teil selber zu bauen:

Komponenten:

  • Ausreichend Pappelspanplatte in 8mm Stärke
  • Technische Zeichnungen der Holzteile
  • 20 x 3.5 mm Torx Schrauben
  • optional: Holzleim
  • 5 x Momentary Switch ( Aliexpress )
  • Schiebepoti  KOhm-Bereich, 60 mm Pfadlänge, Schieber unter 1,2 mm breite( eBay )
  • 16 x 2 LCD mit entsprechendem Treiber
  • 1 x Arduino Nano
  • DIN 8 Pol Buchse, runde Anordnung (nach DIN 45326)
  • DIN-8 Kabel 1:1
  • Widerstände im K- oder MOhm Bereich
  • Zubehör: Jumper, Kupferlitze mit verschiedenen Isolierungsfarben, Lötkolben, diverse Zangen

1. Hardware

Das einzige Problem bei der Sache war, dass ich ein vernünftiges Gehäuse brauchte, weil die Erfahrung zeigte dass Probieren in dieser Hinsicht nicht über studieren geht! Wozu hat man denn Maschinenbauer auf seiner Hochschule? 😀 Nach ein paar Iterarionen und 2 Stunden später hatten wir dann das Modell, welches das Gehäuse des Pedals sein sollte.

Da war nun der Entwurf. Schnell wurde klar, dass der Deckel nicht ohne richtiges Werkzeug hergestellt werden kann. Die perfekt-rechteckige Form des Displays und der Schlitz für den Poti. Zum Glück hat man Freunde mit 3D Druckern! 🙂 Dazu später mehr!

Beim Besuch meiner Eltern (und vorallem deren Werkzeug 😉 ) machte ich mich daran, das Gehäuse ohne Deckel zu bauen. Also kurz in den Baumarkt und für 2€ (!!!) zugeschnitteses Holz gekauft, was sich leichter verarbeiten ließ. Dazu noch ein Paket Torx Schrauben und ran ans Werk. Nach dem Sägen mit der Stichsäge sah das ganze dann so aus:

Danach die Teile dann kurz an den Bandschleifer gehalten und zusammengebaut. Fehlt nur noch der 3D gedruckte Deckel! Leider habe ich vergessen ein Bild zu machen, bevor ich ihn bestückt habe. Man sieht, dass die Auflösungseinstellung des Druckers auf niedrig war, da es wirklich ein starkes Relief hat. Aber mit ein wenig groben Schleifpapier bekam es dann einen „Used-Look“ und sah doch ganz gut aus!

Die Elektronischen Bauteile mal auf einem Bild zusammengefasst:

Um nicht durcheinander zu kommen, habe ich an jedes nicht-offensichtliche Kabel die jeweilige Bezeichnung oder Pin angebracht.

Das stl-File für den Deckel könnt ihr euch hier herunterladen.

2. Theoretisches

Funktionen des Pedals

Das Pedal hat 5 Druckschalter. Der Mainswitch soll 3 Zustände auslösen, die die Funktionen der anderen 4 Schalter ändern. Ich habe zurzeit nur 2 Schaltzustände mit Funktionen belegt, weil ich mir noch nicht sicher war, was ich noch brauchen werde. Das heißt 4 Funktionen stehen mir und vorallem euch noch offen!

Button 1 Button 2 Button 3 Button 4
Zustand 1
Bank up Bank Down Record / Play Stop / Erase (kurz gedrückt halten)
Zustand 2
Preset 1 Preset 2 Preset 3 Preset 4
Zustand 3
Frei Frei Frei Frei

Vorschläge für den Zustand 3 sind gerne erwünscht! 🙂

Peavey spezifisches

Da MIDI für mich noch Neuland war, musste ich mich erstmal darüber informieren. Im Volksmund spricht man von „MIDI-Steckern“, welche allerdings korrekt ausgedrückt DIN 5 Pol Stecker nach DIN 45322 sind. Schaut man sich die Buchse vom Peavey Vypyr 1 (und ich denke auch anderen Sanpera kompatiblen Amps) an, erkennt man eine 8 Pol Buchse. Danke dafür Peavey… Nach Supportanfrage und Recherche kam aber heraus, dass Peavey 2 weitere Pole für die Spannungsversorgung nutzt, weswegen ein 5 Pol-System leider nicht mehr ausreicht.

Vypyr Pinout. Quelle: peavey.com

Ein paar Tage später fand ich diesen Schaltplan auch im Forum. Nach einigen Stunden probieren, weil es leider nicht so funktionierte wie ich es geplant habe, fand ich dann die richtige Pinbelegungen heraus. Ich denke wenn ich die Hälfte der Zeit damit verbracht hätte darüber zu lesen wäre ich früher fertig geworden. Naja, aber wo bleibt dann der Spaß? 😀

Pin 6: Spannungsversorgung. Gemessen wurden 8.25 V

Pin 8 (und 2): Obwohl 2 als nicht Verbunden dargestellt wird, habe ich ihn auf Masse gelegt. Tatsächlich weiß ich auch nicht mehr genau warum.

Pin 4: MIDI_IN+; Mit 5V DC versorgen.

Pin 5: MIDI_IN-; Empfänger der Signale vom Arduino

MIDI bei Peavey:

Im Forum von Peavey gibt es einige Threads bezüglich MIDI Befehlen. Allerdings scheint Peavey das von Amp zu Amp unterschiedlich zu gestalten. Ich fand für den Vypyr leider keine Dokumentation. Also musste was anderess her. Zum Glück gibt es Menschen mit MIDI-Loggern, die das Sanpera Pedal untersucht haben: Quelle

Daraus konnte ich zusammen mit herumprobieren und Threads im Peavey Forum langsam aber sicher herausfinden, wie das eigentlich Funktioniert. Ich differenziere in meinem Beispiel von Note-On-Note-Off und CC-Befehlen (Continuous Controller).

Note-On-Note-Off Befehle:

Betrachtet man MIDI bezüglich Keyboards, dann muss definiert werden, was passiert, wenn der Benutzer eine Keyboardtaste drückt. Dabei wird festgelegt welche Taste er drückt und wie schnell er sie drückt:

Most-significant Nibble Least-significant Nibble Byte 1 Byte 2
1001 0000 Key Number [0 – 127] Velocity [0 – 127]

Die obige Tabelle ist hier entnommen und zeigt den Aufbau eines Note-Befehls. Das erste Byte (Most und Least significant Nibble) soll uns erstmal egal sein. Wir arbeiten nicht mit Channels. Bei uns ist das erste Byte immer 1001 0000 bzw. 0x90.  Uns interessieren Byte 1 und 2. Das erste Byte legt fest, welche Funktion wir aktivieren wollen (Adresse). Das zweite Byte wird von uns eher als Flag gesehen ( 0 für Note-Off und 0x7F bzw. 127 für Note-On). Wenn wir eine Funktion aktivieren möchten, senden wir Note-On an eine definierte Adresse, und direkt danach Note-Off an die selbe und die Funktion sollte aktiviert sein.

Ein kleines Beispiel:

Die Funktion „Preset 2 aktivieren“ liegt auf Adresse 0x04:

  1. Note-On: 0x90 0x04 0x7F

2. Note-Off: 0x90 0x04 0x00

3. Die Funktion wurde aktiviert.

Dieses Verfahren wird genutzt, wenn wir etwas aktivieren oder deaktivieren wollen. Was aber wenn wir mehr als 2 Zustände haben?

MIDI Continuous Controller Befehle:

MIDI-CC Befehle sind EIGENTLICH standardisiert, sodass Controller und Geräte untereinader kompatibel sind. Leider gibt es Adressbereiche, die undefiniert sind. Aber zum Glück haben wir ja unsere Sanpera Logs! 🙂

Most-significant Nibble Least-significant Nibble Byte 1 Byte 2
1011 0000 Key Number [0 – 127] Velocity [0 – 127]

Im Grunde wieder das gleiche Spiel wie oben, nur mit diskreten Werten für Byte 2.

Ein Beispiel für eine CC-Nachricht:

0xB0 0x24 0x3C

0xB0 steht für die Adressierung an ein CC-„Register“. (Ob man in auf dieser Ebene von Registern sprechen kann?). 0x24 steht für das Volume-Pedal und 0x3C ist ein diskreter Wert für die Lautstärke (Dezimal 60, also fast halbe Lautstärke).

Relevante „Registeradressen“ für diese Anwendung:

Befehl Registeradresse
 Preset 1  0x05
 Preset 2  0x04
 Preset 3  0x09
 Preset 4  0x07
 Bank up  0x0E
 Bank down  0x10
 Record/Play Loop  0x00
 Stop/Erase Loop  0x02

Quelle: http://www.vguitarforums.com/smf/index.php?topic=3119.0

3. Umsetzung

Schaltpläne

Zu dem Schaltplan gibt es eigentlich nicht viel zu sagen. Vergleicht die jeweiligen Pins mit den im Code deklarierten und dann sollte alles von alleine funktionieren.

Eagle Schaltplan

Achtet bei dem Volume-Poti auf den Vorwiederstand, sonst begrenzt ihr den Strom nicht und euer ADC spielt verrückt, wenn der Poti einen kleinen Wiederstandswert annimmt. Ich habe den Strom mit 1 kOhm begrenzt.

 

Arduino Code

Ich finde, dass der Code klein genug ist um ihn in eine Datei zu klatschen, deswegen nicht wundern, warum dort Klassen und Konstanten rumfliegen. 😀

Code

Wenn ich einen µC ausnahmweise mal objektorientiert programmiere, dann gefälligst auch ohne Interrupts!  Deswegen musste irgendwie Abhilfe geschaffen werden: Dazu wird in der Loop-Funktion eine Button-Callback Funktion aufgerufen, die die Buttons und den Poti abfragt. Die Lösung über die Callback-Funktion sollte bezüglich der Taktrate für diese Zwecke genügen. Jeder Button ist ein Objekt der Klasse Button, und wird in einem Button[ ] gespeichert. Wird ein Button gedrückt, wird die ID des gedrückten Buttons in currentButton gespeichert und global verwendet. Außerdem werden in dem Objekt Flags gesetzt, um zu differenzieren, ober lange oder kurz gedrückt wurde. Die Werte vom Poti werden dann auf 0 bis 100 gemapt. Leider wird die Auflösung vom Poti nicht 1:1 übertragen, da erstens der Amp sowieso nur eine range von 0 – 127 annimmt (signed 8 bit?) und ich einen Vorwiederstand vor dem Poti einbauen musste, welcher einen Offset generiert und die Auflösung verfälscht (bei mir etwa (5/6). Aber okay, weil 5/6 von den 1024 (10 Bit ADC) sind immerhin 853, was beim mappen sowieso nicht auffällt.

Hinweise:

1. Die Pins an denen ihr eure Hardware angeschlossen habt, falls ihr sie denn Verändert habt, müsst ihr oben in den Makros (zB. BUTTON_1) ändern

2. Ein Button ist ein Objekt der Klasse Button und hat ein für euch relevantes Feld:

bool pressMode = false; //false is tap, true is longpress

Das ist das flag, das gesetzt wird, wenn der Button länger gedrückt wird. Mithilfe dieses Flags könnt ihr das dann in den Handler-Funktionen unterscheiden.

3. In der Loop funktion seht ihr oft ausdrücke wie „usedButtons[currentButton]->pin„. usedButtons it das Button-Array, currentButton die von der Callback-Funktion „CaptureButtons“ zurückgegebene Button-ID. Auf diese Weise kann man also den gerade gedrückten Button identifizieren. Ist dies getan, könnt ihr entweder noch das flag pressMode abfragen, um zu unterscheiden ob er lange oder kurz gedrückt wurde und dann eure Logik einfügen.

 if(switchState == 1){
 if(usedButtons[currentButton]->pin == BUTTON_1){
  NoteOnNoteOff(BANK_UP);
  currentBank = getCurrentBank(1);
  lcdBank(currentBank);
  }

„Ist der Mainswitch auf der ersten Position?“

„Entspricht der Pin des momentan gedrückten Schalters BUTTON_1 (Pinnummer) ? „

4. Die MIDI Funktionen sollten aufgrund des oberen Kapitels selbsterklärend sein.

Das einzige was zutun ist, ist den Code zu erweitern, nicht aber zu Verändern. Neue if-else abfragen Mainswitch-Zustand 3 und die 4 Buttons in die Loop-Funktion und die jeweiligen CC oder NoteOn-NoteOff-Befehle.

 

Bei Fragen oder Verbesserungsvorschlägen stehe ich euch gern zur Verfügung!

Bis dann!

Schreibe einen Kommentar

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