Presets patches

This commit is contained in:
Dejvino 2026-02-21 23:32:27 +01:00
parent 4a3f2b8eb2
commit 217d8dbacf
4 changed files with 109 additions and 3 deletions

View File

@ -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;

View File

@ -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);

View File

@ -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 {

View File

@ -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_TRACKS; i++) mutes[i] = trackMute[i];
EEPROM.put(addr, mutes); addr += sizeof(mutes);
midi.unlock();
EEPROM.commit();
ui.showMessage("PATCH SAVED!");
}
static void loadPatch(int bank, int slot) {
int patchIndex = bank * 4 + slot;
int addr = 512 + patchIndex * 128;
midi.lock();
EEPROM.get(addr, numScaleNotes); addr += sizeof(numScaleNotes);
for (int i = 0; i < 12; i++) {
EEPROM.get(addr, scaleNotes[i]); addr += sizeof(int);
}
EEPROM.get(addr, currentStrategyIndices); addr += sizeof(currentStrategyIndices);
EEPROM.get(addr, melodySeeds); addr += sizeof(melodySeeds);
int t;
EEPROM.get(addr, t); addr += sizeof(int);
numSteps = t;
if (numSteps <= 0 || numSteps >= NUM_STEPS) numSteps = NUM_STEPS;
bool mutes[NUM_TRACKS];
EEPROM.get(addr, mutes); addr += sizeof(mutes);
for(int i=0; i<NUM_TRACKS; i++) trackMute[i] = mutes[i];
if (isPlaying) {
generateSequenceData(currentThemeIndex, nextSequence);
sequenceChangeScheduled = true;
} else {
generateSequenceData(currentThemeIndex, local_sequence);
memcpy(sequence, local_sequence, sizeof(local_sequence));
}
midi.unlock();
ui.showMessage("PATCH LOADED!");
}
void factoryReset() {
ui.showMessage("RESETTING...");
uint32_t magic = 0;
@ -312,6 +365,15 @@ static void handleInput() {
}
break;
}
if (menuItems[menuSelection].id >= 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;