DIY Guitar Stomp Pedal

    • Official Post

    Hallo Forenbewohner,


    ich bin ja neben "Großartigster Moderator aller Zeiten" [Blocked Image: http://www.feelinggood24.de/images/smilies/pfarrer.gif]auch 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. :)


    [Blocked Image: http://picload.org/infonail/cwrlwcw/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
    [Blocked Image: http://picload.org/thumbnail/cwrolgw/img_0509.jpg]
    Etwas Farbe später sah es dann so aus
    [Blocked Image: http://picload.org/thumbnail/cwrolrp/img_0511.jpg]


    Knöpfe + LEDs rein
    [Blocked Image: http://picload.org/infonail/cwroldg/img_0582.jpg]


    Als Steuerzentrale kommt bei mir einer meiner China Unos zum Einsatz:
    [Blocked Image: http://picload.org/infonail/cwroldc/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


    [Blocked Image: http://picload.org/infonail/cwrolli/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 [Blocked Image: http://www.millan.net/minimations/smileys/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.

    Der Unterschied zwischen Genie und Wahnsinn definiert sich im Erfolg.

    Edited once, last by dbv ().

  • Wie willst du das mit dem Status lösen?


    Ich hab das mit pickle gemacht, funktioniert super, weiß nur nicht ob das die schönste Art ist :P

  • 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]

  • Ich bin auf jeden Fall mal auf das Ergebnis gespannt. :thumbs1:


    MfG ProfDrFisch


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


    Support per [PM]

    • Official Post

    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.

    • Official Post

    Hatte etwas Zeit und der Python Code steht nun auch oben drin. Funktioniert, wird aber bestimmt noch einige kleinere Änderungen erfahren. Werde bei Gelegenheit mal ein Video machen.

    Der Unterschied zwischen Genie und Wahnsinn definiert sich im Erfolg.

    Edited once, last by dbv ().