Drone strategy and fixed MIDI panic

This commit is contained in:
Dejvino
2026-02-22 23:03:03 +01:00
parent 33c6329f0b
commit 4e4ba0d0e4
7 changed files with 172 additions and 10 deletions
+15 -8
View File
@@ -60,9 +60,13 @@ static void handlePlayback() {
}
playbackStep++;
bool justPanicked = false;
if (playbackStep >= numSteps) {
playbackStep = 0;
for (int i=0; i<NUM_TRACKS; i++) midi.panic(midiChannels[i]);
justPanicked = true;
// Theme change
if (sequenceChangeScheduled && queuedTheme != -1) {
currentThemeIndex = queuedTheme;
@@ -82,8 +86,6 @@ static void handlePlayback() {
midi.unlock();
}
for (int i=0; i<NUM_TRACKS; i++) midi.panic(midiChannels[i]);
if (sequenceChangeScheduled) {
memcpy(local_sequence, local_nextSequence, sizeof(local_sequence));
midi.lock();
@@ -112,16 +114,21 @@ static void handlePlayback() {
// Note On for new step
for(int t=0; t<NUM_TRACKS; t++) {
int trackChannel = midiChannels[t];
if (!trackMute[t] && local_sequence[t][playbackStep].note != -1) {
uint8_t velocity = local_sequence[t][playbackStep].accent ? 127 : 100;
midi.sendNoteOn(local_sequence[t][playbackStep].note, velocity, trackChannel);
}
int prevStep = (playbackStep == 0) ? numSteps - 1 : playbackStep - 1;
bool wasTied = local_sequence[t][prevStep].tie && (local_sequence[t][playbackStep].note != -1);
int prevNote = local_sequence[t][prevStep].note;
int currentNote = local_sequence[t][playbackStep].note;
// If tied to the SAME note, do not retrigger (sustain)
bool isContinuing = wasTied && (prevNote == currentNote) && !justPanicked;
if (!trackMute[t] && currentNote != -1 && !isContinuing) {
uint8_t velocity = local_sequence[t][playbackStep].accent ? 127 : 100;
midi.sendNoteOn(currentNote, velocity, trackChannel);
}
// Note Off for previous step (if tied - delayed Note Off)
if (wasTied && prevNote != -1) {
if (wasTied && prevNote != -1 && !isContinuing && !justPanicked) {
midi.sendNoteOff(prevNote, trackChannel);
}
}