- Offizieller Beitrag
Hallo Forenbewohner,
ich bin ja neben "Großartigster Moderator aller Zeiten" 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.
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:
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
Etwas Farbe später sah es dann so aus
Als Steuerzentrale kommt bei mir einer meiner China Unos zum Einsatz:
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
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
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.