Fix mutation in song mode
This commit is contained in:
parent
c1b2d6d996
commit
89f9821f5a
@ -38,7 +38,7 @@ struct Step {
|
|||||||
|
|
||||||
Step sequence[NUM_STEPS];
|
Step sequence[NUM_STEPS];
|
||||||
Step nextSequence[NUM_STEPS];
|
Step nextSequence[NUM_STEPS];
|
||||||
volatile bool nextSequenceReady = false;
|
volatile bool sequenceChangeScheduled = false;
|
||||||
volatile bool needsPanic = false;
|
volatile bool needsPanic = false;
|
||||||
|
|
||||||
mutex_t midiMutex;
|
mutex_t midiMutex;
|
||||||
@ -414,7 +414,7 @@ void handleInput() {
|
|||||||
int theme = (queuedTheme != -1) ? queuedTheme : currentThemeIndex;
|
int theme = (queuedTheme != -1) ? queuedTheme : currentThemeIndex;
|
||||||
mutex_enter_blocking(&midiMutex);
|
mutex_enter_blocking(&midiMutex);
|
||||||
generateSequenceData(theme, nextSequence);
|
generateSequenceData(theme, nextSequence);
|
||||||
nextSequenceReady = true;
|
sequenceChangeScheduled = true;
|
||||||
mutex_exit(&midiMutex);
|
mutex_exit(&midiMutex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -424,7 +424,7 @@ void handleInput() {
|
|||||||
int theme = (queuedTheme != -1) ? queuedTheme : currentThemeIndex;
|
int theme = (queuedTheme != -1) ? queuedTheme : currentThemeIndex;
|
||||||
mutex_enter_blocking(&midiMutex);
|
mutex_enter_blocking(&midiMutex);
|
||||||
generateSequenceData(theme, nextSequence);
|
generateSequenceData(theme, nextSequence);
|
||||||
nextSequenceReady = true;
|
sequenceChangeScheduled = true;
|
||||||
mutex_exit(&midiMutex);
|
mutex_exit(&midiMutex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -432,14 +432,7 @@ void handleInput() {
|
|||||||
if (menuSelection == 4) {
|
if (menuSelection == 4) {
|
||||||
songModeEnabled = !songModeEnabled;
|
songModeEnabled = !songModeEnabled;
|
||||||
if (songModeEnabled) {
|
if (songModeEnabled) {
|
||||||
// Start Song Mode immediately
|
|
||||||
if (isPlaying) {
|
|
||||||
songModeNeedsNext = true;
|
songModeNeedsNext = true;
|
||||||
} else {
|
|
||||||
// If stopped, just generate a start
|
|
||||||
songModeNeedsNext = true;
|
|
||||||
// We rely on the loop() to pick it up, or we can force it here if not playing
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (menuSelection >= THEME_1_INDEX) { // Themes
|
if (menuSelection >= THEME_1_INDEX) { // Themes
|
||||||
@ -448,7 +441,7 @@ void handleInput() {
|
|||||||
queuedTheme = selectedTheme;
|
queuedTheme = selectedTheme;
|
||||||
mutex_enter_blocking(&midiMutex);
|
mutex_enter_blocking(&midiMutex);
|
||||||
generateSequenceData(queuedTheme, nextSequence);
|
generateSequenceData(queuedTheme, nextSequence);
|
||||||
nextSequenceReady = true;
|
sequenceChangeScheduled = true;
|
||||||
mutex_exit(&midiMutex);
|
mutex_exit(&midiMutex);
|
||||||
} else {
|
} else {
|
||||||
generateTheme(selectedTheme);
|
generateTheme(selectedTheme);
|
||||||
@ -536,28 +529,42 @@ void handlePlayback() {
|
|||||||
if (playbackStep >= NUM_STEPS) {
|
if (playbackStep >= NUM_STEPS) {
|
||||||
playbackStep = 0;
|
playbackStep = 0;
|
||||||
|
|
||||||
// Mutation
|
// Theme change
|
||||||
if (mutationEnabled && !nextSequenceReady) {
|
if (sequenceChangeScheduled && queuedTheme != -1) {
|
||||||
memcpy(nextSequence, sequence, sizeof(sequence));
|
|
||||||
mutateSequence(nextSequence);
|
|
||||||
nextSequenceReady = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Song Mode Logic
|
|
||||||
if (songModeEnabled && songRepeatsRemaining > 0) {
|
|
||||||
songRepeatsRemaining--;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (nextSequenceReady) {
|
|
||||||
sendMidi(0xB0, 123, 0); // Panic / All Notes Off
|
|
||||||
memcpy(sequence, nextSequence, sizeof(sequence));
|
|
||||||
nextSequenceReady = false;
|
|
||||||
if (queuedTheme != -1) {
|
|
||||||
currentThemeIndex = queuedTheme;
|
currentThemeIndex = queuedTheme;
|
||||||
queuedTheme = -1;
|
queuedTheme = -1;
|
||||||
|
// nextSequence is already generated
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Mutation
|
||||||
|
if (mutationEnabled) {
|
||||||
|
if (!sequenceChangeScheduled) {
|
||||||
|
memcpy(nextSequence, sequence, sizeof(sequence));
|
||||||
|
}
|
||||||
|
mutateSequence(nextSequence);
|
||||||
|
sequenceChangeScheduled = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
sendMidi(0xB0, 123, 0); // Panic / All Notes Off
|
||||||
|
|
||||||
|
if (sequenceChangeScheduled) {
|
||||||
|
memcpy(sequence, nextSequence, sizeof(sequence));
|
||||||
|
sequenceChangeScheduled = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Song Mode? Advance repeats
|
||||||
if (songModeEnabled) {
|
if (songModeEnabled) {
|
||||||
|
// we just used one repeat
|
||||||
|
if (songRepeatsRemaining <= 1) {
|
||||||
|
// let's start another round
|
||||||
songRepeatsRemaining = nextSongRepeats;
|
songRepeatsRemaining = nextSongRepeats;
|
||||||
|
} else {
|
||||||
|
// next repeat
|
||||||
|
songRepeatsRemaining--;
|
||||||
|
}
|
||||||
|
// Trigger next song segment generation if we are on the last repeat
|
||||||
|
if (songRepeatsRemaining <= 1 && !sequenceChangeScheduled && !songModeNeedsNext) {
|
||||||
|
songModeNeedsNext = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -573,11 +580,6 @@ void handlePlayback() {
|
|||||||
sendMidi(0x80, prevNote, 0);
|
sendMidi(0x80, prevNote, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Trigger next song segment generation if we are on the last repeat
|
|
||||||
if (songModeEnabled && songRepeatsRemaining == 1 && !nextSequenceReady && !songModeNeedsNext) {
|
|
||||||
songModeNeedsNext = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
mutex_exit(&midiMutex);
|
mutex_exit(&midiMutex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -876,7 +878,7 @@ void updateLeds() {
|
|||||||
pixels.setPixelColor(getPixelIndex(x, yBase + 3), colorP3);
|
pixels.setPixelColor(getPixelIndex(x, yBase + 3), colorP3);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (nextSequenceReady && (millis() / 125) % 2) {
|
if (sequenceChangeScheduled && (millis() / 125) % 2) {
|
||||||
pixels.setPixelColor(NUM_PIXELS - 1, pixels.Color(127, 50, 0));
|
pixels.setPixelColor(NUM_PIXELS - 1, pixels.Color(127, 50, 0));
|
||||||
}
|
}
|
||||||
mutex_exit(&midiMutex);
|
mutex_exit(&midiMutex);
|
||||||
@ -904,7 +906,7 @@ void loop() {
|
|||||||
generateSequenceData(nextTheme, nextSequence);
|
generateSequenceData(nextTheme, nextSequence);
|
||||||
queuedTheme = nextTheme;
|
queuedTheme = nextTheme;
|
||||||
nextSongRepeats = repeats;
|
nextSongRepeats = repeats;
|
||||||
nextSequenceReady = true;
|
sequenceChangeScheduled = true;
|
||||||
mutex_exit(&midiMutex);
|
mutex_exit(&midiMutex);
|
||||||
|
|
||||||
songModeNeedsNext = false;
|
songModeNeedsNext = false;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user