Jouer une mélodie avec son Arduino

Accueil/Jouer une mélodie avec son Arduino
Jouer une mélodie avec son Arduino 2016-12-20T11:38:32+00:00

Project Description

Aujourd’hui nous allons réaliser un petit tutoriel assez sympa, en effet, on va pouvoir jouer du son avec notre Arduino. Bon c’est vrai on va pas jouer le dernier morceaux de David Guetta mais seulement une petite mélodie avec des notes, le résultat est je vous l’assure plutôt surprenant.

A la fin de ce tuto, vous trouverez un code pour faire jouer Pirate des Caraibes à votre Arduino!!

Matériel

Pour réaliser ce tutoriel, vous aurez seulement besoin de trois composants :

  • Une Arduino
  • Un petit haut-parleur avec des fils que vous pouvez branchez à l’Arduino (vous pouvez aussi utiliser une petite enceinte et utiliser des pinces croco sur le jack pour le relier à votre Arduino)
  • Une résistance de 100ohms

Les commandes de bases

tone(pin, frequency)
tone(pin, frequency, duration)

noTone(pin)

La fonction qui va nous intéresser dans ce tutoriel est la fonction tone(). Elle est très simple d’utilisation. On peut l’utiliser de deux manières différentes, comme vous l’aurez vu dans le code ci-contre.

Tout d’abord l’argument pin, comme vous l’aurez devinez c’est le pin où est branché le haut-parleur.

Ensuite il faut indiquer l’argument frequency, pour comprendre, il faut savoir que le son est une onde qui se propage. Cette onde est définie par son amplitude (plus elle est grande plus le son est fort) et sa fréquence. La fréquence, exprimée en Herz est le nombre d’oscillation de l’onde par unité de temps, ici en seconde. C’est à dire le nombre de fois que la forme de l’onde va se répéter en une seconde. Plus la fréquence est élevée plus le son est aiguë et vis-versa.

Heuresement, pour nous simplifier la vie, l’équipe Arduino à mis en ligne un fichier contenant le nom des notes et leurs fréquence correspondante :

/*************************************************
* Public Constants
*************************************************/

#define NOTE_B0 31
#define NOTE_C1 33
#define NOTE_CS1 35
#define NOTE_D1 37
#define NOTE_DS1 39
#define NOTE_E1 41
#define NOTE_F1 44
#define NOTE_FS1 46
#define NOTE_G1 49
#define NOTE_GS1 52
#define NOTE_A1 55
#define NOTE_AS1 58
#define NOTE_B1 62
#define NOTE_C2 65
#define NOTE_CS2 69
#define NOTE_D2 73
#define NOTE_DS2 78
#define NOTE_E2 82
#define NOTE_F2 87
#define NOTE_FS2 93
#define NOTE_G2 98
#define NOTE_GS2 104
#define NOTE_A2 110
#define NOTE_AS2 117
#define NOTE_B2 123
#define NOTE_C3 131
#define NOTE_CS3 139
#define NOTE_D3 147
#define NOTE_DS3 156
#define NOTE_E3 165
#define NOTE_F3 175
#define NOTE_FS3 185
#define NOTE_G3 196
#define NOTE_GS3 208
#define NOTE_A3 220
#define NOTE_AS3 233
#define NOTE_B3 247
#define NOTE_C4 262
#define NOTE_CS4 277
#define NOTE_D4 294
#define NOTE_DS4 311
#define NOTE_E4 330
#define NOTE_F4 349
#define NOTE_FS4 370
#define NOTE_G4 392
#define NOTE_GS4 415
#define NOTE_A4 440
#define NOTE_AS4 466
#define NOTE_B4 494
#define NOTE_C5 523
#define NOTE_CS5 554
#define NOTE_D5 587
#define NOTE_DS5 622
#define NOTE_E5 659
#define NOTE_F5 698
#define NOTE_FS5 740
#define NOTE_G5 784
#define NOTE_GS5 831
#define NOTE_A5 880
#define NOTE_AS5 932
#define NOTE_B5 988
#define NOTE_C6 1047
#define NOTE_CS6 1109
#define NOTE_D6 1175
#define NOTE_DS6 1245
#define NOTE_E6 1319
#define NOTE_F6 1397
#define NOTE_FS6 1480
#define NOTE_G6 1568
#define NOTE_GS6 1661
#define NOTE_A6 1760
#define NOTE_AS6 1865
#define NOTE_B6 1976
#define NOTE_C7 2093
#define NOTE_CS7 2217
#define NOTE_D7 2349
#define NOTE_DS7 2489
#define NOTE_E7 2637
#define NOTE_F7 2794
#define NOTE_FS7 2960
#define NOTE_G7 3136
#define NOTE_GS7 3322
#define NOTE_A7 3520
#define NOTE_AS7 3729
#define NOTE_B7 3951
#define NOTE_C8 4186
#define NOTE_CS8 4435
#define NOTE_D8 4699
#define NOTE_DS8 4978

