-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmidi5.ino
217 lines (176 loc) · 6.79 KB
/
midi5.ino
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
/*
Use at your own risk - wasn't too sure what I was doing :)
Build vid: https://www.youtube.com/watch?v=z4jOhp0Z0G4
4 button, 3 bank Arduino Uno midi controller - 5 pin DIN output.
Selects programmes 1 - 12 with PC command
Toggles effect on/off using CC#11 (used for Line 6 M5 pedal) - change CC# in line 35 for anything else
Effect on/off is either latching or momentary, depending on pin on line 19 reading high or low. Input pullup used with a single pole switch to ground it.
Still a few bugs - works best on its own power supply - when daisy chained with other pedals I have issues with the momentary mode being grouned when the footswitches were used.
*/
int buttonPinsAll[] = {2, A2, 4, 5, 6, A1}; // all button inputs to set global pullup
int ledPins[] = {7, 8, 9, 10, 11, 12, A0 }; // output pins for bank LEDs
int fxLeds[] = {A3, A4, A5,13}; // leds for effect on
int effectOn[] = {0, 0, 0, 0}; // increments for each button pressed; even number is effect on, odd number is effect off / writes button state for momentary mode
int effectPins[] = {2, A2, 4, 5}; // effect on off button pins
int bankButton = 6; // bank change button pin
int momentary = A1; //
int currentBank = 1; // currently selected bank, starts on 1
int prevBank = 1; // prev selected bank, starts on 1
int bankOffset = 0; // gives buttons 1 - 4 the values 1 - 12 depending on bank selected
int bankButtonState = 1; // current state of the bank button
int lastBankButtonState = 1; // previous state of the bank button
int buttonState = 1; // current state of the effect button
int lastButtonState = 1; // previous state of the effect button
int lastButtonNum = 9; // to differentiate buttons; same button: on to off, diff button, on to on
int buttonNum[] = {1, 2, 3, 4}; // which button was pressed
int buttonDelay = 350; // time in ms delay after button press. Only way debouncing is being handled.
// midi messages:
byte progChange = 0xC0; // PC midi command
byte contChange = 0xB0; // CC Midi command
byte contNum = 11; // CC# for on/off
byte contOn = 70; // CC# value for FX on
byte contOff = 0; // CC# value for FX off
int presets[] {0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xA, 0xB, 0xC}; // hex values for presets 1 - 12
void fxOn() {
Serial.write(contChange);
Serial.write(contNum);
Serial.write(contOn);
}
void fxLedsOff() {
digitalWrite(fxLeds[0],LOW);
digitalWrite(fxLeds[1],LOW);
digitalWrite(fxLeds[2],LOW);
digitalWrite(fxLeds[3],LOW);
}
void fxOff() {
Serial.write(contChange);
Serial.write(contNum);
Serial.write(contOff);
}
void clearDisplay() {
digitalWrite(ledPins[0], LOW); // Turns Off all LEDs
digitalWrite(ledPins[1], LOW);
digitalWrite(ledPins[2], LOW);
digitalWrite(ledPins[3], LOW);
digitalWrite(ledPins[4], LOW);
digitalWrite(ledPins[5], LOW);
}
void display1() {
digitalWrite(ledPins[0], HIGH); // Display no 1
digitalWrite(ledPins[5], HIGH);
return;
}
void display2() {
digitalWrite(ledPins[0], HIGH); // Display no 2
digitalWrite(ledPins[1], HIGH);
digitalWrite(ledPins[2], HIGH);
digitalWrite(ledPins[3], HIGH);
digitalWrite(ledPins[4], HIGH);
return;
}
void display3() {
digitalWrite(ledPins[0], HIGH); // Display no 3
digitalWrite(ledPins[1], HIGH);
digitalWrite(ledPins[2], HIGH);
digitalWrite(ledPins[4], HIGH);
digitalWrite(ledPins[5], HIGH);
return;
}
void setup() {
Serial.begin(31250);
for (int i = 0; i < 7; i++) pinMode(ledPins[i], OUTPUT);
for (int i = 0; i < 4; i++) pinMode(fxLeds[i], OUTPUT);
for (int i = 0; i < 5; i++) pinMode(buttonPinsAll[i], INPUT_PULLUP); // input pullup used without external resistors
Serial.write(progChange);
Serial.write(0x00);
fxLedsOff();
fxOff();
display1(); //
}
void loop() {
int momState = digitalRead(momentary);
int bankButtonState = digitalRead(bankButton);
if (bankButtonState == lastBankButtonState && bankButtonState == 1) { // if no bank change then:
for (int i = 0; i <4 ; i++) { // read all the button pin states:
buttonState = digitalRead(effectPins[i]);
switch (momState) {
case 1: // momentary mode
digitalWrite(ledPins[6], LOW);
if (buttonState != effectOn[i] && buttonState == 0) { //pressed
Serial.write(progChange);
Serial.write(presets[bankOffset + i]);
fxOn();
digitalWrite(fxLeds[i],HIGH);
delay(10);
}
else if (buttonState != effectOn[i] && buttonState == 1) { //released
fxOff();
fxLedsOff();
delay(10);
}
else {
}
effectOn[i] = buttonState;
break;
case 0: // on/off mode
digitalWrite(ledPins[6], HIGH);
if (buttonState != lastButtonState && buttonState != 1) { // if button pressed:
lastButtonState = buttonState;
effectOn[i]++;
if (lastButtonNum != buttonNum[i]) { // turn effect on
fxLedsOff();
Serial.write(progChange);
Serial.write(presets[bankOffset + i]);
fxOn();
digitalWrite(fxLeds[i],HIGH);
effectOn[i] = 1;
delay(buttonDelay);
}
else if (lastButtonNum == buttonNum[i] && effectOn[i] % 2 == 0) { // turn effect off if same button pressed
Serial.write(progChange);
Serial.write(presets[bankOffset + i]);
fxLedsOff();
fxOff();
delay(buttonDelay);
}
else if (lastButtonNum == buttonNum[i] && effectOn[i] % 2 != 0) { // turn effect back on if turned off
Serial.write(progChange);
Serial.write(presets[bankOffset + i]);
fxLedsOff();
fxOn();
digitalWrite(fxLeds[i],HIGH);
delay(buttonDelay);
}
lastButtonNum = buttonNum[i];
}
lastButtonState = buttonState;
break;
}
}
}
else if (bankButtonState != lastBankButtonState && bankButtonState == 0 && currentBank == 3) { // if bank is changed and current bank is 3, change to 1
currentBank = 1;
bankOffset = 0;
clearDisplay();
display1();
lastButtonNum = int (buttonNum + 4);
delay(buttonDelay);
}
else if (bankButtonState != lastBankButtonState && bankButtonState == 0 && currentBank == 1) { // if bank 1, change to 2
currentBank++;
bankOffset = 4;
clearDisplay();
display2();
lastButtonNum = int (buttonNum + 1);
delay(buttonDelay);
}
else if (bankButtonState != lastBankButtonState && bankButtonState == 0 && currentBank == 2) { // if bank 2, change to 3
currentBank++;
bankOffset = 8;
clearDisplay();
display3();
lastButtonNum = int (buttonNum + 1);
delay(buttonDelay);
}
lastBankButtonState = bankButtonState;
}