[Résolu] Bug clavier musical à led

Bonjour à tous,

Je suis nouveau dans le monde d’Arduino depuis Noël :slight_smile: Le père Noël a été généreux et m’a apporté un Starter Kit avec lequel je me régale :smiley:

J’en suis au projet n°7, pour ceux qui connaissent, qui s’appelle “clavier musical” et qui comme son nom l’indique permet donc de jouer de la musique des notes. Jusque là tout va bien, le tuto est parfait et tout fonctionne. Je me suis dit qu’il pourrait être intéressant de l’améliorer en ajoutant un système avec des led qui s’allument et s’éteignent en fonction d’une partition préchargée et des notes jouées.

J’ai donc bidouillé le code ci-dessous. Tout fonctionne sauf quand 2 notes identiques se suivent dans la partition : ça fait comme s’il y en avait qu’une seule… J’appuie une première fois sur le bouton qui correspond à la première note doublée et ça allume tout de suite la led de la note n+2…

Si vous avez des idées, n’hésitez pas !

Merci !

int Do = 262; //fréquence de la note Do
int Re = 294; //fréquence de la note Re
int Mi = 330; //fréquence de la note Mi
int Fa = 349; //fréquence de la note Fa

int partition[] = {Do,Re,Mi,Do,Re,Re,Mi,Fa,Fa,Mi,Mi}; //partition de musique

int ledDo = 0; //pin 5
int ledRe = 0; //pin 4
int ledMi = 0; //pin 3
int ledFa = 0; //pin 2

int nNote = 0; //numéro de la note de la partition

void setup() {
 
   //start serial communication
 Serial.begin(9600);
 
 pinMode(2,OUTPUT); //ledFa
 pinMode(3,OUTPUT); //ledMi
 pinMode(4,OUTPUT); //ledRe
 pinMode(5,OUTPUT); //ledDo
 
}

void loop() {

int keyVal = analogRead(A0);

Serial.print(keyVal);
Serial.print(" ; ");
Serial.print(nNote);
Serial.print(" ; ");

 // play the note corresponding to each value on A0
 if(keyVal == 1023){
   // play the first frequency in the array on pin 8
   tone(8, Do);
 }
 else if(keyVal >= 990 && keyVal <= 1010){
   // play the second frequency in the array on pin 8
   tone(8, Re);
 }
 else if(keyVal >= 505 && keyVal <= 515){
   // play the third frequency in the array on pin 8
   tone(8, Mi);
 }
 else if(keyVal >= 4 && keyVal <= 20){
   // play the fourth frequency in the array on pin 8
   tone(8, Fa);
 }
 else{
   // if the value is out of range, play no tone
   noTone(8);
 }

//allume et éteint les led
if (ledDo == 0) {digitalWrite(5, LOW);}
else {digitalWrite(5, HIGH);}
if (ledRe == 0) {digitalWrite(4, LOW);}
else {digitalWrite(4, HIGH);}
if (ledMi == 0) {digitalWrite(3, LOW);}
else {digitalWrite(3, HIGH);}
if (ledFa == 0) {digitalWrite(2, LOW);}
else {digitalWrite(2, HIGH);}

//lit la partition et allume la led correspondante
if(partition[nNote]== Do) {ledDo = 1;}
if(partition[nNote]== Re) {ledRe = 1;}
if(partition[nNote]== Mi) {ledMi = 1;}
if(partition[nNote]== Fa) {ledFa = 1;}

//éteint la led quand la note correspondante a été jouée
if(keyVal == 1023 && ledDo == 1) {ledDo = 0; nNote = nNote+1;}
if(keyVal >= 990 && keyVal <= 1010 && ledRe == 1) {ledRe = 0; nNote = nNote+1;}
if(keyVal >= 505 && keyVal <= 515 && ledMi == 1) {ledMi = 0; nNote = nNote+1;}
if(keyVal >= 4 && keyVal <= 20 && ledFa == 1) {ledFa = 0; nNote = nNote+1;}

}

Edit : code dans le balise code :slight_smile:
Edit : résolu :slight_smile:

bonjour,

J'appuie une première fois sur le bouton qui correspond à la première note doublée et ça allume tout de suite la led de la note n+2...[/quote]

Bonjour,
sans doute l'oubli du else avant if !

Bonjour,

Merci pour le conseil. J’ai donc ajouté des else devant les if ici :

//lit la partition et allume la led correspondante
if(partition[nNote]== Do) {ledDo = 1;}
else if(partition[nNote]== Re) {ledRe = 1;}
else if(partition[nNote]== Mi) {ledMi = 1;}
else if(partition[nNote]== Fa) {ledFa = 1;}

//éteint la led quand la note correspondante a été jouée
if(keyVal == 1023 && ledDo == 1) {ledDo = 0; nNote = nNote+1;}
else if(keyVal >= 990 && keyVal <= 1010 && ledRe == 1) {ledRe = 0; nNote = nNote+1;}
else if(keyVal >= 505 && keyVal <= 515 && ledMi == 1) {ledMi = 0; nNote = nNote+1;}
else if(keyVal >= 4 && keyVal <= 20 && ledFa == 1) {ledFa = 0; nNote = nNote+1;}

Cependant ça ne change rien… Ce n’était peut-être là qu’il fallait les mettre ?

En fait j’ai l’impression que ça saute la note doublée parce que le script va trop vite et que du coup le tension n’a pas le temps de redescendre… Est-ce qu’il y a un moyen de le ralentir ? J’ai essayé avec delay mais ça n’a pas marché ou je n’ai pas fait comme il faut.

Merci pour votre aide !

C’est bon j’ai trouvé :smiley:

J’ai réussi avec delay :

//éteint la led quand la note correspondante a été jouée
if(keyVal == 1023 && ledDo == 1) {ledDo = 0; nNote = nNote+1; delay(200);}
else if(keyVal >= 990 && keyVal <= 1010 && ledRe == 1) {ledRe = 0; nNote = nNote+1; delay(200);}
else if(keyVal >= 505 && keyVal <= 515 && ledMi == 1) {ledMi = 0; nNote = nNote+1; delay(200);}
else if(keyVal >= 4 && keyVal <= 20 && ledFa == 1) {ledFa = 0; nNote = nNote+1; delay(200);}