Firmware for HexBoard MIDI controller
Diffstat (limited to 'Buttons.ino')
| -rw-r--r-- | Buttons.ino | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/Buttons.ino b/Buttons.ino new file mode 100644 index 0000000..ecc209f --- /dev/null +++ b/Buttons.ino @@ -0,0 +1,77 @@ +void readDigitalButtons() { + if (diagnostics == 1) { + Serial.println(); + } + // Button Deck + for (int rowIndex = 0; rowIndex < rowCount; rowIndex++) // Iterate through each of the row pins on the multiplexing chip. + { + digitalWrite(m1p, rowIndex & 1); + digitalWrite(m2p, (rowIndex & 2) >> 1); + digitalWrite(m4p, (rowIndex & 4) >> 2); + digitalWrite(m8p, (rowIndex & 8) >> 3); + for (byte columnIndex = 0; columnIndex < columnCount; columnIndex++) // Now iterate through each of the column pins that are connected to the current row pin. + { + byte columnPin = columns[columnIndex]; // Hold the currently selected column pin in a variable. + pinMode(columnPin, INPUT_PULLUP); // Set that row pin to INPUT_PULLUP mode (+3.3V / HIGH). + byte buttonNumber = columnIndex + (rowIndex * columnCount); // Assign this location in the matrix a unique number. + delayMicroseconds(10); // Delay to give the pin modes time to change state (false readings are caused otherwise). + previousActiveButtons[buttonNumber] = activeButtons[buttonNumber]; // Track the "previous" variable for comparison. + byte buttonState = digitalRead(columnPin); // (don't)Invert reading due to INPUT_PULLUP, and store the currently selected pin state. + if (buttonState == LOW) { + if (diagnostics == 1) { + Serial.print("1"); + } else if (diagnostics == 2) { + Serial.println(buttonNumber); + } + if (!previousActiveButtons[buttonNumber]) { + // newpress time + activeButtonsTime[buttonNumber] = millis(); + } + // TODO: Implement debounce? + activeButtons[buttonNumber] = 1; + } else { + // Otherwise, the button is inactive, write a 0. + if (diagnostics == 1) { + Serial.print("0"); + } + activeButtons[buttonNumber] = 0; + } + // Set the selected column pin back to INPUT mode (0V / LOW). + pinMode(columnPin, INPUT); + } + } +} + +void playNotes() { + for (int i = 0; i < elementCount; i++) // For all buttons in the deck + { + if (activeButtons[i] != previousActiveButtons[i]) // If a change is detected + { + if (activeButtons[i] == 1) // If the button is active (newpress) + { + if (currentLayout[i] < 128) { + strip.setPixelColor(i, strip.ColorHSV((currentLayout[i] % 12) * 5006, 255, 255)); + noteOn(midiChannel, (currentLayout[i] + octave) % 128, midiVelocity); + } else { + commandPress(currentLayout[i]); + } + } else { + // If the button is inactive (released) + if (currentLayout[i] < 128) { + setLayoutLED(i); + noteOff(midiChannel, (currentLayout[i] + octave) % 128, 0); + } else { + commandRelease(currentLayout[i]); + } + } + } + } +} + +void heldButtons() { + for (int i = 0; i < elementCount; i++) { + if (activeButtons[i]) { + //if ( + } + } +}
\ No newline at end of file |