#ifndef LUCKY_STRATEGY_H #define LUCKY_STRATEGY_H #include "MelodyStrategy.h" #include class LuckyStrategy : public MelodyStrategy { public: void generate(Step (*sequence)[NUM_STEPS], int track, int numSteps, int* scaleNotes, int numScaleNotes, int* chordNotes, int numChordNotes, int seed, int intensity) override { randomSeed(seed); int noteChance = intensity * 9; // 10% to 90% int accentChance = intensity * 6; // 6% to 60% for (int i = 0; i < numSteps; i++) { int octave = random(3) + 3; // 3, 4, 5 (Base is 4) int note = -1; if (random(100) < noteChance) { if (numChordNotes > 0) { note = 12 * octave + chordNotes[random(numChordNotes)]; } else if (numScaleNotes > 0) { note = 12 * octave + scaleNotes[random(numScaleNotes)]; } } sequence[track][i].note = note; sequence[track][i].accent = (random(100) < accentChance); sequence[track][i].tie = (random(100) < 20); } randomSeed(micros()); } void generateScale(int* scaleNotes, int& numScaleNotes) override { numScaleNotes = random(3, 13); // 3 to 12 notes for (int i = 0; i < 12; i++) { scaleNotes[i] = i; // Fill with all notes } // Shuffle for (int i = 0; i < 12; i++) { int j = random(12); int temp = scaleNotes[i]; scaleNotes[i] = scaleNotes[j]; scaleNotes[j] = temp; } sortArray(scaleNotes, numScaleNotes); } void mutate(Step (*sequence)[NUM_STEPS], int track, int numSteps, int* scaleNotes, int numScaleNotes, int* chordNotes, int numChordNotes, int intensity) override { // Mutate 1 or 2 steps int count = random(1, 3); for (int i = 0; i < count; i++) { int s = random(numSteps); if (sequence[track][s].note != -1) { int r = random(100); if (r < 30) sequence[track][s].accent = !sequence[track][s].accent; else if (r < 60) sequence[track][s].tie = !sequence[track][s].tie; else if (r < 80) sequence[track][s].note += 12; // Up octave else sequence[track][s].note -= 12; // Down octave } } } const char* getName() override { return "Lucky"; } }; #endif