Note: vous trouverez des exemples de musiques faites avec le Propeller sur le site : Parallax.com -> Productinfo -> Microcontrollers ->Propeller Audio Links , il suffit de les copier sur votre ordinateur.
Voyez notamment des chants du 16 iéme sciécle en musique de synthése obtenus avec l'objet stéréo spacializer écrit par Chip Gracey le créateur du Propeller et grand amateur de musique ! et des effets spéciaux pour guitare (Coyote_1) ça vaut vraiment le détour
En branchant un petit haut parleur (Buzzer) sur la patte 18 du microcontroleur on peut lui faire émettre des sons et même produire une gamme simplifiée , en lui envoyant des impulsions a des fréquences égales a celles des sons que notre oreille entend .
Pour cela on connecte le buzzer directement, sans résistance, entre
Pour comprendre la production des sons , rappelez vous qu'une vibration est caractérisée par sa fréquence (nombre de vibrations par seconde) et qu'a partir de la fréquence on peut calculer la durée de chaque vibration qu'on appelle la période.
Cette période comprend une partie pendant laquelle le son est émis (dureeON) et une partie ou il n'y a plus de son émis (dureeOFF).
La méthode a utiliser est assez simple, mais il y a quelques nouveautés a connaitre:
CON
_XINFREQ =5_000_000
_CLKMODE = XTAL1 + PLL16X
PUB impulsionsbuzzer
dira[18]:=1
repeat 800
outa[18]:=1
waitcnt(60_000 + cnt)
outa[18] := 0
waitcnt(20_000 +cnt)
waitcnt(80_000_000 +cnt)
Exécutez cette méthode :
Quelle est la fréquence du son que vous entendez ?
Divisez par 2 les temps ON et OFF , que devient la fréquence ?
Qu' est ce qui a changé dans le son entendu ?
Divisez a nouveau les durées par 2
Voici le texte de la methode <gamme> ( les textes qui suivent un caractére ' sont des commentaires )
CON
_XINFREQ = 5_000_000 'la fréquence du quartz de notre montage soit 5 mégahertz
_CLKMODE = XTAL1 + PLL16X 'on multiplie la fréquence du quartz par 16 et onn obtient donc 80 méga hertz pour le Propeller
N=1' ici on pourrait utiliser des multiples des fréquences de base en faisant N=2 ou 3
PUB gamme
Impulsionsbuzzer(400, 1046*N,90) 'Do en fait multiples de 1046,5
Impulsionsbuzzer(400, 1175*N,90) 'Ré en fait multiples de 1174,7
Impulsionsbuzzer(400, 1318*N,90) 'Mi en fait multiples de 1318,5
Impulsionsbuzzer(400, 1397*N,90) 'Fa en fait multiples de 1396,9
Impulsionsbuzzer(400, 1568*N,90) 'Sol en fait multiples de 1568,0
Impulsionsbuzzer(400, 1760*N,90) 'La en fait multiples de 1760
Impulsionsbuzzer(400, 1975*N,90) 'Si en fait multiples de 1975,5
Impulsionsbuzzer(400, 2093*N,90) 'Do en fait multiples de 2093,0
'noter que la fréquence de référence est le LA qui vibre a 440 HERTZ, ici on a l'harmonique de niveau 4 '(440*4) =1760 et quand on multiplie les fréquences d'une gamme par 2 on passe a l'octave suivante
PUB Impulsionsbuzzer (Nfois ,frequence,pourcentON) | dureeperiode, dureeON, dureeOFF
dira[18]:=1 ' on ouvre le pin 18 en emission
dureeperiode:=(clkfreq/frequence) ' clkfreq correspond toujours a une seconde et comme la periode est le nombre d'impulsions par seconde c'est facile de calculer la durée d'une période
dureeON:= (dureeperiode * pourcentON)/100
dureeOFF:= dureeperiode-dureeON
repeat Nfois 'on fait vibrer Nfois le buzzer
outa[18]:=1 'on met la patte 18 sur ON c'est a dire allumée
waitcnt(dureeON + cnt) 'on laisse allumé pendant durée ON
outa[18] := 0 'on met la patte 18 sur OFF c'est a dire éteint
waitcnt (dureeOFF + cnt) 'on laisse éteint pendant dureeOFF
waitcnt (clkfreq/4 + cnt) 'délai entre 2 notes
Noter: un buzzer donne des sons peu puissants et peu musicaux mais il suffit de le remplacer par un petit montage avec un circuit intégré amplificateur de son et un haut parleur pour avoir un son plus satisfaisant (cout : moins de 5 euros de composants) .Le programme actuel utilise waitcnt pour les délais ça suffit pour des fréquences juqu'a autour de 1000 hertz , aussi c'est un peu juste pour les notes aigues de la gamme (vers 2000 hertz) .Ca irait mieux avec les compteurs rapides des registres du Propeller qui vont 50 fois plus vite , mais c'est hors des limites de ce projet.
Voyons maintenant si on peut faire clignoter une LED avec la méthode clignote16 (que nous avons écrite la derniére fois) pendant qu'on fait de la musique,sans programmation compliquée : c'est possible car le Propeller a 8 cerveaux appelés <cogs> qui travaillent en paralléle , mais qui partagent les variables déclarées dans le chapitre VAR des programmes en les écrivant sur une sorte de tableau noir visible par tous les programmes.
Pour démarrer une méthode dans un nouveau cog il faut:
Bien sur il faudra recopier les méthodes du programme clignote16 a la suite du programme sons.
Et on aura :
CON
_CLKMODE = XTAL1 + PLL16X 'Set to ext low-speed crystal, 16x PLL
_XINFREQ = 5_000_000 'Frequency on XIN pin is 5 MHz
N=1' on pourrait utiliser des multiples des fréquences de base
VAR
long pile[20] 'on réserve de la place pour les calculs du nouveau cog
PUB principal 'une méthode principale ça ne fait rien ça appelle d'autres méthodes pour faire le travail
cognew ( clignote16 , @pile)) 'on démarre le programme clignote16 un peu modifié
gamme 'on démarre le programme gamme
PUB gamme 'on appelle la méthode <Impulsionsbuzzer> en lui disant, le nombre d'impulsions, leur fréquence et le % du temps de l'impulsion ou la patte sera ON (ici 90%)
Impulsionsbuzzer(400, 1046*N,90) 'Do en fait multiples de 1046,5
Impulsionsbuzzer(400, 1175*N,90) 'Ré en fait multiples de 1174,7
Impulsionsbuzzer(400, 1318*N,90) 'Mi en fait multiples de 1318,5
Impulsionsbuzzer(400, 1397*N,90) 'Fa en fait multiples de 1396,9
Impulsionsbuzzer(400, 1568*N,90) 'Sol en fait multiples de 1568,0
Impulsionsbuzzer(400, 1760*N,90) 'La en fait multiples de 1760
Impulsionsbuzzer(400, 1975*N,90) 'Si en fait multiples de 1975,5
Impulsionsbuzzer(400, 2093*N,90) 'Do en fait multiples de 2093,0
Impulsionsbuzzer(400, 2093*N,0) 'un silence
PUB Impulsionsbuzzer (Nfois ,frequence,pourcentON) | dureeperiode, dureeON, dureeOFF
dira[18]:=1 ' on ouvre le pin 18 en emission
dureeperiode:=(clkfreq/frequence) ' clkfreq correspond toujours a une seconde donc il est facile de calculer la duree d'une impulsion
dureeON:= (dureeperiode * pourcentON)/100 'on calcule le temps ON
dureeOFF:= dureeperiode-dureeON
repeat Nfois 'noter que ce qui est a répéter doit être décalé d'un cran a droite
outa[18] :=1
waitcnt(dureeON + cnt)
outa[18]:=0
waitcnt (dureeOFF + cnt)
waitcnt (clkfreq/4 + cnt)
PUB clignote16 'ce texte doit commencer tout a gauche la ligne et PUB indique que cette méthode est publique
dira[16]:=1 'on ouvre la porte correspondant a la patte 16 du Propeller
repeat ' ici comme on a pas mis de nombre de répétitions la boucle va tourner sans arret
outa[16] := 1 ' on met la patte 16 a la tension haute => la LED recoit du courant
waitcnt(3_000_000 + cnt) 'on attend 3_000_000 cycles de l'horloge du propeller
outa[16] := 0 'on met la patte 16 a la tension basse => la LED s'éteint
waitcnt(3_000_000 + cnt) 'on attend 3_000_000 cycles de l'horloge du propeller
QU'EST CE QU'ON A VU ?
Notez que les programmeurs qui sont des gens pressés ? utilisent souvent des formes abbrégées de commandes, ainsi:
outa[16]~~ forme abbrégée de la commande outa[16]:=1
!outa[16] qui inverse la tension sur la patte 16 : si elle était de 0 elle la met a 3,3 volts et si elle était a3,3 volts elle la met a 0