Ja just fan! Oktaven är ju alltid dubbelt så stor så den behöver ju inte finnas med i minnet, det var bra att du poängterade
Just nu har jag löst med menyer i setup() där man först väljer skala, sen väljer grundton och min meny-funktion håller reda på gränserna och efter det tilldelas en ny array som indexeras 0-7 så när man väl är inne i loop() har man bara en array med åtta toner att hålla reda på, kanske inte är så minneseffektivt men jag har planer på att trixa till ljudet genom att svänga snabbt mellan oktaver osv och då blir det väldigt pedagogiskt att inte behöva ha sådär knepiga index.
Men allt verkar fungera som det skall så stort tack för hjälpen. Här är koden i sin helhet i nuläget om du är intresserad, men ja jag borde bli bättre på att kommentera.
Kod: Markera allt
const double note[37]
{220.00, 233.08, 246.94, 261.63, 277.18, 293.66, 311.13, 329.63, 349.23, 369.99, 392.00, 415.30, 440.00,
466.16, 493.88, 523.25, 554.37, 587.33, 622.25, 659.25, 698.46, 739.99, 783.99, 830.61, 880.00, 932.33,
987.77, 1046.50, 1108.73, 1174.66, 1244.51, 1318.51, 1396.91, 1479.98, 1567.98, 1661.22, 1760.00};
const int major[8] {0,2,4,5,7,9,11,12};
const int natural_minor[8] {0,2,3,5,7,8,10,12};
const int melodic_minor[8] {0,2,3,5,7,9,11,12};
const int harmonic_minor[8] {0,2,3,5,7,8,11,12};
const int * scales[] {major,natural_minor,melodic_minor,harmonic_minor};
const char * note_str [] {"A", "Bb", "B", "C", "Db", "D", "Eb", "E", "F", "Gb", "G"};
const char * scale_str[] {"M", "m1", "m2", "m3"};
void assign_scale(int root_par);
void menu(int down_pin, int up_pin, int bound, int & menu_par);
double play_scale[8];
int state_up, state_down, last_state_up,last_state_down;
void setup()
{
int root_note{};
int scale_no{};
Serial.begin(9600);
do
{
menu(2,3,4,scale_no);
Serial.println(scale_str[scale_no]);
}
while(analogRead(5) < 100);
delay(1000);
do
{
menu(2,3,11,root_note);
assign_scale(root_note,scale_no);
Serial.println(note_str[root_note]);
tone(3, play_scale[1],250);
delay(250);
} while(analogRead(5) < 100);
}
void loop()
{
if(analogRead(2) > 100 && analogRead(1) < 100)
tone(3,play_scale[0],250);
if(analogRead(3) > 100 && analogRead(1) < 100)
tone(3,play_scale[1],250);
if(analogRead(4) > 100 && analogRead(1) < 100)
tone(3,play_scale[2],250);
if(analogRead(5) > 100 && analogRead(1) < 100)
tone(3,play_scale[3],250);
if(analogRead(2) > 100 && analogRead(1) > 100)
tone(3,play_scale[4],250);
if(analogRead(3) > 100 && analogRead(1) > 100)
tone(3,play_scale[5],250);
if(analogRead(4) > 100 && analogRead(1) > 100)
tone(3,play_scale[6],250);
if(analogRead(5) > 100 && analogRead(1) > 100)
tone(3,play_scale[7],250);
}
void menu(int down_pin, int up_pin, int bound, int & menu_par)
{
state_up = analogRead(up_pin);
if (state_up > 100 && last_state_up < 100)
++menu_par;
last_state_up = state_up;
state_down = analogRead(down_pin);
if (state_down > 100 && last_state_down < 100)
--menu_par;
last_state_down = state_down;
if(menu_par == bound)
menu_par = 0;
if(menu_par == -1)
menu_par = bound -1;
}
void assign_scale(int root_par, int scale_par)
{
for(int i = 0; i<8; ++i)
{
play_scale[i] = note[root_par + scales[scale_par][i]];
}
}