Save MIDI channel to EPROM, add EPROM save indicator
This commit is contained in:
@@ -54,3 +54,13 @@ const unsigned char midich [] PROGMEM = {
|
||||
0xe0, 0x7f, 0x98, 0x66, 0x78, 0xf1, 0xe3, 0xc7, 0xff, 0xe1, 0xe0, 0x3f, 0x98, 0x66, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
|
||||
};
|
||||
|
||||
|
||||
// 'savetorom', 32x12px
|
||||
#define SAVETOROM_WIDTH 32
|
||||
#define SAVETOROM_HEIGHT 12
|
||||
const unsigned char savetorom [] PROGMEM = {
|
||||
0x00, 0x05, 0x55, 0x54, 0x00, 0x0f, 0xff, 0xfe, 0x01, 0x0c, 0x00, 0x02, 0x01, 0x8c, 0x00, 0x02,
|
||||
0x01, 0xcd, 0x89, 0xb2, 0xbf, 0xed, 0x55, 0x54, 0x5f, 0xed, 0x95, 0x14, 0x01, 0xcd, 0x49, 0x12,
|
||||
0x01, 0x8c, 0x00, 0x02, 0x01, 0x0c, 0x00, 0x02, 0x00, 0x0f, 0xff, 0xfe, 0x00, 0x05, 0x55, 0x54
|
||||
};
|
||||
@@ -1,8 +1,10 @@
|
||||
#define FW_VER 1.0
|
||||
#define USE_OLED true // OLED displays
|
||||
#define USE_ENCODER true
|
||||
#define EEPROM_MIDI_CHANNEL_ADDR 0 // Address to save MIDI channel in EEPROM
|
||||
|
||||
// include libraries
|
||||
#include <EEPROM.h>
|
||||
#include <Adafruit_MCP23X17.h>
|
||||
#include <MIDI.h>
|
||||
|
||||
@@ -23,22 +25,24 @@
|
||||
int lastClk = HIGH;
|
||||
#endif
|
||||
|
||||
unsigned long lastChannelChangeTime = 0;
|
||||
bool channelChanged = false;
|
||||
const unsigned long saveDelay = 2000; // 2 seconds
|
||||
|
||||
bool showSavedMessage = false;
|
||||
unsigned long savedMessageStart = 0;
|
||||
const unsigned long savedMessageDuration = 3000; // 1 second
|
||||
|
||||
// Instantiate libraries
|
||||
Adafruit_MCP23X17 mcp1; // First MCP23017
|
||||
Adafruit_MCP23X17 mcp2; // Second MCP23017
|
||||
|
||||
// Default hardware MIDI. SoftwareSerial is too slow...
|
||||
MIDI_CREATE_DEFAULT_INSTANCE();
|
||||
// A7 A6 A5 A4 A3 A2 A1 A0 <-- GPIO A
|
||||
// MCP pins 28 27 26 25 24 23 22 21 20 19 18 17 16 15
|
||||
// 8 = pin 1 ╔══════════════════════════════════════════╗
|
||||
// 9 = pin 2 ╠ MCP23017 ║
|
||||
// 10 = pin 3 ╚══════════════════════════════════════════╝
|
||||
// 01 02 03 04 05 06 07 08 9 10 11 12 13 14
|
||||
// B0 B1 B2 B3 B4 B5 B6 B7 <-- GPIO B
|
||||
|
||||
// Default MIDI channel
|
||||
byte currentMidiChannel = MIDI_CHANNEL_OMNI; //8; // Default MIDI channel
|
||||
byte savedChannel = EEPROM.read(EEPROM_MIDI_CHANNEL_ADDR);
|
||||
|
||||
// Struct for 2 MCP chips.
|
||||
struct MCPOutput {
|
||||
@@ -95,7 +99,7 @@ MCPOutput noteToMCP[32] = {
|
||||
void updateOLED() {
|
||||
#if USE_OLED
|
||||
oled.clearDisplay();
|
||||
oled.drawBitmap(0, 13, midich, MIDICH_WIDTH, MIDICH_HEIGHT, 1);
|
||||
oled.drawBitmap(0, 12, midich, MIDICH_WIDTH, MIDICH_HEIGHT, 1);
|
||||
oled.setCursor(86, 32);
|
||||
oled.setTextColor(SSD1306_WHITE);
|
||||
if (currentMidiChannel == MIDI_CHANNEL_OMNI) {
|
||||
@@ -103,6 +107,11 @@ void updateOLED() {
|
||||
} else {
|
||||
oled.print(currentMidiChannel);
|
||||
}
|
||||
|
||||
if (showSavedMessage) {
|
||||
oled.drawBitmap(88, 0, savetorom, SAVETOROM_WIDTH, SAVETOROM_HEIGHT, 1);
|
||||
}
|
||||
|
||||
oled.display();
|
||||
#endif
|
||||
}
|
||||
@@ -111,23 +120,39 @@ void checkEncoder() {
|
||||
#if USE_ENCODER
|
||||
int newClk = digitalRead(ENCODER_CLK);
|
||||
if (newClk != lastClk && newClk == LOW) {
|
||||
int newChannel = currentMidiChannel;
|
||||
|
||||
if (digitalRead(ENCODER_DT) == LOW) {
|
||||
currentMidiChannel++;
|
||||
newChannel++;
|
||||
} else {
|
||||
currentMidiChannel--;
|
||||
newChannel--;
|
||||
}
|
||||
|
||||
// Wraparound: OMNI = 0, channels 1–16
|
||||
if (currentMidiChannel > 16) currentMidiChannel = 0;
|
||||
if (currentMidiChannel < 0) currentMidiChannel = 16;
|
||||
if (newChannel > 16) newChannel = 0;
|
||||
if (newChannel < 0) newChannel = 16;
|
||||
|
||||
updateOLED();
|
||||
if (newChannel != currentMidiChannel) {
|
||||
currentMidiChannel = newChannel;
|
||||
updateOLED();
|
||||
|
||||
// Mark that channel changed and restart delay timer
|
||||
lastChannelChangeTime = millis();
|
||||
channelChanged = true;
|
||||
}
|
||||
}
|
||||
lastClk = newClk;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
void setup() {
|
||||
// Validate saved midi channel in EEPROM
|
||||
if (savedChannel <= 16) {
|
||||
currentMidiChannel = savedChannel;
|
||||
} else {
|
||||
currentMidiChannel = MIDI_CHANNEL_OMNI;
|
||||
}
|
||||
|
||||
#if USE_OLED
|
||||
if (!oled.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // I2C addr 0x3C
|
||||
// Don't halt if missing, just skip display
|
||||
@@ -175,6 +200,26 @@ void loop() {
|
||||
checkEncoder();
|
||||
#endif
|
||||
|
||||
// Save channel if change timeout has passed
|
||||
if (channelChanged && (millis() - lastChannelChangeTime >= saveDelay)) {
|
||||
EEPROM.update(EEPROM_MIDI_CHANNEL_ADDR, currentMidiChannel);
|
||||
channelChanged = false;
|
||||
|
||||
// Show "Saved" message
|
||||
showSavedMessage = true;
|
||||
savedMessageStart = millis();
|
||||
#if USE_OLED
|
||||
updateOLED();
|
||||
#endif
|
||||
}
|
||||
|
||||
if (showSavedMessage && (millis() - savedMessageStart >= savedMessageDuration)) {
|
||||
showSavedMessage = false;
|
||||
#if USE_OLED
|
||||
updateOLED(); // Return to normal channel display
|
||||
#endif
|
||||
}
|
||||
|
||||
// LED feedback
|
||||
if (ledActive && millis() - ledOnTime >= ledDuration) {
|
||||
digitalWrite(LED_BUILTIN, LOW);
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 1.4 KiB |
@@ -0,0 +1 @@
|
||||
{"hostname":"Aletheia","username":"sgilissen"}
|
||||
Reference in New Issue
Block a user