Ondes sonores – Activité 3

Jouer une mélodie avec un Arduino

 

. Objectif

Dans cette activité, nous allons voir qu’il est possible de jouer une mélodie avec un Arduino.

Avec le même circuit que précédemment, la mélodie sera jouée en continu après un appui sur le bouton poussoir et arrêtée en appuyant de nouveau sur celui-ci.

 

.  Les différentes notes de musique

Chaque note est caractérisée par une fréquence fondamentale déterminée. Lorsque deux notes sont séparées d’une octave, le rapport de leur fréquence est égal à deux.

Dans la pratique, ces deux notes ont le même nom, comme par exemple le « la » de l’octave 3 et le « la » de l’octave 4, nommée couramment « la3 » et « la4 » pour éviter toute ambigüité entre elles.

On appelle gamme l’ensemble des notes (de Do à Si) composant une octave donnée. Dans la gamme tempérée, c’est-à-dire celle utilisée dans la musique occidentale, l’octave est divisée en 12 demi-tons, ce qui correspond à 12 notes, en comptant les notes diésées (#).

Par exemple, pour l’octave 1, voici les valeurs de fréquence des 12 notes :

Le # signifie dièse et le b signifie bémol. Ce sont des altérations des notes de la gamme de base (Do, Ré, Mi, Fa, Sol, La, Si). Le dièse augmente la fréquence de la note et le bémol la diminue. Ainsi un La # est situé en fréquence entre le La et le Si

      

  • En notation latine (la notation historique : do ré mi …),on a l’habitude d’écrire que le diapason (la note qui nous sert de référence à 440 Hz) est le « la3« . Dans ce système, on peut se donner en repère que la première octave entièrement audible commence par le do0.

  • En notation américaine (la notation scientifique : A B C …), le « la » du diapason est le A4. C’est le système qui est utilisé en langage Arduino. Dans ce système, on a choisi de dire que le C (do) le plus grave d’un clavier de piano à 88 touches est le C1. Suivant ce repère, on a alors
    A4 = 440 Hz.

Voici un tableau qui référence la fréquence des notes de musique en hertz de la gamme tempérée (notation américaine en noir et notation latine en rouge):

 

. Jouer une mélodie avec un Arduino

On utilisera la fonction tone() pour jouer les notes de musique (voir tableau des fréquences des notes) de la mélodie pendant la durée définie pour chaque note.

La durée des notes est généralement calculée en attribuant une seconde (1000 ms) à une ronde. Une blanche représente alors 500 ms (ronde/2), une noire, 250 ms (blanche/2, ou ronde /4), une croche,125 ms (noire/2 ou ronde/8), etc…

Pour bien distinguer les notes jouées par l’Arduino, il faut respecter un temps de pause entre chaque note, égal à la durée de la note + 30 % :

Temps de pause (en ms) = Durée de la note (en ms) x 1,3

Pour cela, le plus simple est de créer une liste des fréquences (Freq) des notes à jouer et une liste des durées (Dur) puis de demander à l’Arduino de jouer chaque élément, i, des listes à l’aide d’une boucle for :

for (int i = 0 ; i < 11 ; i++) {

tone (broche du piezo, Freq[i], Dur[i])
delay(Dur[i] x 1.3)

}

. Rappel sur la programmation d’une boucle for

 

. Le programme

Le programme de l’activité pourra être modifié pour voir l’influence des variables (fréquence des notes, durée des notes, durée des silences entre les notes).

 

Déroulement du programme :

– Déclaration des constantes et variables :

. const int PinButton = 12  (constante nombre entier correspondant au n° de la broche sur laquelle le bouton poussoir est connecté)

. const int PinTone = 8  (constante nombre entier correspondant au n° de la broche sur laquelle le buzzer est connecté)

. const int Notes[ ]  (liste de constantes nombres entiers correspondant aux fréquences des notes à jouer)

. const int NoteDurations[ ] (liste de constantes nombre entier correspondant aux durées des notes en fraction de seconde)

. int State = 0  (variable nombre entier correspondant à l’action à effectuer)

. int ValButton = 0  (variable nombre entier pour stocker la valeur de la broche du bouton poussoir)

. int OldValButton = 0  (variable nombre entier pour stocker la valeur précédente de la broche du bouton poussoir)

– Initialisation des entrées et sorties :


– Fonction principale en boucle :