Avant de commencer, il faut comprendre le principe de fonctionnement d'un haut parleur (HP) et plus globalement, de la création du son depuis le signal électrique jusqu'à notre oreille.
Hp2.jpg Le signal électrique envoyé sur le HP va faire vibrer sa membrane à une certaine fréquence par le biais d'un aimant (ou moteur). Cette membrane va elle même faire vibrer l'air. L'onde va ainsi se propager jusqu'à notre oreille, atteindre le tympan qui retransmet à son tour la vibration le long de la chaîne ossiculaire. On entend alors une note définie par cette fréquence de vibration.
Donc, pour obtenir différentes notes, vous l'avez compris, il faut faire vibrer la membrane du HP à différentes fréquences, et donc envoyer au HP un signal électrique de fréquence variable. Pour cela, nous utilisons un signal PWM (Pulse Width Modulation) ou modulation de largeur d'impulsions, MLI en francais. Le microcontroleur nous permet de régler le rapport cyclique ainsi que la fréquence de ce signal.
Afin de connaitre les fréquences de chaque note, reportez vous au tableau suivant (source: ordiecole.com )

frequence_note.PNG

En fonction de la gamme que vous souhaitez obtenir, il vous faut donc paramétrer les registres de votre microcontroleur en fonction de ces fréquences.
Pour mon cas, j'utilise un pic16f690, je dois donc modifier les registres PR2, T2CON, CCPR1L et CCP1CON. Si vous ne voulez pas perdre un temps fou dans la lecture et le calcul des valeurs des registres, je vous conseil ce générateur de code de registre en fonction de la fréquence que vous voulez générer. Attention, les fréquences générés risquent d'être plus faibles que la fréquence minimal générable avec la PWM. Il vous faudra donc surement ajouter un diviseur de fréquence en jouant avec un compteur et le nombre d'ittéruptions généré par la PWM.
Exemple ici avec une division de la fréquence PWM par 3:

prescal.PNG

A partir de là, il vous suffit de créer une fonction pour chaque note de musique, puis les fonctions de durée de notes (blanche, noire, croches, double croches, etc ...) avec des instructions delay, et enfin les fonctions de pause, soupir, demi soupir, etc ... en stoppant la PWM pendant un certain temps, toujours avec des delay (cf les tableaux ci dessous pour avoir un indicatif de temps en musique, source).
Pour l'astuce, je vous conseil également de faire intervenir une variable prescalaire dans le calcul des delay. Cela vous permettra de changer le tempo de votre mélodie en changeant simplement la valeur de cette variable.

durée des notes:
tps_notes.PNG
durée des silences:
tps_pause.PNG

Maintenant que toutes vos fonctions sont prêtes, vous pouvez composer votre propre mélodie à partir des notes, durée et temps de pause, ou bien récupérer une partition et la recopier dans le programme de votre microcontroleur.
Je vous conseil par exemple le site jeux2notes qui propose des partitions gratuites de grand classique (musiques de films, jeux vidéos, série TV, génériques, etc ...). L'avantage est que sous les portées figure déjà le nom des notes, donc très utile pour ceux qui ont du mal avec le solfège ... :)
parition.PNG

Voilà donc la vidéo récapitulative, avec le résultat: les incontournable musiques de SuperMario et de Tetris.


Télecharger ici le projet complet (pic16f690, MPLAB V8.63, PICC lite)

Pour allez plus loin:
La prochaine étape sera la lecture de fichier .WAV, permettant une meilleur qualité de son. Et même, grâce à un synthétiseur de voix, il est possible d'enregistrer des mots ou des phrases au format WAV. Donc avec un microcontroleur et une carte SD en guise de stockage mémoire, nous avons là de quoi ajouter simplement la parole à vos applications électronique et avec comme seul frontière votre imagination... Cela est surement moins compliqué que ça en à l'air puisque le format WAV ( PCM plus précisément) est un format brut donc qui ne nécessite pas de décodage, mais ça demande tout de même un peu de travail. Affaire à suivre ...