CODING ★ LE PSG (CPC INFOS N°31) ★

Le PSG (CPC Infos n°31)
Mesdames et messieurs, merci d'être venu si nombreux écouter cette conférence, au cours de laquelle je compte vous entretenir du PSG. Mais j'aperçois soudain un certain nombre de personnes qui se lèvent et gagnent en hâte la sortie. Des non-sportifs, sans doute. Je vous en prie, chers amis, un instant de patience, je crois que nous nous sommes mal compris.

Par "PSG", mesdames et messieurs. Je n'entendais pas le "Paris-Saint-Germain". mais plutôt le Générateur de Sons programmable, qu'Outre-Manche on nomme, me semble-t-il, "Programmable Sound Generator", ou quelque chose d'approchant, mais ces Britanniques ne font rien comme tout le monde. Oui, il s'agit bien de ce circuit, répondant par ailleurs au sobriquet si poétique de AY-3-8912. qui équipe votre Amstrad, et qui se charge de produire des sons. Peut-être avez-vous déjà lu de la documentation sur cette puce, comme disent les marchands de machines à laver ; ne serait-ce que les pages qui lui sont consacrées dans "la Bible du 6128 de Micro-Appllcatlon. Mais ce distingué bouquin, œuvre sans doute de techniciens s'adressant à des techniciens, est plus exhaustif que pédagogique, et il est possible que vous ayez baissé les bras, légèrement découragé. Je vous propose un autre examen de la question. Et, à propos. Je prends dès maintenant l'engagement d'être clair, et, en premier lieu d'éviter le Jargon : Je ne vous parlerai donc ni de 'port I/O", ni de "chip", ni de "low byte", ni de "pin" , ni même de "fllp-flop". Restons français. Thank you.

En revanche, et comme rien ne vaut un bon exemple. Je vous offrirai en prime un petit RSX de sons préprogrammés, qui rappelleront peut-être quelque chose aux anciens possesseurs d'un ORIC-A ou d'un ATMOS, et qui vous permettront de concurrencer agréablement ie BIP de l'Amstrad, le fameux PRINT CHR$(7), dont la sécheresse et la pauvreté ne sont plus à vanter.

Le PSG est donc capable de produire des sons, et de travailler indépendamment du microprocesseur ; pour cela. Il ne réclame qu'une chose : qu'on lui fournisse les données nécessaires, il se débrouille ensuite tout seul, laissant le Z-80 s'occuper de sa tâche de son côté. Il possède seize registres, dont seulement quatorze concernent la production des sons et des bruits. Ces registres seront donc numérotés de R0 à R13. Votre travail va consister à envoyer les renseignements Idoines à chacun de ces quatorze registres, en principe ; mais, dès maintenant, une remarque s'impose : une fois placée dans le registre voulu, une donnée ne s'efface pas elle y reste Jusqu'à ce qu'une autre donnée vienne l'y remplacer ; Il n'est donc pas indispensable de renseigner TOUS les registres chaque fols qu'on veut produire un son.

Comment envoyer une donnée à un registre ? Hélas, uniquement en assembleur ! Et puis, le Basic de l'Amstrad est très efficace, mais, malgré sa rapidité, on peut avoir besoin de travailler encore plus rapidement, et je vous le prouverai tout à l'heure à propos du RSX dont je parlais ; donc, l'assembleur s'impose doublement. Mais, rassurez-vous, le mode d'emploi n'a rien de compliqué : Il suffit de placer dans l'accumulateur (le registre A du Z-80) le numéro du registre visé, et dans C la donnée à envoyer. Ensuite, on exécute avec un CALL &BD34.

Tout de suite, un exemple. Vous voulez envoyer la valeur &3E au registre R7 du PSG ? Faites ceci :

LD A,&07
LD C,&&3E
CALL &BD34

Le registre R7 contient à présent la valeur &3E, et elle y demeure Jusqu'à ce que vous la remplaciez par une autre. Compris ? Bien. Quel est donc le rôle des quatorze registres du PSG ? Voici, dans l'ordre :

— R0 et R1 sont associés pour déterminer la HAUTEUR DU SON qui sortira sur le canal A de l'Amstrad ; R0 contient le poids faible (sur 8 bits), R1 le poids fort (sur seulement 4 bits). Vous pouvez donc choisir une valeur qui occupera au maximum douze bits, par conséquent dans la fourchette 000000000000 à 111111111111 ; en décimal, de 0 à 4095 ; en hexa, de &0000 à &0FFF. Je vous expliquerai plus loin ce que désignent en réalité ces valeurs, qui ne sont ni la fréquence, ni la période du son, du moins telles que les entendent les musiciens.

