Presets patches
This commit is contained in:
parent
4a3f2b8eb2
commit
217d8dbacf
@ -59,7 +59,7 @@ void setup() {
|
|||||||
randomSeed(micros());
|
randomSeed(micros());
|
||||||
|
|
||||||
Serial.println(F("Loading sequence."));
|
Serial.println(F("Loading sequence."));
|
||||||
EEPROM.begin(512);
|
EEPROM.begin(4096);
|
||||||
if (!loadSequence()) {
|
if (!loadSequence()) {
|
||||||
Serial.println(F("Starting fresh instead."));
|
Serial.println(F("Starting fresh instead."));
|
||||||
numSteps = NUM_STEPS;
|
numSteps = NUM_STEPS;
|
||||||
|
|||||||
@ -37,7 +37,44 @@ MenuItem menuItems[] = {
|
|||||||
{ "Theme 7", MENU_ID_THEME_7, false, false, 1 },
|
{ "Theme 7", MENU_ID_THEME_7, false, false, 1 },
|
||||||
{ "Setup", MENU_ID_GROUP_SETUP, true, false, 0 },
|
{ "Setup", MENU_ID_GROUP_SETUP, true, false, 0 },
|
||||||
{ "Channel", MENU_ID_CHANNEL, false, false, 1 },
|
{ "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);
|
extern const int menuItemsCount = sizeof(menuItems) / sizeof(MenuItem);
|
||||||
|
|
||||||
|
|||||||
@ -38,7 +38,14 @@ enum MenuItemID {
|
|||||||
|
|
||||||
MENU_ID_GROUP_SETUP,
|
MENU_ID_GROUP_SETUP,
|
||||||
MENU_ID_CHANNEL,
|
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 {
|
struct MenuItem {
|
||||||
|
|||||||
62
UIThread.cpp
62
UIThread.cpp
@ -24,6 +24,8 @@ static void drawUI();
|
|||||||
static void updateLeds();
|
static void updateLeds();
|
||||||
static void generateTrackData(int track, int themeType, Step (*target)[NUM_STEPS]);
|
static void generateTrackData(int track, int themeType, Step (*target)[NUM_STEPS]);
|
||||||
static void generateSequenceData(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) {
|
void saveSequence(bool quiet) {
|
||||||
midi.lock();
|
midi.lock();
|
||||||
@ -86,6 +88,57 @@ bool loadSequence() {
|
|||||||
return true;
|
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() {
|
void factoryReset() {
|
||||||
ui.showMessage("RESETTING...");
|
ui.showMessage("RESETTING...");
|
||||||
uint32_t magic = 0;
|
uint32_t magic = 0;
|
||||||
@ -312,6 +365,15 @@ static void handleInput() {
|
|||||||
}
|
}
|
||||||
break;
|
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;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user