Post on 30-Oct-2021
1
Boîte à musique électronique 9/05/2015 Rev.2
Rev2: ajout 4,7uF sur LM386. Correction erreur R7 = 8.2k et non 6.8k.
Une longue histoire.
J’étais enfant lorsqu’un parent de retour d’Italie m’avait offert une boite à musique, une
gondole avec son gondolier bien sur et une jolie danseuse en robe rose qui tournait en sautillant
au son d’une musique cristalline. On remontait un ressort et l’appareil diffusait une mélodie
extraite d’une chanson d’une dizaine de seconde qui se répétait au début rapidement puis
ralentissait jusqu’à épuisement de l’énergie du ressort. Pas très satisfaisant mais cela me plaisait
beaucoup, mieux que le moulin a manivelle qui faisait DiGueDon, DiGueDon... Hélas plaisir
éphémère, le ressort remonté trop souvent ou trop fort a fini par casser.
Adolescent j’ai retrouvé la gondole et décidé de la démonter ; j’ai sorti le ressort et réussi en le
faisant rougir sur le gaz pour le détremper, a le repercer et le raccrocher sur son picot. Toute la
mécanique remise en place j’ai remonté le ressort et libéré le frein éolien, Catastrophe, le ressort
s’est détendu en moins d’un quart de seconde le tambour à picots a tourné à toute vitesse et cassé les trois quarts des lames vibrantes. Définitivement irréparable !
Plusieurs décennies plus tard, eh oui ! le temps passe mais pas les souvenirs d’enfance. Un
soir, la télévision nous a fait un beau cadeau, un opéra «La flûte enchantée » de Mozart, chef-
d’œuvre incontournable dans lequel on entend une boite à musique, (des clochettes) l’un des deux
instruments enchantés avec la flûte qui donnent à leurs possesseurs des pouvoirs leur permettant
de vaincre les méchants qui veulent contrecarrer leurs projets. Voila donc un souvenir réactivé.
On trouve encore de nos jours des mécaniques de boite à musique mais sans ressort, il faut
tourner une manivelle, donc impropres à réparer ma gondole musicale.
Bon ! Abrégeons la nostalgie !
Entre temps ma vie professionnelle s’est déroulée dans l’électronique et l’informatique.
Partant du principe qu’en électronique et avec l’aide d’un microcontrôleur et d'un peu de jugeote
on peut tout faire à condition de rester modeste, j’ai décidé de me lancer dans la fabrication d’une
boite à musique électronique (pas de risque de casser le ressort) avec un cahier des charges un
peu plus étoffé que celui de ces petites mécaniques suisses :
La musique ne doit pas être répétitive en tout cas pas plus qu’une symphonie de Beethoven (ce
n’est pas une critique), elle ne doit pas ralentir et finir en mourant de fatigue.
L’étendue de la plage musicale sera non pas 19 notes mais 44.
Du Do1 à une fréquence de 261,63 périodes par
seconde au La4 à 3520pps.
Voici le nom des notes :
do, do#, re, re#, mi, fa, fa#, sol, sol#, la, sib, si.
Ces notes doivent être suivies d'un indice (1 à 4)
précisant à quelle gamme elles appartiennent.
Par exemple : do1 (la note la plus grave), do#2, la4 (la note la plus aiguë)
Toutes les notes ont leur note diésée sauf le mi et le si, bien sur, et puisqu'il faut toujours une
exception à la règle il n'y a pas de la# mais un sib. Ne pas écrire un reb (ré bémol) qui n'existe pas;
écrire do# qui à la même fréquence dans la gamme tempérée (on dit que do# et réb sont
enharmoniques). Les airs présentés doivent être complets. Ma boite à musique sera capable de
nuances (piano, mezzo-forte, forte) le tempo pourra être modifié (accelerando deccelerando) ;
elle diffusera plusieurs airs le tout devant durer plusieurs minutes. Surtout l’utilisateur pourra y
introduire les airs de son choix. A condition cependant d’avoir quelques notions de solfège et
d’avoir la possibilité de modifier ré assembler (MPASMWIN) et ré enregistrer le programme du
microcontrôleur PIC. Je sais que les électroniciens connaissant la musique ne sont pas un genre
très répandu mais je suis sûr qu'il-y-en a. Le programme n’a pas à être modifié il suffit d’écrire
les notes à l’endroit prévu à la suite des airs préenregistrés qu’on peut d'ailleurs effacer et remplacer par d’autres. Les morceaux préenregistrés ont été transposés et simplifiés pour
2
satisfaire au fonctionnement de cette Boite à musique. Une restriction : ma Boite à musique ne
comportera pas de danseuse. Bien que ce soit tout à fait possible : Imaginons un électro-aimant
genre relais de moyenne puissance dont la palette donnerait l’impulsion verticale pour faire
sautiller la danseuse, la rotation se fait naturellement. Ce relais serait commandé dans la
séquence « Bip1t » par le port A3 systématiquement comme sont commandées les charges des
condensateurs. Cela exigerait une alimentation plus conséquente incompatible avec l’usage d’une
pile 9 volts.
Techniquement la partie élecronique doit être simple : Le moins possible de composants,
faciles à se procurer, peu onéreux et facile à fabriquer par un amateur avec un outillage restreint.
Tous les composants sont traversant; pas de cms; circuit imprimé monoface.
Les premiers essais (en 2010) réalisés avec un PIC 16F84 ont vite été abandonnés (pas assez
rapide, pas assez de mémoire set d’instructions trop restreint) autre échec avec un PIC 16F876.
Finalement j’ai opté pour un PIC 18F2520 Microchip voici pourquoi : Les 16F ont un mot
instruction de 14 bits qui permet un set de 36 instructions. L’architecture RISC (Reduced
Instruction Set Computer) c’est bien, facile à retenir, mais c’est quand même mieux avec un set
un peu moins reduced. Les 18F ont un mot instruction de 16 bits qui permet quelque 80
instructions. Ne me demandez pas pourquoi les 14 bits sont appelés 16F, le F signifie « mémoire
flash donc effaçable et réinscriptible au moins 100000 fois», et les 16 bits sont appelés 18F...
Donc des nouvelles instructions très utiles qui simplifient la programmation : Ex. BTG ‘bit
toggle’ qui inverse un bit d’un port ou d’un octet en mémoire par une seule instruction ; je l’utilise beaucoup. De nouveaux branchements conditionnels (positif, négatif, zéro...) qui évitent
d’aller tester le mot Status ; La ‘Movff’ qui transfert un octet dans un autre sans passer par le
working register Wreg ; on peut manipuler le stack (Pop, Push) je l’utilise pour abréger un air.
Lors d’une interruption les registres : Status, Wreg, Bsr sont sauvés sans perte de temps
systématiquement et la " fast retfie 1" (Return from interrupt enable,1) restore le tout sans
augmenter le nombre de cycles (2). En outre le 18F2520 a une mémoire flash de 32 Kilo-octets,
(Les chants sont enregistrés dans la mémoire du programme). Autre atout, ce chip peut être piloté
par un oscillateur interne jusqu’à 8Mhz et un PLL multiplie cette fréquence par 4. Je le fais donc
pédaler à 32Mhz en interne économisant ainsi un quartz, 2 condensateurs céramique, une
résistance et de la place sur le PCB. Ce chip coûte moins de 7 euros. On peut télécharger
gratuitement chez Microchip la notice DS39631E un Pdf de 410 pages en anglais. Tout ceci
satisfait pleinement à mon cahier des charges.
Entrons dans le vif du sujet
1er
problème : Imiter autant que possible le son d’une boite à musique mécanique à lames
vibrantes. En avril 2010 Elektor a publié ma réalisation présentant une serrure à code qui
permettait en bonus l’exécution de la « Marche de la Légion étrangère » (Il n’y avait que 4 notes
possibles et seulement une à la fois), le principe et le suivant : Charger un condensateur par un
port A du microcontrôleur. Ce condensateur alimente un collecteur de transistor qui reçoit sur sa
base un créneau calculé par le micro et émis par une autre sortie de port.
Il en résulte sur le collecteur une onde amortie (forte attaque et diminution progressive du son
selon la courbe bien connue de décharge d’un condensateur dans une résistance). Ce 1er essai
assez satisfaisant a été amélioré.
2ème
problème : Ma boite à musique est capable aujourd’hui de diffuser 3 notes simultanées. Ces
3 notes peuvent être 1 noire, 1 croche, 1 double croche, chacune émise par un port et un
transistor différents. On peut donc jouer dans un temps 1 noire + 2 croches + 4 doubles croches.
Le gros problème est le calcul de tout cela, le programme du PIC s’en charge. il n’y a pas de
générateur de notes ce serait trop facile!, trop onéreux et trop encombrant (un quartz un chip
générateur de 12 notes et une multitude de diviseurs par 2 sans compter les composants passifs).
Heureusement le Logiciel permet de réduire considérablement le Matériel !
3
Le temps est la base d'écriture. Un air musical est composé de mesures ; une mesure simple
contient 2, 3, 4, temps, une mesure composée (ternaire) 6, 9, 12 temps. (L’unité de base est la
ronde, la noire est le quart d’une ronde, la croche est le huitième d'une ronde). Dans une mesure
3/4 (3 quarts de ronde) par exemple la mesure contient 3 noires. Dans une mesure 6/8 (à 2 temps)
la mesure contient 2 noires pointées (noire et demi) ou 6 croches (2 triolets). Dans une mesure
simple une noire peut être divisée en 2 croches ou 4 doubles-croches dans toutes les
combinaisons possibles. Ainsi un temps peut contenir au maximum 7 notes : 1 noire, 2 croches et
4 doubles croches. Les silences n’ont pas à être codifiés, il suffit de laisser la place vide. Dans
mon système la musique s’écrit et s’exécute temps par temps. L’étendue des sons est près de 4
octaves du Do1 au La4. La gamme la plus grave (de Do1 à Si1) est celle qui contient le ‘La 440’
(Référence internationale 440 périodes par seconde ). C’est la note que l’on entend lorsqu’on
décroche un téléphone ; c’est également la 1ère note du ‘Pimpon’ des pompiers ou de la police.
Dans un orchestre c’est le hautbois qui donne le La car c’est le seul instrument qui est non
ajustable. Toutes les notes sont calculées à partir de ce La440 pour une gamme tempérée. La
longueur et la fréquence des notes sont calculées à partir de l’oscillateur 32 Mhz c’est à dire 8
millions d’instructions par seconde puisqu’une instruction simple prend 4 périodes (certaines
instructions durent 2 cycles de 4 périodes). La principale difficulté du programme est de tenir
compte de cela pour faire évoluer les compteurs à la bonne vitesse quel que soit le tempo, le
nombre, la hauteur et la longueur des notes émises simultanément. Quelques notes de la gamme 4
très aiguës, sont un peu hors tolérance du à l’arrondi du nombre de boucles à l’unité la plus
proche; seule une oreille très exercée peut déceler ce petit décalage; ces notes sont très peu utilisées. L’oscillateur interne RC 8Mhz est susceptible de glisser légèrement en fonction de la
tension et de la température. La tension 5 volts régulée varie très peu et la température bouge très
lentement. Une boite à musique n’a pas vocation (comme on dit maintenant) à jouer en
compagnie d’autres instruments qui varient également avec la température ! Je n’ai jamais
constaté d’effet gênant. Les puristes pourront toutefois ajouter un quartz de 8Mhz (le PLL n’est
qu’un multiplicateur et ne peut faire glisser la fréquence). On peut alors monter jusqu’à 40Mhz,
avec un quartz de 10 Mhz. Je pense que c’est une dépense et un travail inutiles. Il faudrait alors
modifier la config du chip ainsi que les valeurs des frequences des notes ; modifier la platine...
L’oscillateur RC interne peut être réglé précisément en modifiant des bits dans le registre
OSCTUNE (Par défaut la fréquence est centrée à 32Mhz) je n’en ai pas éprouvé le besoin.
Passons au schéma électronique.
D’une extrême simplicité, la platine contient 1 Pic Microchip 18F2520 DIL 28 pattes, 4
transistors BC548, 1chip 8 pattes LM386 ampli BF, pourquoi s'ennuyer avec des transistors alors
qu’existe un chip coûtant <1 euro ? Un petit HP 70mm 16 ohms, un potentiomètre 10k, 1 bouton
poussoir, 16 résistances, 11 condensateurs, un microswitch.
Le type de transistor (BC548b) a peu d’importance (c’est un ‘TUN’ transistor universel NPN
comme le rappelle Mr.Clemens Valens dans un article ‘ELPP’ Elektor Labs Preffered Parts de
septembre 2014) car il fonctionne toujours soit bloqué soit saturé (tout ou rien). Ce doit être un
NPN. Excepté pour le T4 qui règle l’intensité du son un BC548b ou autre TUN d’un Beta vers
250 (hfe). Si ce n’est pas satisfaisant agir sur sa Res. de collecteur (4.7k) ; l’augmenter réduira les
modifications de la puissance du son (moins de nuance). Le 9v. de la pile (ou 2 piles de 4.5v. en
série) alimente un régulateur 5v pour l'alimentation du Pic. Le 9v. de la pile alimente directement
l’ampli BF. La consommation en 9 v. est au maximum de 35 mA. dans les fortissimi. Le tout
s’installe dans un coffret en bois ; l’ouverture du couvercle met l’appareil sous tension par un
microswitch fixé à une paroi de la boîte. Le micro PIC s'initialise puis, recru de fatigue, il tombe
en SLEEP. La consommation est alors très faible, depuis un an de mise au point j’utilise la même
pile sans constater le moindre affaiblissement. En dehors de la musique, coffret ouvert, le micro
est toujours en sleep ( en sommeil oscillateur stoppé).
4
On voit à gauche du schéma 3 circuits très simples, identiques sauf les valeurs des composants.
Un circuit pour la noire, un pour la croche et un pour la double croche.
Je dois préciser ici que le temps est divisé en 16 parties (4 parties correspondant à une double
croche ; 8 parties pour une croche et 16 parties pour la noire). Un compteur appelé Cint compte
les interruptions produites par le timer zéro débordant.
Cint compte de 0 à 16 et est remis à 0 dès qu’il atteint 16. C’est le tempo de la musique.
Les condensateurs sont chargés entre cint 0 et 1 ou entre 4 et5 etc... Le temps de charge est
identique pour toutes les notes, voir plus loin le CintGraf. C’est pourquoi les condensateurs
et leurs résistances de charge sont différents. La noire est émise de 0 à 16, les croches sont émises
de 0 à 8 et/ou de 8 à 16, les doubles croches sont émises de 0 à 4 et/ou de 4 à 8, 8 à 12, 12 à 16.
Le programme charge seulement les condensateurs des notes présentes dans un temps.
Etudions par exemple le circuit croche.
A cint0 ou cint8 débute la charge du condensateur C2 ; la charge s’arrête à cint1 ou cint9. la
charge est produite par le port A1 patte 3 du Pic. Une diode empêche que le condensateur
se décharge dans le port lorsque la tension de sortie du port A1 redescend à 0v. La chute de
tension dans la diode est environ 0.7v. En même temps que la charge le port B2 patte 23 envoie
le créneau à la base du transistor par la résistance R9 le transistor devient passant pendant les
phases positives du créneau ( 5v.). La résistance qui charge le condensateur et de 1k ; la
résistance de collecteur R6 est 8.2K mais le courant n’y circule que la moitié du temps pendant
les périodes positives des créneaux émis par le port. Ces composants sont calculés pour que le
transistor produise une onde amortie pendant 8 parties sur 16 du temps. La charge du
condensateur est d’environ 95% de 4.3v. soit 4v. Le créneau s’arrete à cint 8 ou 16.
Nota : Le calcul du temps de charge par la formule Thêta = R x C donne 10 millisec. mais à ce
moment la charge n’est que de 66% et compte tenu que le créneau apparaît dès le début de la
charge il faut au moins 6 Thêta’s pour charger à 95%. Le temps de charge est fixé par Cint dont
un pas vaut en moyenne (selon le tempo) 60 millisec. V = 4*(e (̂-T/CR). V en volt T en sec.;C en
microFarad R en MegOhm : Pour la noire on a 0,28v. après 1 seconde et 0,01v après 2 sec.
5
Pour la croche 0,2v. après 0,5 sec. et 0,01v.après 1 sec. Pour la double croche 0,17v. après 0,25
sec. et 0,01 après 0,5 sec.
Les 3 notes ou peut-être 7 sont mélangées par 3 résistances de 100k R11, 12, 13 qui aboutissent
sur le potentiomètre P1 de 10k. de réglage du son, réglé une seule fois en fonction du haut-parleur
utilisé. Avant la 1ère mise sous tension régler ce pot. à environ 1 Kilo Ohm entre le curseur et le
point masse afin de ne pas saturer le HP; Plus tard affiner le réglage en écoutant la musique. En
haut de ce potentiomètre la hauteur de la somme des 3 notes est au maximum de 1v. C’est trop
pour entrer dans le LM386 ; Le Pot.1 abaisse cette tension à une valeur convenant à une bonne
écoute selon la qualité du HP 8 ou 16 ohms. Un condensateur de 10 nanoF. arrondi les angles des
créneaux. Un transistor T4 en série avec une résistance de 4.7k court-circuite partiellement P1 en
fonction de ce qu’il reçoit sur sa base, un ensemble de 2 résistances donnant une échelle de 4
valeurs de courant. Ces résistances sont à 5v. ou 0v. par les ports B4 patte 25 et/ou B5 patte 26 ce
qui permet au programme de nuancer la puissance du son. La tension résultante est étalée dans le
temps par C8 de 10uF 6.3v.
Le petit LM386 dans son extrême dépouillement donne une amplification de 20 DB donc une
puissance en sortie 100 fois la puissance d’entrée ( 2 est le log dec. de 100 et 2 Bell’s = 20
decibells). Un condensateur entre les pattes 1 et 8 peut le monter jusqu’à 26DB (400fois) mais
c’est beaucoup trop pour une boite à musique et un HP d’1/4 de watt.
Révision2: J'ai d'abort utilisé cet ampli sans condensateur; mais la dynamique de cette Boîte à
musique est très grande entre les Pianissimi et les Forte. A l'usage je me suis rendu compte que 3
notes émises simultanément Forte saturaient l'entrée de l'ampli ce qui résultait en des sons désagréables en sortie. Il a donc fallu baisser le niveau d'entrée par le Potentiomètre 10Kohm Et
dans ce cas les notes Pianissimo devenaient presque inaudibles. J'ai donc monté l'ampli à 26 DB
par un condensateur 4.7misroF entre les pattes 1 et 8.
Nota: Il est impératif de conserver le potentiomètre 10 KiloOhm sinon les nuances seraient
perturbées.
Avez-vous remarqué que l’on n’a rencontré aucun condensateur en série entre le micro et l’ampli
BF ? Liaison continue.
Dernière pièce, un bouton poussoir miniature
entouré de 2 Res. R4 - R11 et C4 formant anti
rebond. Un appui bref sur ce bouton produit
une interruption par le port B0 configuré pour
une interruption externe INT0 gérée par le
programme ( introut) qui démarre le 1er chant.
6
Le programme du PIC. Simplified diagram.
Les chants se suivent après un silence de 3 secondes. Un appui sur le bouton pendant l’exécution
d’un morceau avorte celui-ci et lance le suivant. Un appui pendant le dernier chant branche le
programme à « départ » et le micro en sleep attend un nouvel appui pour relancer le chant1.
On peut arreter la diffusion de la musique à tout moment simplement en fermant le coffret.
7
Après utilisation refermer le couvercle ce qui coupe l’alimentation et économise la pile.
Le programme est écrit en langage assembleur indispensable pour savoir exactement combien de
cycles sont déroulés dans une séquence. (Pour générer une note le temps du créneau doit être très
précis). Le rapport du créneau est toujours de 50%. Pour programmer j'utilise MPLAB IDE
version 8.91 téléchargeable gratuitement chez Microchip. Pour écrire le fichier 'BoiteAmus.hex'
dans le micro j'utilise PICPgm programmer et un très ancien programmateur: POK508 qui se
branche sur le port série du PC.
Le programme est d’un seul tenant, il n’y a pas « d’include ». Les bits de configuration sont écrits
sous le cadre ‘En tête’ (directives CONFIG) ils sont dans le fichier HEX (Tout en bas du
fichier .HEX la ligne commençant par 03) il n’y a rien à ajouter; cependant le code en mémoire
flash n’est pas verrouillé. Système ouvert.
Les notes possibles sont listées sous forme de constantes : Nom de la note et sa fréquence
affectée. Exemple : (La4 equ 0xED) ED est un nombre hexadécimal = 237 décimal.
Le complément de ce nombre à 256 est 19. 19 est le nombre de boucles qu’il faudra exécuter
pour un demi créneau ; Le bit est alors inversé et le compteur restauré pour le demi créneau
suivant et ainsi de suite jusqu’a la fin du temps que doit durer la note. La boucle en question sera
vue plus loin. Voir en annexe la feuille EXCEL qui donne la fréquence des notes, le temps d’un
demi créneau en microsecondes et le nombre de boucles (itérations) seulement pour information
detaillée car ces valeurs figurent en tête du programme. Pour jouer une note il faut écrire son nom
et l’indice de sa gamme, sa longueur sera définie par la case de la macro ‘temps’ dans laquelle la
note est écrite. ;<<<< Aperçu pour 1 temps...a glimpse to execute one step >>>>
cint = 0 cint is incremented by interrupt due to timer0 over run
dc1 bra $+2 ;To complete time
bra $+2 ;bra $+2 = 2 cycles .25 microsec.to jump
bra $+2 ;to the next line
bra $+2
bra $+2
btfss bitest,1 ;Is there a double croche 1
bra $+8 ;No note absente
infsnz countdc,f ;Yes increment counter
bra $+d'10' ;count = 0 go to movff then toggle port B3
bra $+6 ;not zero out whit time compensation
nop ;Complete time...nop = 1cycle(0.125 uSec.)
bra $+2
bra c1 ;Continue with croche.
movff frdc1,countdc ;refresh counter DC
btg portb,3 ;toggle B3 doublecroche 1 (invert polarity)
;18cycles = 2.25 microsecondes)
c1 bra $+2
The same for C1 and Noire (some differences for noire
Due to the pedal)
...
cint=1 nop
btfsc cint,0 ;cint bit 0 présent? (cint=1 ?)
clrf porta ;yes clear port A stop load capa's
btfss cint,2 ;cint = 4 ? 1/4 of time
bra dc1 ;no continue iteration until cint = 4
<<This sequence from ‘dc1’to ‘bra dc1’always 60 cycles = 7.5 micro sec.>>
cint=4 ;Yes
btfss bitest,4 ;is there a double croche 2
bra $+4 ;no skip loading capa for DC
bsf porta,2 ;yes start loading capa DC
;only a DC note is possible at this time
dc2 Same sequence for a quarter of time (cint 4 to 8)
dc3 ..." " " "(cint 8 to 12)
dc4 ..." " " "(cint 12 to 16)
cint=0 next step...
8
pour plus de details lire le programme du Pic "boite à musique.asm" dans notepad ou mieux dans
MPLAB IDE de Microchip (en couleurs plus facile à lire).
Une macro appelée justement « temps » constitue une suite de 8 octets dont voici
l’arrangement :
Octet 0 : reçoit le tempo (un nombre de 1 à 255) qui donne la vitesse de déroulement de ce
Temps et des suivants tant qu’il n’est pas modifié. Ecrire par ex. d’150’ (150 décimal) à la place
du n qui signifie Nul (même tempo que precedement ou pas de note à cet endroit.)
Octet 1 : case pour la 1ère double croche (DC1).
Octet 2 : case pour la 1ère croche (C1)
Octet 3 : case pour la noire (N)
Octet 4 : case pour la DC2
Octet 5 : case pour la DC3
Octet 6 : case pour la C2
Octet 7 : case pour la DC4
Les cases sont séparées par une virgule. Une case sans note doit contenir un n minuscule
Exemple : Ecriture d’un temps qui contient 6 notes, il n’y a pas
de noire, et un deuxième temps qui contient seulement une noire.
2 temps à écrire. En clé de sol.
Mf ; (Cette macro met le port B5 à 1 et B4 à 0 ) = Mezzo-forte
repère : ;tempo dc1 c1 noire dc2 dc3 c2 dc4 cette ligne en commentaire
label1 temps d’105’,do1 ,do2 ,n ,mi1 ,sol1 ,sol2 ,re2 ;1er temps
label2 temps n ,n ,n ,do2 ,n ,n ,n ,n ;2ème temps Même tempo ce temps contient juste une noire do2.
label3 temps n ,n ,n ,n ,n ,n ,n ,n ;...suite
Le tempo à 105 donne pour une noire 0,43 seconde soit 138 Noires à la minute.
« « 1 « « 0.004. « 15000 « « Inutilisable!
60 0,25 sec. 240
100 0, 41 sec 150
200 0,82 sec 73
255 1 sec. 60
Sur une partition on donne plutôt le nombre de noires à la minute, ce qui ne peut être apprécié
qu'à l'aide d'un métronome.
Le tempo désiré pour une noire s'obtient en divisant le temps par 0.004096. Par exemple :
Tempo pour une noire de 0.8seconde... 0.8/0.004096 = 195 ( on n'utilise guère que 100 à 255)
Les nuances s’écrivent entre les temps. (4 nuances : Pp, Piano, Mf, Forte) et sont activées sur les
temps suivants. Attention aux majuscules l’assembleur les distingue des minuscules.
Voir tout à la fin du programme comment on écrit un air. Tout d'abord avoir la partition ; sans
doute la transposer plus haut pour qu’elle tienne dans l’étendue des notes possibles ; simplifier
les accords à 3 notes ; supprimer ou les monter d’une octave, les notes très graves qui n’ont rien à
faire dans une boite à musique. La plus grave note possible est le do1 sur la ligne juste au dessous
de la portée en clé de sol; il-y-a donc intérêt a convertir la clé de Fa en clé de Sol. Repérer les
temps et les écrire un par un sous forme de lignes « temps » comme l’exemple ci-dessus. Mettre
un label à chaque ligne (ça ne coûte rien en mémoire) exemple : c4m2.3 : chant 4, mesure 2, 3ème
temps. Pas obligatoire mais pratique pour s’y retrouver, il faut pour cela numéroter aussi les
mesures sur la partition. On peut dans un morceau faire des reprises. Pour cela 2 macros :
« sectim étiquette de la ou des mesures de 2ème fois ». A placer juste devant les mesures de 1ère
fois. Macro « repris étiquette du début de la reprise ». A placer entre les mesures de 1ère et 2ème
fois. Voir exemple dans song7 dans le programme ASM. (Les reprises économisent des octets de
mémoire).
Pour des reprises imbriquées un autre couple de macros sectim2 et repris2 sont disponibles.
9
Voir exemple dans song4 : une reprises et a la fin un Da capo (sectim2 et repris2), au cours de ce
Da capo on ne fait pas la reprise.
Attention : seuls les labels (étiquettes) s’écrivent en colonne1.Les instructions ou macros
s’écrivent après le label et au moins un espace ou une tabulation. Si pas de label faire une Tab.
Ex. : c7m7.2 temps ...
sectim c7m9.1
c7m8.1 temps ... 1ère fois
c7m8.2 temps ... 1ère fois
repris c7m1.1 reprise au début du chant
c7m9.1 temps ... 2ème fois ...suite.
Résultat : Les mesures 1 à 8 seront exécutées, puis les mesures 1 à 7 la mesure 8 est sautée, puis
exécution de la mesure 9 et la suite.
Voir cet exemple dans le programme PIC au début du chant7 et en annexe la 1ère page du chant7.
Pour ces reprises un label est obligatoire bien sur, par exemple : couplet1, refrain, ou :
c7m9.1...(c7 = chant 7 car on ne peut donner 2 labels semblables dans un programme).
Le mot « temps » est obligatoire c’est le nom de la macro, (voir les macro’s juste avant le début
du programme) c’est elle qui recueille les notes et écrit leurs valeurs numériques dans 7 variables
n1 à n7. Egalement la valeur du tempo dans n0.
Nota : Il faut éviter de jouer 2 notes de même fréquence en même temps par ex. 'Noire do2' et
une 'croche do2' ayant toutes deux exactement la même fréquence, en opposition de phase elles
s'étouffent le temps de la plus courte. Sur un piano c’est impossible de jouer 2 fois la même note en même temps.
Il n’y a pas de limite à la taille d’un chant à part la mémoire restante. Un chant doit se terminer
par une instruction "Return" laquelle renvoie le programme vers la séquence Départ.
Pédale de résonance : Une noire peut continuer à résonner dans le temps suivant à condition que
ce temps ne comporte pas de noire. Pour cela écrire juste avant le temps où une noire doit
continuer : pedon. C'est une macro qui s'écrit comme une instruction. Cette pédale est
automatiquement annulée à la fin du temps; elle agit uniquement sur une noire. Utiliser avec
précaution, la noire prolongée ne doit pas se frotter à des notes très proches ce qui produirait de
désagréables dissonances, sauf en fin de temps ‘dc4’ ou le son de la noire est trés atténué.
Revenons au programme. Après le nom des notes et leurs valeurs on trouve les adresses des
registres du micro et des variables utilisées par le programme. Puis les macros et enfin le début
du programme qui commence par l’initialisation habituelle dans tout programme.
A la suite de l’init2 le micro tombe en sommeil (Sleep; très basse consommation) puis on trouve
l’étiquette «Départ». Le micro en sleep attend qu’on appuie sur le bouton ce qui produit
l’interruption externe 0 qui réveille le micro et la routine d’interruption monte le bit 0 de la
variable « newsong », le programme continue après «départ» et en avant la musique !
A l’adresse 8 de la mémoire flash commence la routine de gestion des interruptions. "Introut" qui
gère les 2 sortes d’interruptions possibles dans ce programme : l’appui sur le bouton et le
débordement du timer 0. Le timer 0 de 16 bits donc 2 octets (0 à 65535) est utilisé pour compter
le tempo. Il reçoit la fréquence de 8Mhz qui est d’entrée divisée par 8 par le prescaler. L’octet
haut est pré chargé par le nombre donné dans la case 0 de la macro temps. Lorsque ce timer
déborde (passe par 0) il produit une interruption qui branche le programme à introut qui
incrémente Cint. A la fin de la macro temps il y a un call (appel) de la séquence « loadfr » qui
charge les compteurs avec les nombres représentant les notes : la valeur de la Noire dans frn, la
valeur de la C1 dans frc1 la valeur de la Dc1 dans frdc1. cette séquence également charge le
tempo s’il doit être changé et constitue un octet «bitest» dont chaque bit signale la présence d’une
note : bit 1 = 1 si présence d’une DC1 sinon le bit 1 = 0. Bit 2 pour C1 etc. dans le même ordre
que les octets de la macro temps. La fin de cette séquence appelle «bip1t» qui d’après le mot
"bitest" charge les condensateurs des notes présentes en début de temps (Noire, C1, DC1) en
montant le port A correspondant. (A ce moment Cint est à 0). Les condensateurs commencent à
se charger, la charge s’arrêtera par remise à zéro du port A à Cint1, Cint5, Cint9, Cint13.
10
Entrons enfin dans la grande boucle. « Exec ».
Cette boucle, pour exécuter un temps, comporte 4 parties correspondant à 4 doubles croches;
elles ont pour étiquette : dc1; dc2; dc3; dc4. Chacune de ces boucles dure 4 / 16 de temps. La
boucle dc1 de cint0 à cint4; boucle dc2 de cint4 à cint8 etc...A cint16 se trouve la l’instruction
«return» pour passer au temps suivant. Ces 4 boucles sont identiques excepté le nom des
compteurs. Une boucle de 4 / 16 de temps est, elle même divisée en trois parties qui s'enchaînent,
la 1ère (dc1) pour le comptage de la double croche, la 2ème (c1) pour la croche 1, la 3ème pour la
noire. (Les compteurs noire et croche doivent évoluer dans les 4 boucles)
Voyons la boucle dc1. Des «bra $+2» branchement à la ligne suivante, (1 instruction prend 2
octets) sont là pour compléter le temps de la boucle qui doit toujours durer 7.5 microsec. entre
l’étiquette dc1 et le retour a cette étiquette. Les «bra $+2» sont toujours réalisés et prennent donc
2 cycles on voit aussi des «nop» (no opération) qui ne durent que 1 cycle. Ce temps est calculé
pour obtenir le do1 avec le nombre maximum de boucles de 7.5usec soit 255. Voir la feuille
Excel. La valeur mini des compteurs est 1 car dans la macro « temps », 0 signifie pas de note. A
chaque itération les 3 compteurs pré chargés par les valeurs des notes à jouer : countdc ; countc,
et countn sont incrémentés (+1) si la note est présente jusqu’a ce qu’ils passent à 256 c.à d. 0 ce
qui est détecté par le programme qui alors inverse la tension de sortie du port de cette note
(Toggle) et restore le compteur à la valeur de la note en cours. Cette boucle dc1--- bra dc1 tourne
jusqu’à ce que cint arrive à 4, on passe à la boucle suivante dc2. Pendant le déroulement de la boucle à chaque tour le programme lit le cint pour stopper la charge des condensateurs lorsque le
bit1 est présent (1, 5, 9,13) et pour passer à la boucle suivante quand cint arrive à 4 ou 8 ou 12 ou
16.
Après cette quadruple boucle « Exec » se trouve le sous programme Delai appelé lui-même par la
macro delais (utilisée pour introduire des temps morts). «delais 1» = 50 millisec. Puis juste en
dessous commencent les chants dans l’ordre : chant1, chant2, Etc.
Après le dernier chant joué le programme remet le micro en 'SLEEP' en attente d’un appui sur le
bouton pour une nouvelle audition ou la fermeture de la boite à musique ce qui coupe
l’alimentation.
Les morceaux préenregistrés
Chant1: Adorable musique Mozart (La flûte enchantée) 1196 octets 44 secondes.
Chant2: A la claire fontaine 1028 "" 1 min. 2sec.
Chant3: La chanson du printemps F. Mendelssohn 6024 "" 2 m.15 sec.
Chant4: L'amour de moy... Auteur inconnu 15ème siècle 2330 "" 1 m. 45 sec.
Chant5: Valse N° 15 J. Brahms 4268 "" 1 m. 30 sec.
Chant6: Entertainment Scott Joplin 6780 "" 4 m. 40 sec.
Chant7: Etude en Fa en forme de sonatinette pour 8562 "" 3 m.
boite à musique seule.
De ma composition, on y entend dans le 2ème mouvement 2/4 'larghetto' des noires, des croches,
des doubles croches, mais aussi des blanches ou 2 noires liées, et des triples croches! Des
mesures syncopées! Le 3ème mouvement 'vivace' est une sicilienne, mesure ternaire en 6/8. Pour
montrer tout ce qu'on peut faire avec 3 notes. Il faut parfois jongler avec le tempo pour obtenir
l’impossible ! Le temps que dure un chant n’est pas proportionnel à son nombre d’octets à cause
des reprises et du tempo. Il reste 1535 octets pour enregistrer votre chant préféré ou votre propre
composition (85 temps, un temps prend 18 octets), si vous êtes satisfait de votre 1er essai Vous
pouvez effacer n'importe quel chant pré enregistré (en entier) pour libérer de l'espace mémoire.
L'assembleur retasse automatiquement et les octets libres sont toujours à la fin après le dernier
chant. Mais on peut aussi par exemple effacer le chant2 et écrire un autre à la place sans se
soucier de la quantité de mémoire utilisée. Il n'y aura pas de trou entre le chant2 et le chant3.
11
1/4 d'heure de musique pour vous endormir... Ou apprendre à aimer la musique et désirer mieux
entendre ou jouer vous-même ces morceaux simplifiés.
Circuit imprimé simple face vu côté cuivre 4 x 9 cm
Rev.2 : Pour ceux qui auraient déjà réalisé le Pcb ancienne version il suffit de percer 2trous
En bout lu LM386 pour y implanter le condensateur 4.7 micro entre les pattes 1 et 8.
Implantation des composants Vue côté composant
Deux straps st1 enjambe le circuit issu de la patte 1 du micro PIC18F2520 U1
St2 pour amener le +5v. à la résistance R17.
Le circuit imprimé est vu par transparence. Le dessin est agrandi pour plus de clarté.
Le bouton poussoir SW1 soudé dans 4 trous reliés deux à deux peut être déporté à un endroit plus
accessible du coffret. Souder un bifilaire à la place de sw1 dans 2 trous non reliés à droite de la
platine. Le switch amenant le 9v. n'est pas représenté, il n'est pas sur le PCB voir ci dessous.
Mon coffret
12
Le circuit est fixé par 3 vis sur une pièce
de bois triangulaire elle-même collée au
fond de la boite.
En haut à gauche de la boîte le micro-
switch est fixé par 2 vis de telle sorte que
le contact s’ouvre en fermant la boite.
En bas à gauche la pile 9 volts immobilisée
par une cloison collée et un morceau de
plastique à bulles.
A droite le bouton rouge pour lancer la
musique ou écourter un morceau.
Le haut-parleur prend place dans le
couvercle.
Une barre de bois au dos de la boite
maintient le couvercle vertical.
Attention : Le coffret ouvert, la platine est sous tension. Pour sortir le Pic et le remettre en place
il faut impérativement déconnecter la pile (enlever le connecteur en bas à droite).
Fil vert = 0 volt Fil jaune = + 9 volts après switch.
Liste des composants :
Résistances 1/8 watt
R1 470 ohm
R2 1 kohm
R3 1.5 k ohm
R4; R8; R9; R10 10 kohm
R5; R6;R7 8.2 kohm
R11; R12; R13; R14 100kohm
R15 47 kohm
R16 56 kohm
Pot.1 10 kohm vertical pas 2.54mm 20 tours
Condensateurs 16v. Pas 2.54mm
C1; C4 22 microfarads
C2; C5; C10 10uF
C3; C8; C11 4.7uF C6 10nF
C7 220uF
C9 100nF
Actifs
T1; T2; T3; T4 BC548b ou autres NPN. Pour T4 voir texte.
Microcontrôleur: PIC18F2520-I/SPDIP28 + support tulipe dil 28
Ampli BF LM386 N1 DIP8 + (support DIL8 pas obligatoire)
1 Régulateur 5v. 78L05 100mA
Divers
13
1 Haut-parleur 16 ou 8 ohms 70mm 1/4 watt de 200 à 3500 pps
1 microswitch avec levier 1 contact Ex : (Conrad 709450)
1 bouton poussoir miniature pour CI (Conrad 700479)
1 circuit imprimé selon dessin fourni 4 x 9 cm. Mono Face
1 strap ou résistance 0 ohm
Connecteurs : 2 barrettes mâles droites 2 picots au pas de 2.54 mm (barrette sécable)
2 fiches femelles avec câble au pas 2.54 mm
Attention à la polarité 9 volts. Pas de sens de branchement pour le HP.
Boîtier ad libitum (haut-parleur logé dans le couvercle;
profondeur du couvercle: prévoir 2.5cm. Sinon utiliser un HP
à moteur inversé.)
1 pile 9v. + 1 contact pression pour pile 9v. (Conrad 624691)
Internet
Bernard.chabbert.pagesperso-orange.fr
Elektor.fr
Microchip.com/mplab
Bernard Chabbert Villers-lès-Nancy. France