Song progression

This commit is contained in:
Dejvino
2026-03-07 21:27:08 +01:00
parent bbe6c4ff2f
commit 99add4e2ac
8 changed files with 268 additions and 68 deletions
+49 -13
View File
@@ -21,22 +21,34 @@ bool protectedMode = false;
volatile int trackIntensity[NUM_TRACKS] = {10, 10, 10, 10};
// Menus
#define PROG_STEP_ITEMS(n) \
{ "[" #n "] Mod", (MenuItemID)(MENU_ID_PROG_STEP_START + (n-1)*3), false, false, 3 }, \
{ "[" #n "] Type", (MenuItemID)(MENU_ID_PROG_STEP_START + (n-1)*3 + 1), false, false, 3 }, \
{ "[" #n "] Reps", (MenuItemID)(MENU_ID_PROG_STEP_START + (n-1)*3 + 2), false, false, 3 }
MenuItem menuItems[] = {
{ "Main", MENU_ID_GROUP_MAIN, true, true, 0 },
{ "Playback", MENU_ID_PLAYBACK, false, false, 1 },
{ "Melody", MENU_ID_MELODY, false, false, 1 },
{ "Root", MENU_ID_ROOT, false, false, 1 },
{ "Scale Type", MENU_ID_SCALE_TYPE, true, false, 1 },
{ "Chromatic", MENU_ID_SCALE_TYPE_CHROMATIC, false, false, 2 },
{ "Major", MENU_ID_SCALE_TYPE_MAJOR, false, false, 2 },
{ "Minor", MENU_ID_SCALE_TYPE_MINOR, false, false, 2 },
{ "Harm. Min", MENU_ID_SCALE_TYPE_HARM_MIN, false, false, 2 },
{ "Pent. Maj", MENU_ID_SCALE_TYPE_PENT_MAJ, false, false, 2 },
{ "Pent. Min", MENU_ID_SCALE_TYPE_PENT_MIN, false, false, 2 },
{ "Chord Maj", MENU_ID_SCALE_TYPE_CHORD_MAJ, false, false, 2 },
{ "Chord Min", MENU_ID_SCALE_TYPE_CHORD_MIN, false, false, 2 },
{ "Chord Dim", MENU_ID_SCALE_TYPE_CHORD_DIM, false, false, 2 },
{ "Chord 7", MENU_ID_SCALE_TYPE_CHORD_7, false, false, 2 },
{ "Progression", MENU_ID_GROUP_PROGRESSION, true, false, 1 },
{ "Order", MENU_ID_PROG_ORDER, false, false, 2 },
{ "Apply Template", MENU_ID_PROG_APPLY_TEMPLATE, false, false, 2 },
{ "Sequence", MENU_ID_GROUP_PROG_SEQUENCE, true, false, 2 },
{ "Length", MENU_ID_PROG_LENGTH, false, false, 3 },
PROG_STEP_ITEMS(1),
PROG_STEP_ITEMS(2),
PROG_STEP_ITEMS(3),
PROG_STEP_ITEMS(4),
PROG_STEP_ITEMS(5),
PROG_STEP_ITEMS(6),
PROG_STEP_ITEMS(7),
PROG_STEP_ITEMS(8),
PROG_STEP_ITEMS(9),
PROG_STEP_ITEMS(10),
PROG_STEP_ITEMS(11),
PROG_STEP_ITEMS(12),
{ "Tempo", MENU_ID_TEMPO, false, false, 1 },
{ "Song Mode", MENU_ID_SONG_MODE, false, false, 1 },
{ "Track", MENU_ID_GROUP_TRACK, true, true, 0 },
@@ -106,6 +118,13 @@ bool isItemVisible(int index) {
}
}
// Hide progression steps beyond current length
MenuItemID id = menuItems[index].id;
if (id >= MENU_ID_PROG_STEP_START && id < MENU_ID_PROG_STEP_END) {
int stepIdx = (id - MENU_ID_PROG_STEP_START) / 3;
if (stepIdx >= currentProgression.length) return false;
}
if (menuItems[index].indentLevel == 0) return true;
for (int i = index - 1; i >= 0; i--) {
if (menuItems[i].indentLevel < menuItems[index].indentLevel) {
@@ -126,10 +145,27 @@ int numScaleNotes = 0;
int melodySeeds[NUM_TRACKS];
volatile int queuedTheme = -1;
volatile int currentThemeIndex = 1;
int globalRoot = 0; // The "Key" of the song
int currentRoot = 0; // C
int currentScaleType = 1; // Major
int enabledScaleTypes = 2; // Major (1<<1)
extern const uint32_t EEPROM_MAGIC = 0x42424250;
extern const uint32_t EEPROM_MAGIC = 0x42424253;
const ChordProgression progressions[] = {
{ "Off", 0, { {0,0,1} } }, // Dummy
{ "I-IV-V-I", 4, { {0, 1, 1}, {5, 1, 1}, {7, 1, 1}, {0, 1, 1} } }, // Major
{ "ii-V-I", 3, { {2, 2, 1}, {7, 1, 1}, {0, 1, 1} } }, // min, Maj, Maj
{ "I-vi-IV-V", 4, { {0, 1, 1}, {9, 2, 1}, {5, 1, 1}, {7, 1, 1} } }, // 50s progression
{ "i-bVI-bIII-bVII", 4, { {0, 2, 1}, {8, 1, 1}, {3, 1, 1}, {10, 1, 1} } }, // Axis of Awesome (Am, F, C, G relative to Am)
{ "Blues 12", 12, { {0,9,1}, {0,9,1}, {0,9,1}, {0,9,1}, {5,9,1}, {5,9,1}, {0,9,1}, {0,9,1}, {7,9,1}, {5,9,1}, {0,9,1}, {7,9,1} } } // Dom7 chords
};
ChordProgression currentProgression = progressions[0]; // Start with Off/Empty
ProgressionOrder progressionOrder = PROG_ORDER_SEQUENCE;
int progressionStep = 0;
volatile int queuedProgressionStep = 0;
volatile int visualProgressionStep = 0;
const int numProgressions = 6;
int templateSelectionIndex = 0;
int stepEditIndex = 0;
MelodyStrategy* strategies[] = {
new LuckyStrategy(), new ArpStrategy(), new EuclideanStrategy(),