upload source of first version
parent
eb88e76668
commit
a278b3484a
|
@ -0,0 +1,131 @@
|
||||||
|
|
||||||
|
// some hardware settings
|
||||||
|
const int num_buttons = 4;
|
||||||
|
int leds[num_buttons] = {12, 11, 10, 9}; // Pin numbers of the LEDs
|
||||||
|
int buttons[num_buttons] = {8, 7, 6, 5}; // Pin numbers of the Buttons
|
||||||
|
|
||||||
|
// some technical settings
|
||||||
|
unsigned long debounce_delay = 50;
|
||||||
|
int long_button_time = 700;
|
||||||
|
|
||||||
|
// initialize startup values
|
||||||
|
int page = 0;
|
||||||
|
bool page_set = false;
|
||||||
|
|
||||||
|
bool channel[num_buttons * num_buttons];
|
||||||
|
bool active_button[num_buttons];
|
||||||
|
|
||||||
|
unsigned long button_start[num_buttons];
|
||||||
|
unsigned long button_debounce[num_buttons];
|
||||||
|
|
||||||
|
|
||||||
|
unsigned long last_led_switch;
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
for (int i = 0; i < num_buttons; i++) {
|
||||||
|
// set everything up
|
||||||
|
// pin modes...
|
||||||
|
pinMode(leds[i], OUTPUT);
|
||||||
|
pinMode(buttons[i], INPUT_PULLUP);
|
||||||
|
|
||||||
|
// button states...
|
||||||
|
button_start[i] = 0;
|
||||||
|
active_button[i] = false;
|
||||||
|
|
||||||
|
// boot signal
|
||||||
|
digitalWrite(leds[i], HIGH);
|
||||||
|
}
|
||||||
|
// Start Midi transmitting
|
||||||
|
Serial.begin(31250);
|
||||||
|
|
||||||
|
// Boot ready
|
||||||
|
delay(1000);
|
||||||
|
for (int i = 0; i < num_buttons; i++) {
|
||||||
|
digitalWrite(leds[i], LOW);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
// loop over all buttons
|
||||||
|
for (int i = 0; i < num_buttons; i++) {
|
||||||
|
// read button state
|
||||||
|
int reading = digitalRead(buttons[i]);
|
||||||
|
|
||||||
|
//check if button state changed to active
|
||||||
|
if (reading == LOW && active_button[i] == false && button_start[i] == 0) {
|
||||||
|
// change button state
|
||||||
|
active_button[i] = true;
|
||||||
|
button_start[i] = millis();
|
||||||
|
|
||||||
|
// check if button state is still active
|
||||||
|
} else if (reading == LOW && active_button[i] == true) {
|
||||||
|
// check if its a long press
|
||||||
|
if ((button_start[i] != 0) && (millis() - button_start[i] > long_button_time)) {
|
||||||
|
if (i != page)
|
||||||
|
set_page(i); // change page on long press
|
||||||
|
page_set = true;
|
||||||
|
|
||||||
|
// LED blink if page is changed
|
||||||
|
if (millis() - last_led_switch > 100) {
|
||||||
|
digitalWrite(leds[i], digitalRead(leds[i]) ? LOW : HIGH);
|
||||||
|
last_led_switch = millis();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// check if button is released
|
||||||
|
if (reading == HIGH && active_button[i] == true) {
|
||||||
|
active_button[i] = false;
|
||||||
|
|
||||||
|
if (!page_set && (millis() - button_start[i] > debounce_delay)) {
|
||||||
|
toggle_channel(i); // toggle channel only if its not a long press
|
||||||
|
}
|
||||||
|
|
||||||
|
// display current channel state when button is released
|
||||||
|
// this is needed because the LED blinks when the page is changed
|
||||||
|
if (page_set) {
|
||||||
|
if(channel[page*num_buttons + i]) {
|
||||||
|
digitalWrite(leds[i], HIGH);
|
||||||
|
} else {
|
||||||
|
digitalWrite(leds[i], LOW);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// reset status stuff
|
||||||
|
button_start[i] = 0;
|
||||||
|
page_set = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// function to
|
||||||
|
void set_page(int new_page) {
|
||||||
|
page = new_page;
|
||||||
|
|
||||||
|
// update LEDs
|
||||||
|
for (int i = 0; i < num_buttons; i++) {
|
||||||
|
if (channel[page * num_buttons + i]) {
|
||||||
|
digitalWrite(leds[i], HIGH);
|
||||||
|
} else {
|
||||||
|
digitalWrite(leds[i], LOW);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void toggle_channel(int i) {
|
||||||
|
int ch = page * num_buttons + i; // calculates channel number
|
||||||
|
digitalWrite(leds[i], channel[ch] ? LOW : HIGH); // update LED
|
||||||
|
|
||||||
|
// Send Midi
|
||||||
|
if(channel[ch]) {
|
||||||
|
channel[ch] = false;
|
||||||
|
Serial.write(byte(176));
|
||||||
|
Serial.write(byte(20+ch));
|
||||||
|
Serial.write(byte(0));
|
||||||
|
} else {
|
||||||
|
channel[ch] = true;
|
||||||
|
Serial.write(byte(176));
|
||||||
|
Serial.write(byte(20+ch));
|
||||||
|
Serial.write(byte(127));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue