diff --git a/src/foooot.ino b/src/foooot.ino new file mode 100644 index 0000000..2f7a321 --- /dev/null +++ b/src/foooot.ino @@ -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)); + } +} +