diff --git a/src/main.cpp b/src/main.cpp index 675b1d6..6537301 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -4,15 +4,15 @@ #define MIDI_NAME {'P', 'i', 'n', 'g', 'b', 'o', 'a', 'r', 'd'} #define MIDI_NAME_LEN 9 -#define CHECK_PINS 9 +#define KEY_GROUP_NUM 9 #define KEY_PINS 6 +#define NUMBER_OF_KEYS 49 #define BOUNCE_TIME 5 #define POWER_SUPPLY_CHECK_PIN 13 -#define NUMBER_OF_KEYS 49 #define SELF_DRIVE_INTERVAL 100 -Bounce check_pins[CHECK_PINS] { +Bounce group_pins[KEY_GROUP_NUM] { {14, BOUNCE_TIME}, // not KEYS1..6 {15, BOUNCE_TIME}, // not KEYS7..12 {16, BOUNCE_TIME}, // not KEYS13..18 @@ -25,20 +25,20 @@ Bounce check_pins[CHECK_PINS] { }; // not KEY0%6..not KEY5%6 -const unsigned char key_pins[KEY_PINS] {2, 3, 4, 5, 6, 7}; +const uint8_t key_pins[KEY_PINS] {2, 3, 4, 5, 6, 7}; // Array of pressed keys (initially all 0) bool keys_pressed[NUMBER_OF_KEYS]; // K1, K2, K3, K4, K5, K12, K13, K14, K15 -const unsigned char self_drive_pins[CHECK_PINS] {8, 9, 10, 11, 12, 26, 23, 24, 25}; -volatile unsigned char curr_self_drive_pin = 0; +const uint8_t self_drive_pins[KEY_GROUP_NUM] {8, 9, 10, 11, 12, 26, 23, 24, 25}; +volatile uint8_t current_self_drive_pin = 0; IntervalTimer self_drive_timer = IntervalTimer(); // Map the current array and pressed key to a MIDI note -unsigned char mapToMidi(char curr_arr, char key) { - unsigned char offset = (curr_arr >> 1) * 12; +uint8_t mapToMidi(uint8_t active_key_group, uint8_t key) { + uint8_t offset = (active_key_group >> 1) * 12; // TODO: maybe we have to switch the notes and array offsets // Uneven offset are the upper octave, even the lower - if (curr_arr & 1) { + if (active_key_group & 1) { switch (key) { case 0: return offset + 42; // F#2 + offset case 1: return offset + 43; // G2 + offset @@ -63,18 +63,18 @@ unsigned char mapToMidi(char curr_arr, char key) { } // Check if any of the array pins fell since last time -char findCurrentArrPin() { - for (unsigned char i = 0; i < CHECK_PINS; i++) { +int8_t getActiveKeyGroup() { + for (uint8_t i = 0; i < KEY_GROUP_NUM; i++) { // Update status - check_pins[i].update(); + group_pins[i].update(); // Check if the pin fell or is low // ! inverted - if (check_pins[i].fell()) return i; + if (group_pins[i].fell()) return i; } // If none fell we should have enough time to see which one is low - for (unsigned char i = 0; i < CHECK_PINS; i++) { - if (check_pins[i].read() == LOW) return i; + for (uint8_t i = 0; i < KEY_GROUP_NUM; i++) { + if (group_pins[i].read() == LOW) return i; } // Default return @@ -84,17 +84,17 @@ char findCurrentArrPin() { // Set the next self drive pin FASTRUN void nextSelfDrivePin() { // Set the current pin to high - digitalWriteFast(self_drive_pins[curr_self_drive_pin], HIGH); + digitalWriteFast(self_drive_pins[current_self_drive_pin], HIGH); // Set the next pin - curr_self_drive_pin = (curr_self_drive_pin + 1) % CHECK_PINS; + current_self_drive_pin = (current_self_drive_pin + 1) % KEY_GROUP_NUM; } // Interrupt for power supply check FASTRUN void powerStateChanged() { - unsigned char state = digitalReadFast(POWER_SUPPLY_CHECK_PIN); + uint8_t state = digitalReadFast(POWER_SUPPLY_CHECK_PIN); // ! inverted if (state == LOW) { - curr_self_drive_pin = 0; + current_self_drive_pin = 0; self_drive_timer.begin(nextSelfDrivePin, SELF_DRIVE_INTERVAL); } else { self_drive_timer.end(); @@ -104,11 +104,11 @@ FASTRUN void powerStateChanged() { // Initial start function void setup() { // Set all in- and outputs - for (unsigned char i = 0; i < CHECK_PINS; i++) { - pinMode(check_pins[i].getPin(), INPUT); + for (uint8_t i = 0; i < KEY_GROUP_NUM; i++) { + pinMode(group_pins[i].getPin(), INPUT); pinMode(self_drive_pins[i], INPUT); } - for (unsigned char i = 0; i < KEY_PINS; i++) { + for (uint8_t i = 0; i < KEY_PINS; i++) { pinMode(key_pins[i], INPUT); } pinMode(POWER_SUPPLY_CHECK_PIN, INPUT); @@ -121,32 +121,32 @@ void setup() { // Main loop void loop() { // Find active arr pin - char curr_arr = findCurrentArrPin(); + int8_t active_key_group = getActiveKeyGroup(); // If none is active, we do nothing, else we check the keys - if (curr_arr >= 0) { + if (active_key_group >= 0) { // Get all the key values ans send the MIDI message if needed - unsigned char value; + uint8_t value; - for (unsigned char i = 0; i < KEY_PINS; i++) { + for (uint8_t i = 0; i < KEY_PINS; i++) { value = digitalReadFast(key_pins[i]); // If the key is pressed, we send a MIDI message and set the entry in the array // ! inverted if (value == LOW) { // Check if the key is not already pressed - if (keys_pressed[curr_arr * 6 + i] == 0) { + if (keys_pressed[active_key_group * 6 + i] == 0) { // Send MIDI message - usbMIDI.sendNoteOn(mapToMidi(curr_arr, i), 127, 1); + usbMIDI.sendNoteOn(mapToMidi(active_key_group, i), 127, 1); // Set the entry in the array - keys_pressed[curr_arr * 6 + i] = 1; + keys_pressed[active_key_group * 6 + i] = 1; } } else { // Check if the key is not already released - if (keys_pressed[curr_arr * 6 + i] == 1) { + if (keys_pressed[active_key_group * 6 + i] == 1) { // Send MIDI message - usbMIDI.sendNoteOff(mapToMidi(curr_arr, i), 0, 1); + usbMIDI.sendNoteOff(mapToMidi(active_key_group, i), 0, 1); // Set the entry in the array - keys_pressed[curr_arr * 6 + i] = 0; + keys_pressed[active_key_group * 6 + i] = 0; } } }