|
|
|
@ -31,13 +31,13 @@ |
|
|
|
|
#define MIDI_CH_BIT1 3 |
|
|
|
|
#define MIDI_CH_BIT0 2 |
|
|
|
|
|
|
|
|
|
bool swap_nibbles = false; |
|
|
|
|
bool swap_nibbles = true; |
|
|
|
|
bool high_freq = false; |
|
|
|
|
|
|
|
|
|
#define BRIGHTNESS 6 |
|
|
|
|
#define INITIAL_MIDI_CHANNEL 1 |
|
|
|
|
#define BUTTON_DEBOUNCE_TIME_MS 50 |
|
|
|
|
#define BUTTON_DOUBLE_PRESS_MS 200 |
|
|
|
|
#define BUTTON_DEBOUNCE_TIME_MS 150 |
|
|
|
|
#define BUTTON_DOUBLE_PRESS_MS 250 |
|
|
|
|
#define BLINK_FREQUENCY_MS 500 |
|
|
|
|
#define EEPROM_ADDRESS 0x42 |
|
|
|
|
|
|
|
|
@ -47,6 +47,7 @@ elapsedMillis button_debounce_timer; |
|
|
|
|
elapsedMillis blink_timer; |
|
|
|
|
elapsedMillis double_press_timer; |
|
|
|
|
uint8_t actual_channel; |
|
|
|
|
uint8_t new_channel; |
|
|
|
|
|
|
|
|
|
void setup() { |
|
|
|
|
Serial.begin(9600); |
|
|
|
@ -67,6 +68,7 @@ void setup() { |
|
|
|
|
Serial.print("Reading channel from EEPROM: "); |
|
|
|
|
Serial.println(actual_channel, DEC); |
|
|
|
|
} |
|
|
|
|
new_channel = actual_channel; |
|
|
|
|
|
|
|
|
|
pinMode(MIDI_CH_BIT3, OUTPUT); |
|
|
|
|
pinMode(MIDI_CH_BIT2, OUTPUT); |
|
|
|
@ -84,7 +86,6 @@ void setup() { |
|
|
|
|
|
|
|
|
|
void loop() { |
|
|
|
|
uint8_t button; |
|
|
|
|
static uint8_t new_channel; |
|
|
|
|
|
|
|
|
|
button = tm.ReadKey16(); |
|
|
|
|
|
|
|
|
@ -93,6 +94,7 @@ void loop() { |
|
|
|
|
Serial.print("Button once: "); |
|
|
|
|
Serial.println(button, DEC); |
|
|
|
|
button_debounce_timer = 0; |
|
|
|
|
double_press_timer = 0; |
|
|
|
|
blink_timer = 0; |
|
|
|
|
new_channel = button; |
|
|
|
|
tm.DisplayDecNumNibble(new_channel, actual_channel, 0, false, TMAlignTextRight); |
|
|
|
@ -101,16 +103,17 @@ void loop() { |
|
|
|
|
Serial.print("Button twice: "); |
|
|
|
|
Serial.println(button, DEC); |
|
|
|
|
actual_channel = new_channel; |
|
|
|
|
EEPROM.update(EEPROM_ADDRESS, 0xf0 & actual_channel); |
|
|
|
|
EEPROM.update(EEPROM_ADDRESS, 0xf0 | actual_channel); |
|
|
|
|
SetMidiChannel(actual_channel); |
|
|
|
|
double_press_timer = 0; |
|
|
|
|
} else if (actual_channel != new_channel) |
|
|
|
|
} else if (actual_channel != new_channel) { |
|
|
|
|
if (blink_timer > BLINK_FREQUENCY_MS) { |
|
|
|
|
blink_timer = 0; |
|
|
|
|
tm.DisplayDecNum(actual_channel, 0, false, TMAlignTextRight); |
|
|
|
|
} else if (blink_timer > BLINK_FREQUENCY_MS / 2) { |
|
|
|
|
tm.DisplayDecNumNibble(new_channel, actual_channel, 0, false, TMAlignTextRight); |
|
|
|
|
} |
|
|
|
|
} else |
|
|
|
|
tm.DisplayDecNum(actual_channel, 0, false, TMAlignTextRight); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void SetMidiChannel(uint8_t channel) { |
|
|
|
@ -133,8 +136,7 @@ void SetMidiChannel(uint8_t channel) { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void printBinary(uint32_t value, uint8_t len) { |
|
|
|
|
for (len; len >= 0; len--) { |
|
|
|
|
Serial.print((char)('0' + ((value >> len) & 1))); |
|
|
|
|
for (uint8_t b = len; b > 0; --b) { |
|
|
|
|
Serial.print((char)('0' + ((value >> (b - 1)) & 1))); |
|
|
|
|
} |
|
|
|
|
Serial.println(); |
|
|
|
|
} |