Envoyer un e-mail à Collection ThomsonCollection Thomson
EditoForum 2002Liens
Nanoreseau
Docs
Logiciels
Matériel
Imprimer le document
Retour à la liste

Soyons pour un son propre

Le son sur Thomson reste quelque chose d’assez rare. Le Thomson permet pourtant de varier ce genre de plaisir. Certes, les problèmes liés à l’émission d’un son 6 bits perturbée par les mouvements de la souris refroidissent les programmeurs qui voudraient s’aventurer 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 d’extrapolation: 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 d’abord, 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 l’assemblage
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 d’exécuter le son, certains registres doivent être initialisés. « WAVE » sera l’adresse du début du sample, « FWAVE » l’adresse de la fin du sample et « TEMPO » contiendra la vitesse du son:

       LEAS   -2,S    Fait de la place en pile
       LDX    #WAVE   Adresse d’implantation 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 d’octets 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 l’aimable autorisation de Hervé MELEARD.


Site
Plus
Forums
Code
Créations

*Site en favoris
*Page en favoris
*Site en démarrage
*Page en démarrage


Haut de page

Collection Thomson 2015 © Ghislain Fournier & François Mouret