Pour l’utiliser il vous suffit de cliquer sur la petite flèche en haut à droite de l’IDE Arduino et de faire un nouvel onglet appelé « pitches.h » et de coller ce code dedans. Dans votre programme principal il faudra inclure le fichier de la sorte :

#include "pitches.h"

Ensuite, vous pouvez spécifier la durée pendant laquelle la note sera jouée, si vous ne mettez pas de durée, il vous faudra appeler la fonction noTone() pour arrêter le son sur le pin concerné.

Exemple de programmation

Tout d’abord, regardons l’exemple officiel, je pense que vous le comprendrez par vous même mais je l’explique rapidement. Le nom des notes est stocké dans un tableau, la durée des notes correspondantes dans un autre tableau, avec un système de tel sorte que plus le nombre dans le tableau de durée est grand moins le temps joué est grand. Ensuite, dans une boucle, on joue chaque note du tableau, avec la durée correspondante. On laisse un petit intervalle entre chaque note et c’est tout.

/*
Melody

Plays a melody

circuit:
* 8-ohm speaker on digital pin 8

created 21 Jan 2010
modified 30 Aug 2011
by Tom Igoe

This example code is in the public domain.

http://arduino.cc/en/Tutorial/Tone

*/
#include "pitches.h"

// notes in the melody:
int melody[] = {
NOTE_C4, NOTE_G3,NOTE_G3, NOTE_A3, NOTE_G3,0, NOTE_B3, NOTE_C4};

// note durations: 4 = quarter note, 8 = eighth note, etc.:
int noteDurations[] = {
4, 8, 8, 4,4,4,4,4 };

void setup() {
// iterate over the notes of the melody:
for (int thisNote = 0; thisNote < 8; thisNote++) {

// to calculate the note duration, take one second
// divided by the note type.
//e.g. quarter note = 1000 / 4, eighth note = 1000/8, etc.
int noteDuration = 1000/noteDurations[thisNote];
tone(8, melody[thisNote],noteDuration);

// to distinguish the notes, set a minimum time between them.
// the note's duration + 30% seems to work well:
int pauseBetweenNotes = noteDuration * 1.30;
delay(pauseBetweenNotes);
// stop the tone playing:
noTone(8);
}
}

void loop() {
// no need to repeat the melody.
}

Mais nous allons améliorer cette mélodie. Tout d’abord je propose de changer le système de durée des notes pour le remplacer par quelque chose de plus cohérent : le nombre de la durée est représentatif du nombre de demis-temps de la note, ainsi 2 correspond à une noire, 1 à un croche et 4 à une blanche. Ensuite, j’ai changé la mélodie pour quelque chose de plus original, je vous laisse découvrir!

/*
Melody

circuit:
* 8-ohm speaker on digital pin 8

created 19/11/2014
by TutoArduino.com

This code is under attribution licence.


*/
#include "pitches.h"

int melody[] = {
NOTE_A3, NOTE_E3,NOTE_A3, NOTE_E3, NOTE_A3,NOTE_E3,NOTE_A3, NOTE_C4, NOTE_E4,NOTE_D4,NOTE_B3,NOTE_D4,NOTE_B3,NOTE_D4,NOTE_B3, NOTE_G3,NOTE_B3,NOTE_E3};

// note durations: 4 = quarter note, 8 = eighth note, etc.:
int noteDurations[] = {
3, 1, 3, 1,1,1,1,1,6,3, 1, 3, 1,1,1,1,1,6 };

