#include "Persistence.h" #include "SharedState.h" #include "MidiDriver.h" #include "UIManager.h" #include "SequenceGenerator.h" #include #include void Persistence::saveSequence(bool quiet) { midi.lock(); int addr = 0; EEPROM.put(addr, EEPROM_MAGIC); addr += sizeof(EEPROM_MAGIC); int channels[NUM_TRACKS]; for(int i=0; i 16) midiChannels[i] = 16; } EEPROM.get(addr, melodySeeds); addr += sizeof(melodySeeds); EEPROM.get(addr, currentStrategyIndices); addr += sizeof(currentStrategyIndices); for(int i=0; i= numStrategies) currentStrategyIndices[i] = 0; } bool mutes[NUM_TRACKS]; EEPROM.get(addr, mutes); addr += sizeof(mutes); for(int i=0; i 240) tempo = 240; int intensities[NUM_TRACKS]; EEPROM.get(addr, intensities); addr += sizeof(intensities); for(int i=0; i 10) trackIntensity[i] = 10; } int chances[NUM_TRACKS]; EEPROM.get(addr, chances); addr += sizeof(chances); for(int i=0; i 100) trackChance[i] = 100; } int steps[NUM_TRACKS]; EEPROM.get(addr, steps); addr += sizeof(steps); for(int i=0; i NUM_STEPS) { numSteps[i] = NUM_STEPS; } } EEPROM.get(addr, globalRoot); addr += sizeof(globalRoot); currentRoot = globalRoot; // Sync EEPROM.get(addr, currentProgression); addr += sizeof(currentProgression); EEPROM.get(addr, progressionOrder); addr += sizeof(progressionOrder); EEPROM.get(addr, currentScaleType); addr += sizeof(currentScaleType); EEPROM.get(addr, numScaleNotes); addr += sizeof(numScaleNotes); if (numScaleNotes < 0 || numScaleNotes > 12) numScaleNotes = 0; for (int i = 0; i<12; i++) { EEPROM.get(addr, scaleNotes[i]); addr += sizeof(int); if (scaleNotes[i] < 0) scaleNotes[i] = 0; if (scaleNotes[i] > 11) scaleNotes[i] = 11; } EEPROM.get(addr, sequence); addr += sizeof(sequence); midi.unlock(); return true; } void Persistence::savePatch(int bank, int slot) { int patchIndex = bank * 4 + slot; int addr = 512 + patchIndex * 256; // Start after main save, 256 bytes per patch midi.lock(); EEPROM.put(addr, currentRoot); addr += sizeof(currentRoot); EEPROM.put(addr, currentScaleType); addr += sizeof(currentScaleType); 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); int steps[NUM_TRACKS]; for(int i=0; i 12) numScaleNotes = 0; for (int i = 0; i < 12; i++) { EEPROM.get(addr, scaleNotes[i]); addr += sizeof(int); if (scaleNotes[i] < 0) scaleNotes[i] = 0; if (scaleNotes[i] > 11) scaleNotes[i] = 11; } EEPROM.get(addr, currentStrategyIndices); addr += sizeof(currentStrategyIndices); for(int i=0; i= numStrategies) currentStrategyIndices[i] = 0; } EEPROM.get(addr, melodySeeds); addr += sizeof(melodySeeds); int steps[NUM_TRACKS]; EEPROM.get(addr, steps); addr += sizeof(steps); for(int i=0; i NUM_STEPS) { numSteps[i] = NUM_STEPS; } } bool mutes[NUM_TRACKS]; EEPROM.get(addr, mutes); addr += sizeof(mutes); for(int i=0; i 10) trackIntensity[i] = 10; } int chances[NUM_TRACKS]; EEPROM.get(addr, chances); addr += sizeof(chances); for(int i=0; i 100) trackChance[i] = 100; } if (isPlaying) { SequenceGenerator::generateSequenceData(currentThemeIndex, nextSequence); sequenceChangeScheduled = true; } else { SequenceGenerator::generateSequenceData(currentThemeIndex, scratchBuffer); memcpy(sequence, scratchBuffer, sizeof(sequence)); } midi.unlock(); ui.showMessage("LOADED!"); } void Persistence::factoryReset() { ui.showMessage("RESETTING..."); for(int i=0; i