57 lines
2.0 KiB
C++
57 lines
2.0 KiB
C++
#ifndef LUCKY_STRATEGY_H
|
|
#define LUCKY_STRATEGY_H
|
|
|
|
#include "MelodyStrategy.h"
|
|
#include <Arduino.h>
|
|
|
|
class LuckyStrategy : public MelodyStrategy {
|
|
public:
|
|
void generate(Step (*sequence)[NUM_STEPS], int track, int numSteps, int* scaleNotes, int numScaleNotes, int seed) override {
|
|
randomSeed(seed);
|
|
if (numScaleNotes == 0) return;
|
|
|
|
for (int i = 0; i < numSteps; i++) {
|
|
int octave = random(3) + 3; // 3, 4, 5 (Base is 4)
|
|
sequence[track][i].note = (random(100) < 50) ? (12 * octave + scaleNotes[random(numScaleNotes)]) : -1;
|
|
sequence[track][i].accent = (random(100) < 30);
|
|
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) 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 |