Melody strategy
This commit is contained in:
@@ -0,0 +1,47 @@
|
||||
#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
|
||||
Reference in New Issue
Block a user