void setup() {

for (int thisNote = 0; thisNote < 18; thisNote++) {

int noteDuration = noteDurations[thisNote]*200;
tone(8, melody[thisNote],noteDuration);


int pauseBetweenNotes = noteDuration * 1.30;
delay(pauseBetweenNotes);
noTone(8);
}
}

void loop() {

}

Et maintenant le plus attendu de tous, on vous montre comment jouer Pirate des Caraibes avec votre Arduino!
/*
Pirate des Caraibes

circuit:
* 8-ohm speaker on digital pin 8

created 19/11/2014
by TutoArduino.com

This code is under attribution licence.

*/
#include « pitches.h »

int melody[] = {
NOTE_A3, NOTE_B3, NOTE_C4, NOTE_D4,NOTE_E4,NOTE_D4,NOTE_C4,NOTE_B3,NOTE_C4,NOTE_D4,NOTE_E4,NOTE_D4,NOTE_C4,NOTE_D4,NOTE_E4,NOTE_D4,NOTE_C4,NOTE_B3,NOTE_C4,NOTE_B3,NOTE_A3,NOTE_B3,NOTE_G3,NOTE_A3,0,NOTE_A3,NOTE_B3,NOTE_C4,NOTE_B3,NOTE_C4,NOTE_D4,NOTE_C4,NOTE_D4, NOTE_E4,NOTE_D4,NOTE_C4,NOTE_A3,NOTE_A3,NOTE_B3,NOTE_C4,NOTE_D4,NOTE_E4,NOTE_F4,NOTE_A3,NOTE_D4,NOTE_C4,NOTE_D4,NOTE_B3,NOTE_A3,NOTE_C4,NOTE_B3,NOTE_A3};
// note durations: 4 = quarter note, 8 = eighth note, etc.:
int noteDurations[] = {
2,2,3,1,2,2,2,2,2,2,2,4,1,1,3,1,2,2,2,2,3,1,2,2,8,1,1,3,1,2,2,2,2,3,1,2,4,1,1,2,2,2,2,2,2,3,1,2,4,1,1,6 };

void setup() {

for (int thisNote = 0; thisNote < 52; thisNote++) {

int noteDuration = noteDurations[thisNote]*95;
tone(8, melody[thisNote],noteDuration);

int pauseBetweenNotes = noteDuration * 1.30;
delay(pauseBetweenNotes);

noTone(8);
}
}

void loop() {

}

Project Details

7 Commentaires

  1. Arduinman 17 mars 2015 à 6 h 34 min␣- Répondre

    Très bonne idée !!! etbon choix de musique 😉

  2. Xavier 9 novembre 2015 à 18 h 27 min␣- Répondre

    J’ai un HP de 0.25W 8 Ohm, et je l’ai branché directement sur la sortie et cela fonctionne. A quoi sert la résistance de 100 ohms ? Y a t-il un risque si on branche en direct ?

  3. bb8 2 janvier 2016 à 9 h 28 min␣- Répondre

    salut super mais comment faire pour récuperer les fréquences d’une musique et leur durée ? bien à vous.

    • arnaud39 8 janvier 2016 à 20 h 14 min␣- Répondre

      Partez du principe qu’une fréquence de 440 Hz, dans le système commun représente un LA, pour les autres notes je vous laisse lire sur ce site qui détail les autres fréquences : http://jeanjacques.dialo.free.fr/frequenc.htm . Vous pourrez donc, à partir d’une partition et quelques connaissances en solfège transcrire le morceau pour votre carte Arduino 😉

  4. Cedric 15 février 2016 à 17 h 26 min␣- Répondre

    Bonjour j’aimerais savoir à quoi sert la fonctions int noteDurations ??

    merci d’avance ! 🙂

    • Thibaut 22 février 2016 à 15 h 58 min␣- Répondre

      Quand il est marqué « int ….[] », c’est pas une fonction, mais un nombre entier, à plusieurs dimensions, c’est un n-uplet.
      Ce nombre sert à définir la durée des notes de musique (note duration). Il est envoyé à chaque itération de la boucle « for », dans la fonction « tone » (il est aussi envoyé dans la fonction « delay » pour faire les blancs).

  5. c 11 mai 2017 à 14 h 40 min␣- Répondre

    Bonjour,
    Savez vous comment réaliser de la polyphonie sur arduino uno?
    Merci d’avance

Laisser un commentaire