DIY Guitar Stomp Pedal

L I V E Stammtisch ab 20:30 Uhr im Chat
    • Offizieller Beitrag

    Hallo Forenbewohner,

    ich bin ja neben "Großartigster Moderator aller Zeiten" pfarrer.gifauch noch der schlechteste Gitarrenspieler der Welt, was mich nicht davon abhält
    weiter Gitarren zu kaufen und auf die Saiten einzudreschen was das Zeug hält. :)

    img_0384.jpg

    Gitarrenzubehör ist schweineteuer, vor allem wenn es an Effektgeräte und Co geht. Deswegen bin ich vor einiger Zeit auf Softwareeffekte umgestiegen.
    Was für den Profi lächerlich klingt, bietet mir für "schmales" Geld ein Haufen verschiedene Amps / Effekte/ Mikros usw.

    Mein Derzeitiges Setup Sieht wie folgt aus:

    Code
    Gitarre an USB/Guitarinterface - PC
                |
                |
                ---Fender 15W Amp (Clean Channel)

    Als Software nutze ich Reaper und Amplitube

    Und da kam der Schlips ins Rad. Wie stellt man beim Spielen die Effekte um ohne die Hand von der Gitarre nehmen zu müssen. Dafür gibt es normalerweise Fußschalter und
    natürlich bietet auch jeder Softwarehersteller welche passend dazu an, für utpoische Preise und meistens Hersteller/ Software gebunden.

    Ich hatte noch einen 2 Button Schalter von Line6 rumliegen, der natürlich nur mit Line6 Verstärkern funktioniert (welcher leider das Zeitliche gesegenet hat). Also den ganzen Quatsch rausgerissen die
    Knöpfe an den Arduino gehangen und etwas GruselCode später hatte ich den Schalterdruck auf dem PC. Da mir 2 Knöpfe zuwenig waren, ersann ich die Idee
    mein eigenes StompPedal zu bauen. Die Schalter sollten bei Tastendruck einen String an den PC senden, dieser nimmt den entgegen und baut daraus ein Midi
    Steuersignal welches dann die Effekte in der Software Schaltet.

    Bauphase:

    Die Fußschalter hab ich mir bei Ebay gekauft ( Klick ). Kabel, Widerstände, RGB LEDS hatte ich noch rumliegen.
    Das Gehäuse wurde aus Metallresten zusammengebrutzelt
    img_0509.jpg
    Etwas Farbe später sah es dann so aus
    img_0511.jpg

    Knöpfe + LEDs rein
    img_0582.jpg

    Als Steuerzentrale kommt bei mir einer meiner China Unos zum Einsatz:
    img_0611.jpg

    Ich wollte zuerst nen ProMini nehmen aber ich wollte keinen USB-TTL Adapter verbraten und die China Unos kosten mich $2,49 das Stück.

    Fertiger FootStomp

    img_0610.jpg

    Software:

    Man braucht auf dem PC ein virtuelles MidiInterface. Ich nutze dafür loopmidi.
    Ich hatte zuerst mit der MidiLib vom Arduino rumgespielt, welche über ein Serial-To-Midi Interface (z.B. Hairless Midi) die Signale an meinen virtuellen Midiport übergibt.
    Allerdings wurde mich mit der Software nicht wirklich warm (zu unflexibel) und ich beschloss den Serial to Midi Teil selbst in Python zu schreiben.

    Da der Uno standardmäßig nur auf 2 Pins interrupten kann, kommt die grossartige PinChangeInt Libraray zum Einsatz, die Interrupts auf allen Pins ermöglicht.

    Ich hab ne lauffähige Testversion des Codes, werde den aber erst hier reinstellen wenn ich den halbwegs getestet hab.


    Der Code:

    Arduino Scetch
    [code=php]
    #include <PinChangeInt.h>
    #include <EEPROM.h>

    long debouncing_time = 15; //Debouncing Time in Milliseconds
    volatile unsigned long last_micros;
    boolean stringComplete = false;
    String inputString = "";
    String eepromval = "";
    int LED1 = 2;
    int LED2 = 4;
    int LED3 = 5;
    int LED4 = 6;
    int LED5 = 7;
    int LED1_1 = A0;
    int LED2_1 = A1;
    int LED3_1 = A3;
    int LED4_1 = A4;
    int LED5_1 = A5;

    int btn1 = 8;
    int btn2 = 9;
    int btn3 = 10;
    int btn4 = 11;
    int btn5 = 12;


    void setup() {
    Serial.begin(9600);
    attachPinChangeInterrupt(btn1, debintf1, CHANGE);
    attachPinChangeInterrupt(btn2, debintf2, CHANGE);
    attachPinChangeInterrupt(btn3, debintf3, CHANGE);
    attachPinChangeInterrupt(btn4, debintf4, CHANGE);
    attachPinChangeInterrupt(btn5, debintf5, CHANGE);
    pinMode(LED1, OUTPUT);
    pinMode(LED2, OUTPUT);
    pinMode(LED3, OUTPUT);
    pinMode(LED4, OUTPUT);
    pinMode(LED5, OUTPUT);
    pinMode(LED1_1, OUTPUT);
    pinMode(LED2_1, OUTPUT);
    pinMode(LED3_1, OUTPUT);
    pinMode(LED4_1, OUTPUT);
    pinMode(LED5_1, OUTPUT);
    digitalWrite(LED1, HIGH);
    digitalWrite(LED2, HIGH);
    digitalWrite(LED3, HIGH);
    digitalWrite(LED4, HIGH);
    digitalWrite(LED5, HIGH);
    int LEDarray[5] = {LED1_1, LED2_1, LED3_1,LED4_1,LED5_1};
    for (int i = 0; i<5; i++){
    if (EEPROM.read(i) == 1) {
    digitalWrite(LEDarray[i], HIGH);
    }
    else
    {
    digitalWrite(LEDarray[i], LOW);
    }
    }


    }
    void debintf1() {
    if ((long)(micros() - last_micros) >= debouncing_time * 1000) {
    EEPROM.write(0,(char)!digitalRead(LED1_1));
    digitalWrite(LED1_1, !digitalRead(LED1_1));
    Interrupt1();

    last_micros = micros();
    }
    }
    void debintf2() {
    if ((long)(micros() - last_micros) >= debouncing_time * 1000) {
    EEPROM.write(1,(char)!digitalRead(LED2_1));
    digitalWrite(LED2_1, !digitalRead(LED2_1));
    Interrupt2();
    last_micros = micros();
    }
    }
    void debintf3() {
    if ((long)(micros() - last_micros) >= debouncing_time * 1000) {
    EEPROM.write(2,(char)!digitalRead(LED3_1));
    digitalWrite(LED3_1, !digitalRead(LED3_1));
    Interrupt3();
    last_micros = micros();
    }
    }
    void debintf4() {
    if ((long)(micros() - last_micros) >= debouncing_time * 1000) {
    EEPROM.write(3,(char)!digitalRead(LED4_1));
    digitalWrite(LED4_1, !digitalRead(LED4_1));
    Interrupt4();
    last_micros = micros();
    }
    }
    void debintf5() {
    if ((long)(micros() - last_micros) >= debouncing_time * 1000) {
    EEPROM.write(4,(char)!digitalRead(LED5_1));
    digitalWrite(LED5_1, !digitalRead(LED5_1));
    Interrupt5();
    last_micros = micros();
    }
    }
    void Interrupt1() {
    Serial.println("btn_1");
    }
    void Interrupt2() {
    Serial.println("btn_2");
    }
    void Interrupt3() {
    Serial.println("btn_3");
    }
    void Interrupt4() {
    Serial.println("btn_4");
    }
    void Interrupt5() {
    Serial.println("btn_5");
    }

    void serialEvent() {
    while (Serial.available()) {
    // get the new byte:
    char inChar = (char)Serial.read();
    inputString += inChar;
    if (inChar == '\n') {
    stringComplete = true;
    delay(1000);
    }
    }
    }
    void loop() {

    if (stringComplete) {
    for (int i = 0; i < 5; i++) {
    eepromval = eepromval + EEPROM.read(i) +";";
    }
    delay(1000);
    Serial.println(eepromval);
    eepromval = "";
    // clear the string:
    inputString = "";
    stringComplete = false;
    }
    }
    [/php]

    Python
    [code=php]
    import pygame.midi
    import serial
    import time
    #define COM Port/ BAUD here
    COM = "Com3"
    BAUD = 9600
    #define your PortName from loopMidi here
    loopMidiName = "StompPedal"

    def close_midi():
    pygame.midi.quit()
    def send_midi(out, channel, value :(
    out.write_short(0xb0, channel, value)
    def to_bool(val):
    return True if val == "1" else False
    def get_eeprom_status():
    #since the arduino doesnt care what is sent, just send a 1 + newLine ;)
    ser.write("1\n")
    time.sleep(0.3)
    status = ser.readline().strip().split(";")
    return filter(None,status)
    def get_midi_output_interface():
    pygame.midi.init()
    for index in range(pygame.midi.get_count()):
    device = pygame.midi.get_device_info(index)
    if device[1] == loopMidiName and device[3] == 1:
    print "Interface %d selected" % index
    return index


    btns ={"btn_1" : False,
    "btn_2" : False,
    "btn_3" : False,
    "btn_4" : False,
    "btn_5" : False}
    btns_midi_chan ={"btn_1" : 1,
    "btn_2" : 2,
    "btn_3" : 3,
    "btn_4" : 4,
    "btn_5" : 5}
    btns_bin = {True:0,
    False:127}


    out = pygame.midi.Output(get_midi_output_interface())
    print "Fetching Values from Arduino @ %s" % COM
    ser = serial.Serial(COM, BAUD)
    time.sleep(5)
    #set button state acc. to saved values from eeprom
    for index, val in enumerate(get_eeprom_status()):
    btns["btn_"+str(index+1)] = to_bool(val)
    print "done, button values set to:"
    print btns
    #send midi commands to vst to switch hardware acc. to button state
    print "Sending inital midi signals"
    for key, val in btns.iteritems():
    send_midi(out, btns_midi_chan[key], btns_bin[val])
    print "starting loop...waiting for input"
    while True:
    act = ser.readline().strip()
    btns[act] = not btns[act]
    send_midi(out, btns_midi_chan[act], btns_bin[btns[act]])
    [/php]

    So long and keep rockf.gif


    Edit: Woll ja mal ja noch was zu den Kosten schreiben:

    Wer mal bei ebay "Midi fußschalter" schalter eingibt, sieht wie wenig man für 100€ kriegt :-/

    Ich hab 2 Fußpedale gebaut, das abgebildete ist der Prototyp

    10 Fußschalter: 13€
    2 Unos : 5€
    2 Metallboxen: 2x Packungen "edle Tropfen" :thumbs1:
    Sprüh/Klarlack: 10€
    sonstiger Kleinkram: 20€
    Pflaster, weil ich Rindvieh immer in den Lötkolben fasse: 1€

    Macht zusammen: ~50€ für 2 FußSchalter.

  • EEPROM ist evtl. so ne Sachen wegen der Lebensdauer, ich würde zumindest auf einen externen setzen, den könnte man im Gegensatz zum internen wechsel, sollte er wirklich mal den Geist aufgeben (nach Wikipedia ca. 10^6 Schreibvorgänge, dass könnte sich dann in der Zukunft bemerkbar machen und man sucht mal wieder Stunden nach dem Fehler).
    Ansonsten viel Glück!

    MfG ProfDrFisch


    Ein "Gefällt mir" oder eine Bewertung wäre nett. :danke_ATDE:

    Support per [PM]

    • Offizieller Beitrag

    So hab den Arduino Code mal oben hingeschmissen, der hat bei der Definition der Zustände noch einigen Nachbesserungsbedarf (Schleifen statt 100x pinmode) aber ich wollte ihn erstmal posten. btw. Ich hab ich mich doch dafür entschieden den Schalterzustand direkt ins EEPROM zu schreiben. Das ganze ding ist fast komplett aus Interrupts aufgebaut und liefert sobald man irgendwas mit \n an den Uno schickt, den Zustand als String zu zurück.

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!