Exercice 04-2b Sachant que les notes de musique correspondent aux fréquences suivantes : DO2 = 131 DO3 = 262 DO4 = 523 DO#2 = 139 DO#3 = 277 DO#4 = 554 RE2 = 147 RE3 = 294 RE4 = 587 MIb2 = 156 MIb3 = 311 MIb4 = 622 MI2 = 165 MI3 = 330 MI4 = 659 FA2 = 175 FA3 = 349 FA4 = 699 FA#2 = 185 FA#3 = 370 FA#4 = 740 SOL2 = 196 SOL3 = 392 SOL4 = 784 SOL#2 = 208 SOL#3 = 415 SOL#4 = 831 LA2 = 220 LA3 = 440 LA4 = 880 SIb2 = 233 SIb3 = 466 SIb4 = 932 SI2 = 247 SI3 = 494 SI4 = 988 Ecrivez un programme qui joue une petite musique de votre choix. ******************************************************************************** Tout d'abord, il faut définir la "partition" du morceau de musique que nous voulons jouer. Il faut donc définir la suite de notes et leurs durée. Imaginons que nous voulons jouer "j'ai du bon tabac". Chaque note sera définie par sa hauteur et par sa durée. La suite de notes à jouer est : do, re, mi, do, re, re, mi, fa, sol, mi, do do, re, mi, do, re, re, mi, fa, sol, do et la durée relative correpondante des notes est : 1, 1, 1, 1, 2, 1, 1, 2, 2, 2, 2 1, 1, 1, 1, 2, 1, 1, 2, 2, 2 puis nous définirons une vitesse de base pour cette musique. Cette vitesse nous donera en fait le tempo, en définissant la durée de base de la note la plus rapide. A partir de là, nous pouvons définir 3 variables tableaux : Note(c) qui contiendras les différentes notes de la chanson Durée(c) contenant les différentes durées pour chaque note de la chanson Freq(g) qui contiendra les fréquences pour chaque note de la gamme. L'indice c étant définit comme le nombre de notes de la chanson et l'indice g étant définit comme le nombre de notes de la gamme ou des gammes. ******************************************************************************** STRUCTURE DU PROGRAMME ********************** BEGIN DECLARE i AS BYTE ' Variable de calcul pour le bouclage DECLARE note(21) AS BYTE ' Tableau contenant les notes de la chanson DECLARE duree(21) AS BYTE ' Tableau contenant la durée des notes DECLARE freq(7) AS WORD ' Tableau contenant la fréquence des notes DECLARE vitesse AS WORD ' Tempo de la note la plus rapide ' Définition des valeurs du tableau note(21) LET note( 0)=0 ; LET note( 1)=1 ; LET note( 2)=2 ; LET note( 3)=3 LET note( 4)=1 ; LET note( 5)=2 ; LET note( 6)=2 ; LET note( 7)=3 LET note( 8)=4 ; LET note( 9)=5 ; LET note(10)=3 ; LET note(11)=1 LET note(12)=1 ; LET note(13)=2 ; LET note(14)=3 ; LET note(15)=1 LET note(16)=2 ; LET note(17)=2 ; LET note(18)=3 ; LET note(19)=4 LET note(20)=5 ; LET note(21)=1 ' Définition des valeurs du tableau duree(21) LET duree( 0)=0 ; LET duree( 1)=1 ; LET duree( 2)=1 ; LET duree( 3)=1 LET duree( 4)=1 ; LET duree( 5)=2 ; LET duree( 6)=1 ; LET duree( 7)=1 LET duree( 8)=2 ; LET duree( 9)=2 ; LET duree(10)=2 ; LET duree(11)=2 LET duree(12)=1 ; LET duree(13)=1 ; LET duree(14)=1 ; LET duree(15)=1 LET duree(16)=2 ; LET duree(17)=1 ; LET duree(18)=1 ; LET duree(19)=2 LET duree(20)=2 ; LET duree(21)=2 ' Définition des valeurs du tableau freq(7) LET freq(0)=0 LET freq(1)=262 ' Fréquence du Do3 LET freq(2)=294 ' Fréquence du Re3 LET freq(4)=330 ' Fréquence du Mi3 LET freq(5)=349 ' Fréquence du Fa3 LET freq(6)=392 ' Fréquence du Sol3 LET freq(7)=440 ' Fréquence du La3 LET freq(8)=494 ' Fréquence du Si3 LET i = 1 DO < Jouer la fréquence freq(note(i)) > < pendant la durée vitesse*duree(i) > LET i = i+1 UNTIL i=21 END ***************************************************************************** Listing du programme pour le STAMP2 *********************************** 'Comme la notion de tableau est très gourmante en mémoire dans le stamp 'nous allons plutôt utiliser la commande LOOKUP qui nous permet en fait 'de stocker les différentes valeurs des tableaux dans le corps du programme. ' définition des variables i VAR Byte ' variable de comptage note VAR Byte ' valeur de la note (1=do, 2=re, 3=mi, etc...) duree VAR Byte ' duree de la note à jouer freq VAR Word ' fréquence de la note à jouer vitesse CON 200 ' vitesse de base FOR i=1 to 21 ' début du comptage LOOKUP i,[0,1,2,3,1,2,2,3,4,5,3,1,1,2,3,1,2,2,3,4,5,1],note ' calcul de l'indice de la note LOOKUP i,[0,1,1,1,1,2,1,1,2,2,2,2,1,1,1,1,2,1,1,2,2,2],duree ' calcul de l'indice de la durée LOOKUP note,[0,262,294,330,349,392,440,494],freq FREQOUT 11,vitesse*duree,freq NEXT