#include "MidiDriver.h" #include "TrackerTypes.h" #include "UIThread.h" #include "config.h" #include "SharedState.h" static Step local_sequence[NUM_TRACKS][NUM_STEPS]; static Step local_nextSequence[NUM_TRACKS][NUM_STEPS]; bool wasPlaying = false; static void handlePlayback() { bool nowPlaying = isPlaying; int tracksToPlay = (playMode == MODE_POLY) ? NUM_TRACKS : 1; if (!wasPlaying && nowPlaying) { midi.sendRealtime(0xFA); // MIDI Start } else if (wasPlaying && !nowPlaying) { midi.sendRealtime(0xFC); // MIDI Stop for (int i=0; i= NUM_STEPS) nextStep = 0; // Determine if we are tying to the next note bool isTied = local_sequence[t][playbackStep].tie && (local_sequence[t][nextStep].note != -1); int prevNote = local_sequence[t][playbackStep].note; // Note Off for previous step (if NOT tied) if (!isTied && prevNote != -1) { midi.sendNoteOff(prevNote, trackChannel); } } playbackStep++; if (playbackStep >= NUM_STEPS) { playbackStep = 0; // Theme change if (sequenceChangeScheduled && queuedTheme != -1) { currentThemeIndex = queuedTheme; queuedTheme = -1; // nextSequence is already generated } // Mutation if (mutationEnabled) { if (!sequenceChangeScheduled) { memcpy(local_nextSequence, local_sequence, sizeof(sequence)); } mutateSequence(local_nextSequence); midi.lock(); memcpy(nextSequence, local_nextSequence, sizeof(sequence)); sequenceChangeScheduled = true; midi.unlock(); } for (int i=0; i