— R2 et R3 font exactement la même chose pour le canal B.

— R4 et R5 font exactement la même chose pour le canal C.

Arrêtons un Instant la revue des registres du PSG, et tenons nos promesses : que désigne la valeur que vous envoyez dans ces trois couples de registres ? Il nous faut dire un mot d'acoustique. Un son est produit par un objet qui vibre : corde de piano ou de violon, branche de diapason, membrane de timbale, etc. Plus l'objet vibre rapidement, plus le son est aigu. La note LA du diapason, dite "LA international", est produite par 440 vibrations par seconde (on dit 440 Hertz, en abrégé 440 Hz) : ce nombre s'appelle la fréquence. La durée d'une seule vibration est appelée la période, et c'est toujours un nombre très petit : pour le même LA, une seconde divisée par 440, soit 0,002272727 seconde environ.

Lorsqu'on monte d'une octave (par exemple, quand on saute de ce LA-là au LA suivant dans l'aigu), la fréquence double, elle passe donc à 880 Hz, et la période est évidemment deux fols plus courte. SI on monte "trop" haut, au-delà de 10000 à 12000 Hz, le son est de moins en moins audible, il devient bientôt un "ultra-son" ; si on descend "trop" bas. le son ressemble de plus en plus à un simple bruit. Il devient de plus en plus sourd, c'est bientôt un "Infra-son".

Comment obtenir le LA International par l'Intermédiaire du PSG ? En envoyant aux registres Intéressés la valeur 440 désignant la fréquence ? Ou la valeur 0,0022727 désignant la période ? NI l'une ni l'autre ! (Essayez, d'ailleurs, de "poker" quelque part le nombre 0X3022727...). Les concepteurs du PSG ont adopté la convention suivante, dictée par des raisons électroniques : Fréquence x Période = 62500 (et non plus 1, comme avec la période au sens musical du mot) Soit dit en passant, le "Manuel de l'Utilisateur" de l'Amstrad prétend que c'est 125000, et la faute n'a jamais été corrigée depuis des années, malgré de multiples rééditions, pas plus que les noms des notes n'ont été francisés. Ce devait être trop difficile...

Par conséquent, sachant que le LA International a pour fréquence 440 Hz, la "période", ou du moins ce qu'on appelle ainsi chez monsieur PSG. est : 62500 / 440 = 142.04545. qu'on arrondit évidemment à la valeur entière la plus proche. 142. Convertissons en hexa : 142 = &008E

Nous enverrons donc &8E, poids faible, au registre R0. Et &00, poids fort, au registre R1. Voilà définie la hauteur du son. (Remarquons que les valeurs extrêmes, proches de 0 ou de 4095, ne sont valides que théoriquement : au-dessous de 5, plus rien n'est audible, sauf peut-être pour votre chien, et c'est heureux, car la Justesse des notes devient très approximative avec des valeurs qu'on ne peut plus affiner, tant elles sont proches ; et au-dessus de 3000, qui donne un son de 21 Hz, on n'a guère plus que du bruit. Vérifiez-le avec du Basic : SOUND 1,3000 et SOUND 1,4000 n'offrent guère de différence...).

Fin du cours sur la hauteur des sons ; reprenons la revue des registres du PSG, Il en reste huit.

— R6 définit la HAUTEUR DU BRUIT (et non plus du son), car même les bruits ont une hauteur ; comme seuls cinq bits fonctionnent sur ce registre, vous ne pouvez lui envoyer que les valeurs décimales 0 à 31. Toute autre valeur est "décapitée" selon le procédé modulo ( 32 donne 0,33 donne 1. etc ).

— R7 est une sorte de poste de commandement, qui va décider de ce qui sortira ou ne sortira pas sur le haut-parleur de votre ordinateur. Ici, Il faut détailler chaque bit, ou plutôt les six premiers (ne touchez pas aux bits 6 et 7, laissez-les à zéro) :
* les bits 0,1 et 2 déterminent si un SON sortira sur les canaux, respectivement. A, B et C : s'ils contiennent 0, le son est produit ; s'ils contiennent 1, silence, quand bien même vous auriez envoyé des données aux registres R0 à R5. C'est R7 qui commande !
* les bits 3, 4 et 5 déterminent si un BRUIT sortira sur les mêmes canaux, avec la même convention : 0 = oui, 1 = non.
Vite, un exemple : en envoyant à R7 la valeur &3E, qui s'écrit en binaire et sur six bits 111110, vous autorisez la sortie d'un son sur le canal A, puisque le Bit 0 contient 0, Interdisez toute sortie de son sur B et C, puisque les bits 1 et 2 contiennent 1. et toute sortie de bruit sur les trois canaux, puisque les bits 3, 4 et 5 contiennent 1. Donc, un son sans bruit sera produit sur le canal A. Vous êtes toujours là ? Je continue.

— R8 définit, sur les bits 0 à 3. le VOLUME (l'Intensité sonore) de ce qui sortira sur le canal A. Comme en Basic, vous avez ainsi droit aux valeurs décimales 0 à 15. Mais attention I Le bit 4 peut aussi être employé : s'il contient 0. le volume sera ce que vous avez choisi, de 0 à 15, et surtout II sera constant. Mais, si vous le mettez à 1. le PSG ne tiendra pas compte du volume défini par les bits 0 a 3, il en produira un autre I Lequel ? Celui, modulé (c'est-à-dire d'Intensité variable, et non plus constante), déterminé par l'ENVE-LOPPE, dont je vous entretiens plus loin, à propos des registres 11, 12 et 13. Patience.

— R9 fait pour le canal B le même travail que R8.

— R10 fait pour le canal C le même travail que R8 et R9.

A présent, parlons enveloppe. Vous le voyez. Je ne vous al pas fait attendre longtemps.

— R11 et R12 sont employés conjointement, et ils déterminent la durée totale du son ou du bruit, valable pour UNE période d'enveloppe (certaines enveloppes n'ont qu'une période ; d'autres se répètent Indéfiniment, comme nous allons le voir) ; comme d'habitude, poids faible dans RI 1, poids fort dans RI2. Sur seize bits, vous pouvez choisir une valeur de 0 à 65535.

— R13 contrôle l'ENVELOPPE. c'est-à-dire que. par cet Intermédiaire, et en choisissant un nombre décimal de 0 à 15, vous sélectionnez l'une des huit enveloppes préprogrammées que connaît le PSG. Je vois d'Ici des mouvements divers dans la foule : vous ignoriez qu'il existait des enveloppes préprogrammées, toutes faites, dans votre Amstrad ? Le Manuel de l'utilisateur qu'on vous a vendu avec votre ordinateur ne vous en a rien dit ? Eh bien non. Il a fait l'impasse sur la question (et sur quelques autres, du reste...). Sachez donc que le PSG est capable de produire lui-même, sans que vous utilisiez l'instruction Basic ENV, deux enveloppes finies, limitées dans le temps (c'est-à-dire ne s'exécutant qu'une fols, avec une seule période : bref, s'arrêtanf toutes seules), et six enveloppes continues, de celles qu'on est obligé d'arrêter si on ne veut pas devenir à la longue légèrement nerveux, mais la chose est aisée. La figure 1 les schématise approximativement, mais un petit commentaire n'est pas inutile.

Prenons par exemple l'enveloppe 1 : elle est FINIE, c'est-à-dire qu'elle n'est exécutée qu'une fols ; elle se compose d'une attaque courte (le son monte d'un seul coup à son maximum), puis l'intensité sonore diminue progressivement jusqu'à tomber à zéro. Le tout est produit une seule fols : une seule période, dont la durée est fixée par R11 et R12, comme expliqué plus haut.
L'enveloppe 2 est également finie, mais Ici. le son monte progressivement, puis retombe brusquement à zéro.
L'enveloppe 5. elle, est CONTINUE : le son monte progressivement, puis, arrivé à son maximum, reste stable, et se prolonge Jusqu'à perpétuité si vous ne vous faites rien pour le stopper. L'enveloppe 3 ressemble à l'enveloppe 1. mais, dès qu'une période est achevée, une autre recommence, et là aussi jusqu'à ce que vous Interveniez. Comment obtenir ces différentes enveloppes ? En utilisant le mini-tableau suivant :

Voilà donc passés en revue les quatorze registres utiles du PSG.

A présent, le cadeau Bonux.

Comme je l'ai fait observer perfidement, le PRINT CHR$(7) de l'Amstrad est d'une Indigence rare, alors qu'il était si facile de produire des sons plus harmonieux ou plus sophistiqués. Je vous ai donc concocté, à titre d'illustration, un petit RSX qui vous apportera six sons supplémentaires, désignés par des onomatopées suffisamment parlantes : PING, CLIC, CLAC, PAN, BOUM et PIOU. Le chargeur Basic présent quelque part dans ces pages vous l'Installera. Vous pouvez vous amuser à le désassembler, il est très simple à comprendre. Les données à fournir au PSG se trouvent en fin de programme, dans un tableau de six fois quatorze octets, et vous pouvez aussi tenter de modifier les sons en remplaçant par d'autres valeurs les valeurs non nulles. Autre chose : placé en &BE80. ce petit programme résiste au RESET, et même, si vous avez un MICROSAVE, à l'extinction de l'ordinateur ; Il faut seulement le réactiver avec un CALL &BE80.

Deux derniers détails : je vous disais qu'il était facile de mettre fin à un son dont l'enveloppe est continue. Il suffit d'appeler le vecteur &BCA7. Cherchez-le, Il s'y trouve. Et puis, pour vous démontrer que le Basic est trop lent, sachez que PIOU est l'équivalent en langage-machine de la ligne Basic suivante : FOR i=0 TO 112:SOUND 1,i,1,15:NEXT Chronométrez avec la variable TIME : le langage-machine est sept fois plus rapide !

Bon courage, et envoyez vos productions à CPC-INFOS, que tout le monde en profite.

Jean-Pierre MARQUET, CPCINFOS n°31

10 dep=&BE80:lig=100
30 s=lig:FOR i=0 TO 15:READ a$:POKE dep+i,VAL("&"+a$):s=s+PEEK(dep+i):NEXT
40 READ b$:IF VAL("&"+b$) < > s THEN PRINT"Erreur en ligne"lig:END
50 dep=dep+16:lig=lig+10
60 IF lig < 240 THEN 30

70 SAVE "ononatop",b,&BE80,211
100 DATA 21,BS,BE,0l,89,BE,C3,Dl,BC,9D,BE,C3,B8,BE.C3,BF,AA7
110 DATA BE.C3,C4,BE,C3,C9,BE.C3,CE,BE,C3.D3.BE.50,49,4E.B45
120 DATA C7,50,41,CE,42.4F,55,CD.43,4C,49,C3,43,4C,41.C3,77F
130 DATA 50,49,4F,D5,00,FC.A6,89,BE,21,FF,BE,C3.EE.BE,21,996
140 DATA 00,BF,18,F8,21,1B,BF,18,F3,21,29,BF,18,EE,21,37,6D5
150 DATA BF,18,E9.2l,45,BF.CD,EE,BE.0E,00,AF,C5,CD,34,BD,934
160 DATA C1,06,00,10,FE,0C,79,FE,70,20,F0,C3.A7,BC,06,0E,7B2
170 DATA 3E,FF,3C,4E,F5.C5,CD,34.BD,C1,F1,23,10,F4,C9,18,9A3
180 DATA 00,00,00,00,Où,00,3E,10,00,00,00,0F,00,00,00,00,111
190 DATA 00,00.00,0F,07,10,10,10,00,08,00.00,00,00,00,00,10C
200 DATA 00,1F,07,10,10,10,00,18,00,1F,00,1F,0C,1F,00,00,193
210 DATA 3E,10,10,10.AF,00,00,2F,00,00,00.00,00,00,3E,10,28C
220 DATA 00,00,AF,00,00,00,00,00,00.00,00,00,3E,OF,00,00,1D8
230 DATA 00,00.00,00,FF,FF,FF,FF,00,00,00,00,FF,FF,FF,FF.8DE
240 LOAD"ononatop":CALL &BE80
250 ùping,:ùpan,:ùboum,:ùclic,:ùclac,:ùPiou

★ ANNÉE: ???
★ AUTEUR: JEAN-PIERRE MARQUET

★ AMSTRAD CPC ★ A voir aussi sur CPCrulez , les sujets suivants pourront vous intéresser...

Lien(s):
Je participe au site:

» Vous avez remarqué une erreur dans ce texte ?
» Aidez-nous à améliorer cette page : en nous contactant via le forum ou par email.

CPCrulez[Content Management System] v8.7-desktop/c
Page créée en 325 millisecondes et consultée 1805 fois

L'Amstrad CPC est une machine 8 bits à base d'un Z80 à 4MHz. Le premier de la gamme fut le CPC 464 en 1984, équipé d'un lecteur de cassettes intégré il se plaçait en concurrent  du Commodore C64 beaucoup plus compliqué à utiliser et plus cher. Ce fut un réel succès et sorti cette même années le CPC 664 équipé d'un lecteur de disquettes trois pouces intégré. Sa vie fut de courte durée puisqu'en 1985 il fut remplacé par le CPC 6128 qui était plus compact, plus soigné et surtout qui avait 128Ko de RAM au lieu de 64Ko.