47 lines
1.3 KiB
C++
47 lines
1.3 KiB
C++
#ifndef ARP_STRATEGY_H
|
|
#define ARP_STRATEGY_H
|
|
|
|
#include "MelodyStrategy.h"
|
|
#include <Arduino.h>
|
|
|
|
class ArpStrategy : public MelodyStrategy {
|
|
public:
|
|
void generate(Step* sequence, int numSteps, int* scaleNotes, int numScaleNotes, int seed) override {
|
|
randomSeed(seed);
|
|
if (numScaleNotes == 0) return;
|
|
|
|
int currentNoteIndex = 0;
|
|
int octave = 4;
|
|
|
|
for (int i = 0; i < numSteps; i++) {
|
|
sequence[i].note = 12 * octave + scaleNotes[currentNoteIndex];
|
|
sequence[i].accent = (i % 4 == 0); // Accent on beat
|
|
sequence[i].tie = false;
|
|
|
|
currentNoteIndex++;
|
|
if (currentNoteIndex >= numScaleNotes) {
|
|
currentNoteIndex = 0;
|
|
octave++;
|
|
if (octave > 5) octave = 3;
|
|
}
|
|
}
|
|
randomSeed(micros());
|
|
}
|
|
|
|
void mutate(Step* sequence, int numSteps, int* scaleNotes, int numScaleNotes) override {
|
|
// Swap two notes
|
|
int s1 = random(numSteps);
|
|
int s2 = random(numSteps);
|
|
if (sequence[s1].note != -1 && sequence[s2].note != -1) {
|
|
int8_t temp = sequence[s1].note;
|
|
sequence[s1].note = sequence[s2].note;
|
|
sequence[s2].note = temp;
|
|
}
|
|
}
|
|
|
|
const char* getName() override {
|
|
return "Arp";
|
|
}
|
|
};
|
|
|
|
#endif |