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
//Constants
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"};
//Function heads
void assign_scale(int root_par); //assigns play_scale with chosen root note and scale
void menu(int down_pin, int up_pin, int bound, int & menu_par); //Toggles menu_par from 0 to bound
//Global variables
double play_scale[8]; //the array used to make sounds
int state_up, state_down, last_state_up,last_state_down; //variables used in menu function
void setup()
{
int root_note{}; //integer 0-10 that assigns root_note
int scale_no{}; //integer 0-3 that assigns scale
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) //upper bound
menu_par = 0;
if(menu_par == -1) //lower bound
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]]; // fills major scale for chosen root note
}
}