Presets patches
This commit is contained in:
parent
4a3f2b8eb2
commit
217d8dbacf
@ -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;
|
||||
|
||||
@ -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);
|
||||
|
||||
|
||||
@ -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 {
|
||||
|
||||
62
UIThread.cpp
62
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_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;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user