#include "MelodyStrategy.h" #include #ifndef CALL_AND_RESPONSE_STRATEGY_H #define CALL_AND_RESPONSE_STRATEGY_H class CallAndResponseStrategy : public MelodyStrategy { public: void generate(Step (*sequence)[NUM_STEPS], int track, int numSteps, int* scaleNotes, int numScaleNotes, int seed, int intensity) override { randomSeed(seed); if (numScaleNotes == 0) return; int halfSteps = numSteps / 2; if (halfSteps < 1) halfSteps = 1; // Generate Call (First Half) for (int i = 0; i < halfSteps; i++) { // Simple random generation for the call, weighted by intensity if (random(100) < (intensity * 8 + 20)) { int octave = 3 + random(3); sequence[track][i].note = 12 * octave + scaleNotes[random(numScaleNotes)]; sequence[track][i].accent = (random(100) < 30); sequence[track][i].tie = (random(100) < 10); } else { sequence[track][i].note = -1; sequence[track][i].accent = false; sequence[track][i].tie = false; } } // Generate Response (Second Half) for (int i = halfSteps; i < numSteps; i++) { int srcIndex = i - halfSteps; Step srcStep = sequence[track][srcIndex]; // Default: Copy sequence[track][i] = srcStep; // Variation based on intensity if (srcStep.note != -1) { int r = random(100); if (r < intensity * 5) { // Transpose / Shift int shift = random(-2, 3); int octave = srcStep.note / 12; int noteVal = srcStep.note % 12; // Find index in scale int idx = 0; for(int k=0; k