diff --git a/RP2040_Tracker.ino b/RP2040_Tracker.ino index 31a5579..6e957d5 100644 --- a/RP2040_Tracker.ino +++ b/RP2040_Tracker.ino @@ -59,7 +59,7 @@ void setup() { randomSeed(micros()); Serial.println(F("Loading sequence.")); - EEPROM.begin(512); + EEPROM.begin(4096); if (!loadSequence()) { Serial.println(F("Starting fresh instead.")); numSteps = NUM_STEPS; diff --git a/SharedState.cpp b/SharedState.cpp index accf3e2..4a529f4 100644 --- a/SharedState.cpp +++ b/SharedState.cpp @@ -37,7 +37,44 @@ MenuItem menuItems[] = { { "Theme 7", MENU_ID_THEME_7, false, false, 1 }, { "Setup", MENU_ID_GROUP_SETUP, true, false, 0 }, { "Channel", MENU_ID_CHANNEL, false, false, 1 }, - { "Reset", MENU_ID_RESET, false, false, 1 } + { "Reset", MENU_ID_RESET, false, false, 1 }, + { "Patches", MENU_ID_GROUP_PATCHES, true, false, 0 }, + { "Bank 1", MENU_ID_BANK_1, true, false, 1 }, + { "Save 1", (MenuItemID)(MENU_ID_PATCH_ACTIONS_START + 0), false, false, 2 }, + { "Load 1", (MenuItemID)(MENU_ID_PATCH_ACTIONS_START + 1), false, false, 2 }, + { "Save 2", (MenuItemID)(MENU_ID_PATCH_ACTIONS_START + 2), false, false, 2 }, + { "Load 2", (MenuItemID)(MENU_ID_PATCH_ACTIONS_START + 3), false, false, 2 }, + { "Save 3", (MenuItemID)(MENU_ID_PATCH_ACTIONS_START + 4), false, false, 2 }, + { "Load 3", (MenuItemID)(MENU_ID_PATCH_ACTIONS_START + 5), false, false, 2 }, + { "Save 4", (MenuItemID)(MENU_ID_PATCH_ACTIONS_START + 6), false, false, 2 }, + { "Load 4", (MenuItemID)(MENU_ID_PATCH_ACTIONS_START + 7), false, false, 2 }, + { "Bank 2", MENU_ID_BANK_2, true, false, 1 }, + { "Save 1", (MenuItemID)(MENU_ID_PATCH_ACTIONS_START + 8), false, false, 2 }, + { "Load 1", (MenuItemID)(MENU_ID_PATCH_ACTIONS_START + 9), false, false, 2 }, + { "Save 2", (MenuItemID)(MENU_ID_PATCH_ACTIONS_START + 10), false, false, 2 }, + { "Load 2", (MenuItemID)(MENU_ID_PATCH_ACTIONS_START + 11), false, false, 2 }, + { "Save 3", (MenuItemID)(MENU_ID_PATCH_ACTIONS_START + 12), false, false, 2 }, + { "Load 3", (MenuItemID)(MENU_ID_PATCH_ACTIONS_START + 13), false, false, 2 }, + { "Save 4", (MenuItemID)(MENU_ID_PATCH_ACTIONS_START + 14), false, false, 2 }, + { "Load 4", (MenuItemID)(MENU_ID_PATCH_ACTIONS_START + 15), false, false, 2 }, + { "Bank 3", MENU_ID_BANK_3, true, false, 1 }, + { "Save 1", (MenuItemID)(MENU_ID_PATCH_ACTIONS_START + 16), false, false, 2 }, + { "Load 1", (MenuItemID)(MENU_ID_PATCH_ACTIONS_START + 17), false, false, 2 }, + { "Save 2", (MenuItemID)(MENU_ID_PATCH_ACTIONS_START + 18), false, false, 2 }, + { "Load 2", (MenuItemID)(MENU_ID_PATCH_ACTIONS_START + 19), false, false, 2 }, + { "Save 3", (MenuItemID)(MENU_ID_PATCH_ACTIONS_START + 20), false, false, 2 }, + { "Load 3", (MenuItemID)(MENU_ID_PATCH_ACTIONS_START + 21), false, false, 2 }, + { "Save 4", (MenuItemID)(MENU_ID_PATCH_ACTIONS_START + 22), false, false, 2 }, + { "Load 4", (MenuItemID)(MENU_ID_PATCH_ACTIONS_START + 23), false, false, 2 }, + { "Bank 4", MENU_ID_BANK_4, true, false, 1 }, + { "Save 1", (MenuItemID)(MENU_ID_PATCH_ACTIONS_START + 24), false, false, 2 }, + { "Load 1", (MenuItemID)(MENU_ID_PATCH_ACTIONS_START + 25), false, false, 2 }, + { "Save 2", (MenuItemID)(MENU_ID_PATCH_ACTIONS_START + 26), false, false, 2 }, + { "Load 2", (MenuItemID)(MENU_ID_PATCH_ACTIONS_START + 27), false, false, 2 }, + { "Save 3", (MenuItemID)(MENU_ID_PATCH_ACTIONS_START + 28), false, false, 2 }, + { "Load 3", (MenuItemID)(MENU_ID_PATCH_ACTIONS_START + 29), false, false, 2 }, + { "Save 4", (MenuItemID)(MENU_ID_PATCH_ACTIONS_START + 30), false, false, 2 }, + { "Load 4", (MenuItemID)(MENU_ID_PATCH_ACTIONS_START + 31), false, false, 2 } }; extern const int menuItemsCount = sizeof(menuItems) / sizeof(MenuItem); diff --git a/SharedState.h b/SharedState.h index e51db92..e15e8d0 100644 --- a/SharedState.h +++ b/SharedState.h @@ -38,7 +38,14 @@ enum MenuItemID { MENU_ID_GROUP_SETUP, MENU_ID_CHANNEL, - MENU_ID_RESET + MENU_ID_RESET, + + MENU_ID_GROUP_PATCHES, + MENU_ID_BANK_1, + MENU_ID_BANK_2, + MENU_ID_BANK_3, + MENU_ID_BANK_4, + MENU_ID_PATCH_ACTIONS_START }; struct MenuItem { diff --git a/UIThread.cpp b/UIThread.cpp index e0ddb9a..044bd87 100644 --- a/UIThread.cpp +++ b/UIThread.cpp @@ -24,6 +24,8 @@ static void drawUI(); static void updateLeds(); static void generateTrackData(int track, int themeType, Step (*target)[NUM_STEPS]); static void generateSequenceData(int themeType, Step (*target)[NUM_STEPS]); +static void savePatch(int bank, int slot); +static void loadPatch(int bank, int slot); void saveSequence(bool quiet) { midi.lock(); @@ -86,6 +88,57 @@ bool loadSequence() { return true; } +static void savePatch(int bank, int slot) { + int patchIndex = bank * 4 + slot; + int addr = 512 + patchIndex * 128; // Start after main save, 128 bytes per patch + + midi.lock(); + EEPROM.put(addr, numScaleNotes); addr += sizeof(numScaleNotes); + for (int i = 0; i < 12; i++) { + EEPROM.put(addr, scaleNotes[i]); addr += sizeof(int); + } + EEPROM.put(addr, currentStrategyIndices); addr += sizeof(currentStrategyIndices); + EEPROM.put(addr, melodySeeds); addr += sizeof(melodySeeds); + EEPROM.put(addr, (int)numSteps); addr += sizeof(int); + bool mutes[NUM_TRACKS]; + for(int i=0; i= NUM_STEPS) numSteps = NUM_STEPS; + + bool mutes[NUM_TRACKS]; + EEPROM.get(addr, mutes); addr += sizeof(mutes); + for(int i=0; i= MENU_ID_PATCH_ACTIONS_START) { + int offset = menuItems[menuSelection].id - MENU_ID_PATCH_ACTIONS_START; + int bank = offset / 8; + int slot = (offset % 8) / 2; + bool isSave = (offset % 2) == 0; + if (isSave) savePatch(bank, slot); + else loadPatch(bank, slot); + break; + } break; } break;