/*
Tirando um som no Arduino Nano, com Dante Meira
*/

unsigned long tempo1 = 0;
unsigned long tempo2 = 0;
unsigned long long microssegundos1 = 0;
unsigned long long microssegundos2 = 0;
unsigned long long microssegundos3 = 0;
unsigned long long microssegundos4 = 0;
						
 // frequências das notas musicais
 // fonte: https://www.if.ufrgs.br/cref/ntef/som/oitavas.html           
const double Do4 = 261.63;
const double Re4 = 293.66;
const double Mi4 = 329.63;
const double Fa4 = 349.23;
const double Sol4 = 391.99;
const double La4 = 440.00;
const double Si4 = 485.80;
	
const double Do5 = 523.25;
const double Re5 = 587.33;
const double Mi5 = 659.26;
const double Fa5 = 698.46;
const double Sol5 = 783.99;
const double La5 = 880.00;
const double Si5 = 971.60;
					
const double Do6 = 1046.5;
const double Re6 = 1174.7;
const double Mi6 = 1318.5;
const double Fa6 = 1396.9;
const double Sol6 = 1568.0;
const double La6 = 1760.0;
const double Si6 = 1943.2;
						
const double Do7 = 2093.0;
const double Re7 = 2349.3;
const double Mi7 = 2637.0;
const double Fa7 = 2793.8;
const double Sol7 = 3136.0;
const double La7 = 3520.0;
const double Si7 = 3886.4;


double hertz = 1;
double aux = 1;
unsigned long intervaloAF2 = 1;
unsigned long intervaloAF3 = 1;

boolean boolAF2 = false;
boolean boolAF3 = false;

#define AF2 2 // AF2 = autofalante conectado ao pino 2
#define AF3 3 // AF3 = autofalante conectado ao pino 3

#define VERMELHO 12
#define VERDE 11
#define AZUL 10
#define AMARELO 9

void setup() {
  pinMode(AF2, OUTPUT);
  pinMode(AF3, OUTPUT);
  pinMode(VERMELHO, OUTPUT);
  pinMode(VERDE, OUTPUT);
  pinMode(AZUL, OUTPUT);
  pinMode(AMARELO, OUTPUT); 
}


void TocaNotas(double notaAF2, double notaAF3){

      if(notaAF2 == Do5){
          digitalWrite(VERMELHO, HIGH);
          digitalWrite(VERDE, LOW);
          digitalWrite(AZUL, LOW);
          digitalWrite(AMARELO, LOW);
      }   
      if(notaAF2 == Re5){
          digitalWrite(VERMELHO, LOW);
          digitalWrite(VERDE, HIGH);
          digitalWrite(AZUL, LOW);
          digitalWrite(AMARELO, LOW);
      }        
      if(notaAF2 == Mi5){
          digitalWrite(VERMELHO, LOW);
          digitalWrite(VERDE, LOW);
          digitalWrite(AZUL, HIGH);
          digitalWrite(AMARELO, LOW);
      }  
       if(notaAF2 == Fa5){
          digitalWrite(VERMELHO, LOW);
          digitalWrite(VERDE, LOW);
          digitalWrite(AZUL, LOW);
          digitalWrite(AMARELO, HIGH);
      }        

      tempo2 = millis();
      microssegundos1 = micros();
      microssegundos2 = micros();
      microssegundos3 = micros();
      microssegundos4 = micros();      

      hertz = notaAF2;
      aux = (1000000/hertz) ;
      intervaloAF2 = round(aux);

      hertz = notaAF3;
      aux = (1000000/hertz) ;
      intervaloAF3 = round(aux);

    while(tempo1 < (tempo2 + 80)){   

      if( microssegundos2 < microssegundos1 + intervaloAF2){
            microssegundos2 = micros();
      }else{
           microssegundos1 = micros();
            if(boolAF2 == false){
                boolAF2 = true;
                digitalWrite(AF2, HIGH);
            }else{
                boolAF2 = false;
                digitalWrite(AF2, LOW);
            }
      }    


      if( microssegundos4 < microssegundos3 + intervaloAF3){
            microssegundos4 = micros();
      }else{
           microssegundos3 = micros();
            if(boolAF3 == false){
                boolAF3 = true;
                digitalWrite(AF3, HIGH);
            }else{
                boolAF3 = false;
                digitalWrite(AF3, LOW);
            }
      }  

      tempo1 = millis();
      asm volatile ("nop   \n\t");     
    }
   
}

void loop() {
delay(150);
TocaNotas(Do5,  Do5), 
delay(70);
TocaNotas(Re5,  Re5);
delay(70);
TocaNotas(Mi5,  Mi5);
delay(70);
TocaNotas(Fa5,  Fa5);
delay(70);
delay(100);
TocaNotas(Fa5,  Fa6);
delay(70);
TocaNotas(Fa5,  Fa6);
delay(150);
TocaNotas(Do5,  Do6);
 delay(70);
TocaNotas(Re5,  Re6);
 delay(70);
TocaNotas(Do5,  Do6);
 delay(70);
TocaNotas(Re5,  Re6);
delay(70);
delay(100);
TocaNotas(Re5,  Re6);
 delay(70);
TocaNotas(Re5,  Re6);
delay(150);
TocaNotas(Do5,  Do6);
 delay(70);
TocaNotas(Sol5,  Sol6);
 delay(70);
TocaNotas(Fa5,  Fa6);
 delay(70);
TocaNotas(Mi5,  Mi6);
delay(70);
delay(100);
TocaNotas(Mi5,  Mi6);
 delay(70);
TocaNotas(Mi5,  Mi6);
delay(150);
TocaNotas(Do5,  Do7);
 delay(70);
TocaNotas(Re5,  Re7);
 delay(70);
TocaNotas(Mi5,  Mi7);
 delay(70);
TocaNotas(Fa5,  Fa7);
delay(100);
}