From 414fbb94f37679308d3e93a6be3079ca71df9c31 Mon Sep 17 00:00:00 2001 From: Michael Sippel Date: Thu, 28 Nov 2024 18:47:30 +0100 Subject: [PATCH] initial commit --- pedalboard-footswitch.ino | 111 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100644 pedalboard-footswitch.ino diff --git a/pedalboard-footswitch.ino b/pedalboard-footswitch.ino new file mode 100644 index 0000000..d179479 --- /dev/null +++ b/pedalboard-footswitch.ino @@ -0,0 +1,111 @@ +#define SEL_A_IN D2 +#define SEL_A_LED D3 +#define SEL_B_IN D4 +#define SEL_B_LED D5 +#define SEL_C_IN D6 +#define SEL_C_LED D7 +#define SEL_D_IN D8 +#define SEL_D_LED D9 + +#define SUST_IN D10 +#define EXPR_IN A0 + +void setup() { + pinMode( SEL_A_IN, INPUT_PULLUP ); + pinMode( SEL_A_LED, OUTPUT ); + pinMode( SEL_B_IN, INPUT_PULLUP ); + pinMode( SEL_B_LED, OUTPUT ); + pinMode( SEL_C_IN, INPUT_PULLUP ); + pinMode( SEL_C_LED, OUTPUT ); + pinMode( SEL_D_IN, INPUT_PULLUP ); + pinMode( SEL_D_LED, OUTPUT ); + + pinMode( SUST_IN, INPUT_PULLUP ); + pinMode( EXPR_IN, INPUT_PULLUP ); + + Serial.begin(31250); +} + +int last_expr_val = 0; +int last_sust_val = 0; + +#define NOTE_OFF 0x8 +#define NOTE_ON 0x9 +#define AFTERTOUCH 0xA +#define CONTROL_CHANGE 0xB +#define PATCH_CHANGE 0xC +#define CHANNEL_PRESSURE 0xD +#define PITCH_BEND 0xE +#define OTHER 0xF + +//send MIDI message +void MIDImessage(int cmd_id, int data1, int data2) { + int channel = 0; + int cmd_byte = (cmd_id << 4) | (channel & 0xf); + Serial.write(cmd_byte);//send command byte + Serial.write(data1);//send data byte #1 + Serial.write(data2);//send data byte #2 +} + +void loop() { + delay(100); + + if( digitalRead( SUST_IN ) == LOW ) { + if( last_sust_val != 1 ) { + last_sust_val = 1; + MIDImessage( CONTROL_CHANGE, 0x42, 0x7f ); + } + } else { + if( last_sust_val != 0 ) { + last_sust_val = 0; + MIDImessage( CONTROL_CHANGE, 0x42, 0x00 ); + } + } + + int expr_val = analogRead( EXPR_IN ); + if( expr_val != last_expr_val ) + { + last_expr_val = expr_val; + + float expr_val_f = (float)(expr_val - 66) / 590.0; + if( expr_val_f < 0.0 ){ + expr_val_f = 0.0; + } + if( expr_val_f > 1.0 ){ + expr_val_f = 1.0; + } + + int val_b = (int)(expr_val_f * 128.0); + + MIDImessage( CONTROL_CHANGE, 0x0b, val_b ); + } + + if( digitalRead( SEL_A_IN ) == LOW ) { + MIDImessage( PATCH_CHANGE, 0x0, 0x0 ); + digitalWrite( SEL_A_LED, HIGH ); + digitalWrite( SEL_B_LED, LOW ); + digitalWrite( SEL_C_LED, LOW ); + digitalWrite( SEL_D_LED, LOW ); + } + if( digitalRead( SEL_B_IN ) == LOW ) { + MIDImessage( PATCH_CHANGE, 0x1, 0x1 ); + digitalWrite( SEL_A_LED, LOW ); + digitalWrite( SEL_B_LED, HIGH ); + digitalWrite( SEL_C_LED, LOW ); + digitalWrite( SEL_D_LED, LOW ); + } + if( digitalRead( SEL_C_IN ) == LOW ) { + MIDImessage( PATCH_CHANGE, 0x2, 0x2 ); + digitalWrite( SEL_A_LED, LOW ); + digitalWrite( SEL_B_LED, LOW ); + digitalWrite( SEL_C_LED, HIGH ); + digitalWrite( SEL_D_LED, LOW ); + } + if( digitalRead( SEL_D_IN ) == LOW ) { + MIDImessage( PATCH_CHANGE, 0x3, 0x3 ); + digitalWrite( SEL_A_LED, LOW ); + digitalWrite( SEL_B_LED, LOW ); + digitalWrite( SEL_C_LED, LOW ); + digitalWrite( SEL_D_LED, HIGH ); + } +}