Accueil

 

EMETTRE des SONS

 

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:

On va d'abord ecrire une méthode simple (aprés avoir mis la vitesse du Propeller a 80_000_000 hertz (80 mégaHertz) . Elle émettera une seule note.

CON

PUB impulsionsbuzzer

Maintenant on va faire jouer les 7 notes de la gamme (Do,Ré,Mi,Fa,sol,La, Si)

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) ' 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.

Faire plusieurs choses en même temps !

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) ' 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: