Soyons pour un son propre
Le son sur Thomson reste quelque chose dassez rare. Le Thomson permet pourtant de
varier ce genre de plaisir. Certes, les problèmes liés à lémission dun son 6
bits perturbée par les mouvements de la souris refroidissent les programmeurs
qui voudraient saventurer dans une telle expérience. Certaines routines ne
respectent pas toujours les PIA, ce qui enlève à la netteté de lémission.
Hervé MELEARD, créateur de TO-DIGI, a pourtant intelligemment mis au point des
routines très efficaces, qui introduisent la notion dextrapolation: entre deux
octets à envoyer au PIA, ses routines calculent les octets intermédiaires, ce
qui rend le son moins parasité, plus fluide.
La routine suivante est extraite directement de TO-DIGI (version un peu
rectifiée). Elle lira un son en mémoire puis rendra la main au système. Les
bits 7 et 6 de chaque octet du son seront à 0.
Tout dabord, les registres du 6821 « jeux et musique » ainsi que le PIA
Timer doivent être protégés. Il sera donc déclaré une zone pour la sauvegarde:
MCRA RMB 1 Contrôle port A
MDDA RMB 1 Direction port A
MDA RMB 1 Etat données port A
MCRB RMB 1 Contrôle port B
MDDB RMB 1 Direction port B
MDB RMB 1 Etat données port B
MPCR RMB 1 Contrôle port C
...puis les registres seront sauvés et initialisés pour le son:
SETDP $E7 Déclare le DP pour lassemblage
SON PSHS CC,DP Sauve CC et DP
LDA #$E7 | Fixe le
TFR A,DP | DP à $E7
LDA <$E7CE | Sauve contrôle
STA MCRA | port A
LDA <$E7CF | Sauve contrôle
STA MCRB | port B
ORA #$04 | Autorise sortie
STA <$E7CF | son port B
LDA <$E7CD | Sauve état
STA MDB | données port B
LDA <$E7CF | Désactive
ANDA #$FB | sortie son
STA <$E7CF | port B
LDA <$E7CD | Sauve direction
STA MDDB | port B
ANDA #$3F PA7 PA6 entrées
ORA #$3F PA0-PA5 sorties
STA <$E7CD Init direct port B
LDA #$04 | Sortie son
STA <$E7CE | contrôle ports
STA <$E7CF | A et B
CLR <$E7CD Init données port B
ORCC #$50 Gel des interruptions
LDA <$E7C1 | Sauve état
STA MPCR | port C
ORA #$30 |
ANDA #$F7 | Init port C
STA <$E7C1 | (sortie son)
Avant dexécuter le son, certains registres doivent être initialisés.
« WAVE » sera ladresse du début du sample, « FWAVE »
ladresse de la fin du sample et « TEMPO » contiendra la vitesse du
son:
LEAS -2,S Fait de la place en pile
LDX #WAVE Adresse dimplantation du sample
LDY #FWAVE-WAVE Taille du sample
LDA #16 |
SUBA TEMPO | Ajuste la temporisation
STA 1,S |
CMPA #$08 | Si pas 8000 octets/secondes,
LBNE SON4 | passe
La temporisation doit être définie selon la vitesse du son ou son débit à
léchantillonnage. Les routines démulation sonore utilisées sont celles
développées par Hervé MELEARD, créateur de TO-DIGI. Une routine découte avec
extrapolation de 2 est mise en uvre pour toutes les vitesses sauf pour la
vitesse 8, qui est gérée par une routine avec extrapolation de 4, affinant
encore la fluidité du son. Les correspondances entre les vitesses et les débits
(en nombre doctets par secondes) sont les suivantes:
_________________________________________________________________
Vitesse 15 14 13 12 11 10 9 8
Débit 18500 15600 13500 11900 10600 9600 8800 8000
_________________________________________________________________
Vitesse 7 6 5 4 3 2 1
Débit 7400 6900 6500 6100 5700 5400 5100
__________________________________________________________
Si le débit choisi est 8000, la routine avec extrapolation de 4 entre en jeu:
LDA #$20 | Valeur V0
STA ,S | de départ
SON0 LDA ,S Lit la valeur V0
SUBA ,X Fait différence D avec V1
BMI SON1 Si < 0, passe
* Si D>=0
LSRA |
LSRA | V=V0-(D/4)
SUBA ,S |
NEGA |
STA <$E7CD Génère le son V
LDA ,S |
SUBA ,X |
LSRA | V=V0-(D/2)
SUBA ,S |
NEGA |
EXG A,A 8 microsecondes de battement
STA <$E7CD Génère le son V
LDA ,S |
SUBA ,X |
LSRA | V=V0-(3D/4)
LSRA |
SUBA <$E7CD |
NEGA |
EXG A,A 8 microsecondes de battement
STA <$E7CD Génère le son V
PSHS B,A |
PULS A,B | 20 microsecondes
BRA *+2 | de battement
BRA SON3 |
* Si D<0
SON1 NEGA |
LSRA | V=V0+(D/4)
LSRA |
ADDA ,S |
STA <$E7CD Génère le son V
LDA ,X |
SUBA ,S | V=V0+(D/2)
LSRA |
ADDA ,S |
EXG A,A | 10 microsecondes
NOP | de battement
STA <$E7CD Génère le son V
LDA ,X |
SUBA ,S |
LSRA | V=V0+(3D/4)
LSRA |
ADDA <$E7CD |
EXG A,A | 10 microsecondes
NOP | de battement
STA <$E7CD Génère le son V
PSHS Y,X,A | 20 microsecondes
PULS A,X,Y | de battement
SON3 LDA ,X+ Lit la valeur V1
STA <$E7CD Génère le son V1
STA ,S V0=V1
LEAY -$01,Y | Son
BNE SON0 | suivant
BRA EXIT Sortie du programme
Pour les autres vitesses, la routine suivante est sollicitée:
SON4 LDA #$20 | Initialise
STA ,S | valeur V0 de départ
SON5 LDA ,X |
ADDA ,S | V=(V0+V1)/2
LSRA |
STA <$E7CD Génère le son V
LDB 1,S |
SON6 DECB | Temporisation
BNE SON6 |
LDA ,X+ Lit valeur V1
STA ,S V0=V1
STA <$E7CD Génère le son V1
LDB 1,S |
SON7 DECB | Temporisation
BNE SON7 |
LEAY -$01,Y | Son
BNE SON5 | suivant
Puis, lorsque le son a été lu, il convient de restituer les registres dans leur état initial:
EXIT LEAS 2,S Rétablit la pile
PULS CC Récupère CC
LDA <$E7CF | Désactive
ANDA #$FB | sortie son
STA <$E7CF | port B
LDA MDDB | Init direction
STA <$E7CD | port B
LDA <$E7CF | Active
ORA #$04 | sortie son
STA <$E7CF | port B
LDA MDB | Init données
STA <$E7CD | port B
LDA MCRB | Réinit contrôle
STA <$E7CF | port B
LDA MCRA | Réinit contrôle
STA <$E7CE | port A
LDA MPCR | Réinit contrôle
STA <$E7C1 | port C
PULS DP,PC |
Ainsi, si vous utilisez cette routine, le système ne sera en rien perturbé par
lécoute de vos propres réalisations sonores et vous les écouterez avec plaisir
sur Thomson!
_______________________________
Cet article a été réalisé avec laimable autorisation de Hervé MELEARD.
|