Au clair de la lune avec Arduino

Factorisation du code logiciel

Pour factoriser le code logiciel précédent, vous allez créer la fonction « JouerNote » qui va prendre pour argument la fréquence de la note et le nombre de temps:

void JouerNote(unsigned int Note_P, unsigned int NombreTemps_P)
{
    tone(8, Note_P, NombreTemps_P * DUREE_TEMPS);
    delay(NombreTemps_P * DUREE_TEMPS);
}

Vous pouvez alors remplacer les instruction logicielle localisée dans la fonction « loop » par les suivantes:

    // Jeu des 11 premières notes de "Au clair de la lune"
    JouerNote(OCTAVE_4_DO, 1);
    JouerNote(OCTAVE_4_DO, 1);
    JouerNote(OCTAVE_4_DO, 1);
    JouerNote(OCTAVE_4_RE, 1);
    JouerNote(OCTAVE_4_MI, 2);
    JouerNote(OCTAVE_4_RE, 2);
    JouerNote(OCTAVE_4_DO, 1);
    JouerNote(OCTAVE_4_MI, 1);
    JouerNote(OCTAVE_4_RE, 1);
    JouerNote(OCTAVE_4_RE, 1);
    JouerNote(OCTAVE_4_DO, 4);

Voici à quoi devrait ressembler votre programme maintenant:

// Définition des fréquences des notes de musiques de la 4ème octave
#define OCTAVE_4_DO 523
#define OCTAVE_4_RE 587
#define OCTAVE_4_MI 659
#define OCTAVE_4_FA 698
#define OCTAVE_4_SOL 784
#define OCTAVE_4_LA 880
#define OCTAVE_4_SI 988

// Définition de la durée d'un temps en millisecondes 
#define DUREE_TEMPS 300

// Fonction de démarrage, s'exécute une seule fois:
void setup()
{
}

// Fonction principale du programme, s'exécute en boucle:
void loop()
{
    // Jeu des 11 premières notes de "Au clair de la lune"
    JouerNote(OCTAVE_4_DO, 1);
    JouerNote(OCTAVE_4_DO, 1);
    JouerNote(OCTAVE_4_DO, 1);
    JouerNote(OCTAVE_4_RE, 1);
    JouerNote(OCTAVE_4_MI, 2);
    JouerNote(OCTAVE_4_RE, 2);
    JouerNote(OCTAVE_4_DO, 1);
    JouerNote(OCTAVE_4_MI, 1);
    JouerNote(OCTAVE_4_RE, 1);
    JouerNote(OCTAVE_4_RE, 1);
    JouerNote(OCTAVE_4_DO, 4);
}

void JouerNote(unsigned int Note_P, unsigned int NombreTemps_P)
{
    // Lance l'émission de la note
    tone(8, Note_P, NombreTemps_P * DUREE_TEMPS);
    // Attend que la note soit terminée de jouée
    delay(NombreTemps_P * DUREE_TEMPS);
}

Afin de le vérifier, vous pouvez maintenant compiler ce programme puis le transférer dans l’Arduino. Vous devez obtenir le résultat suivant:

Et là vous sentez que quelque-chose cloche dans la mélodie !? En effet Arduino enchaine les notes d’ « Au clair de la lune » les unes à la suite des autre sans qu’aucun silence ne permette de les découper. Nous allons donc modifier notre programme pour laisser un petit temps de silence entre chaque note.

Amélioration de la mélodie:

A l’aide de la directive « #define » utilisée précédemment, nous commençons par définir la durée de cette pause (90 ms par exemple) :

// Définition de la pause de fin de note en millisecondes 
#define PAUSE_FIN_NOTE 90

Puis nous modifions la fonction « JouerNote » pour y ajouter ce petit silence:

void JouerNote(unsigned int Note_P, unsigned int NombreTemps_P)
{
    // Lance l'émission de la note
    tone(8, Note_P, NombreTemps_P * DUREE_TEMPS);
    // Attend que la note soit terminée de jouée
    delay(NombreTemps_P * DUREE_TEMPS);
    // Petit silence avant la note suivante
    delay(PAUSE_FIN_NOTE);
}

Et voila le résultat:

Ce contenu a été publié dans Arduino. Vous pouvez le mettre en favoris avec ce permalien.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *