Player SID Sound



Par FroST



Salut tout le monde ! Aujourd'hui, les enfants, nous allons étudier comment utiliser le player SID Sound Designer dans vos programmes. Si par malheur vous n'avez pas les sources et les programmes allant avec l'article, veuillez vous débrouiller pour les trouver et n'utilisez surtout les anciennes versions du player qui était diffusée avec Sid Sound Designer, elles sont buggés (elles tournent sans problèmes sur ST, mais ça commence à merder en montant dans la gamme). La routine que je vous propose est celle qui devrait se trouver sur le site de DHS, elle a était fixée une première fois par Defjam afin de la faire tourner sur (presque) toutes les machines possibles (ST/../TT/Falcon/FalcCT2) et j'y ai finalement apporté une dernière modification pour que l'IDE interne de certains Falcon ne se réinitialisent pas une fois que l'on a arrêter le player (enfin, on peut peut-être changer ce qui précède par certains dur IDE ne se réinitialisent sur un Falcon, j'en ai un peu discuter avec Evl, on ne sait pas trop d'où ça vient : ça le fait sur mon Falcon, pas sur le sien). Bon, fini le blabla, on attaque...



I - Les différentes fonctions du player.


Je vais d'abord vous décrire les différentes fonctions qu'offre le player. Les habitués des chips de Mad-Max ne vont pas être dépaysé car c'est le même système qui est utilisé.


Tout d'abord, on retrouve l'init (offset 0). Il faut l'appeler obligatoirement avant de faire rejouer le moindre chip. Elle s'occupe d'initialiser quelques variables internes au player et fait également quelques sauvegardes. Cette fonction nécessite 2 arguments : l'adresse des données du module chip, et l'adresse des données des instruments utilisés par le chip; ce qui correspond respectivement aux fichiers TRI et TVS. On place l'adresse des données TRI dans a1 et l'adresse des données TVS dans a0. On l'appelle donc comme ceci :

     lea     tvs,a0
     lea     tri,a1
     jsr     player
Ensuite, il faut bien arrêter le player. Cela s'effectue à l'aide de la fonction qui se trouve à l'offset 8 du player, donc on l'appelle comme ceci :
     jsr     player+8
Cette fonction ne requiert pas d'arguments.


Pour rejouer le soundchip, on appel à un interval de temps régulier la fonction se trouvant à l'offset 4, donc comme ceci :

     jsr     player+4
Pour l'appeler à un interval de temps régulier, il y a en gros 2 solutions : la VBL-queue (ou VBL tout court) ou bien placer la routine en timer B (le listing d'exemple utilise le timer B). Attention, car le player utilise tout les autres timers disponibles, seul le B reste actif (et ne peut pas servir pour faire de l'overscan bas à cause de quelques problèmes de synchro).


Voilà, si vous êtes pressés, vous pouvez passer directement au listing d'exemple, les fonctions décrites devraient pouvoir vous suffir. Mais, il existe encore quelques fonctions servant à contrôller encore un peu plus le player.


Tout d'abord, une fonction très intéressante qui permet de synchroniser le player sur (presque) n'importe quelle fréquence (50 Hz, 60 Hz, 71 Hz par exemple si cela vous dit quelque chose). C'est très utile si vous utilisez le player en interruption VBL, vous pouvez donc utiliser la fréquence de rafraichissement que vous voulez, de plus ce système permet le changement de fréquence à la volée, c'est à dire lorsque le player est déjà en train de rejouer un chip. Mais je vous déconseille d'utiliser le player en VBL-queue (ou VBL tout court, bonjour la synchro), mais plutôt en timer B comme dans le listing d'exemple, cela aura au moins le mérite de tourner sur toutes les machines (sauf le Milan qui ne possède pas d'YM :(. Quoi qu'il en soit, je vous indique comment appeler cette fonction :

        moveq   #50,d0      * 50 Hz, on met 60 pour 60 Hz, ...
        jsr     player+28   * Set_Screen_Freq
On peut aussi couper le sifflet au player quand on veut en utilisant la fonction set_music_off, comme ceci :
        jsr     player+16   * Set_music_off
On peut bien évidement lui faire rejouer la zik comme cela :
        jsr     player+12   * Set_music_on
Dernière chose encore, le player utilise les timers A, C et D ce qui ne laisse que le B de libre (et encore, si on ne l'utilise pas pour appeler la routine de replay), donc pour les écrans faisant de l'overscan (bas et plus), il vaut mieux éviter d'utiliser ce player.



II - Le listing assembleur


Je remercie Evl / DHS de m'avoir permis d'utiliser son source dans mon article. Je n'y ai pas apporter de modifications, seuls une partie des commentaires sont en français.


; anders eriksson (evil) / dhs
; december 5, 1998
; ae@atari.org / dhs.atari.org

; easy to use sidsound designer replay shell.

; testé sur st, ste, mste, pak030, tt030,
; falcon030, centurbo2

; sidsound desinger original routines by
; synergy and animal mine. patched and updated
; by defjam/checkpoint.
; Patch Falcon par FroST (cf. explications)

; Les timers A, C et D sont utilisés pour l'émulation du SID.
; En gros, vous pouvez utiliser cette émulation sur les trois
; voix.

; Le timer B est utilisé pour appeler le player 50 fois par
; seconde, donc à une fréquence de 50 Hz.

    section    text

begin:

    clr.l      -(sp)                  ; into super
    move.w     #32,-(sp)
    trap       #1
    addq.l     #6,sp
    move.l     d0,save_stack          ;save old stack

    lea.l      voice,a0               ;address to sounddata (TRI)
    lea.l      song,a1                ;address to songdata (TVS)
    jsr        player+0               ;init player

    move.w      sr,d0                 ;save sr
    move.w      #$2700,sr             ;all ints off

    lea.l       save_mfp,a0           ;save needed mfp regs
    move.b      $fffffa07,(a0)+
    move.b      $fffffa13,(a0)+
    move.b      $fffffa1b,(a0)+
    move.b      $fffffa21,(a0)+
    bset        #0,$fffffa07          ;timer-b inits
    bset        #0,$fffffa13
    move.b      #246,$fffffa21      ;2457600/200/246 approx 50 Hz
    or.b        #%111,$fffffa1b       ;%111 = divide by 200
    bclr        #3,$fffffa1b          ;tos 2.05 fix

    move.l      $120,save_timer_b     ;save old timer_b
    move.l      #timer_b,$120         ;install new timer_b

    move.w      d0,sr                 ;restore sr

.loop:
    cmpi.b      #$39,$fffffc02.w      ;wait for space
    bne.s       .loop

exit:
    move.w      sr,d0                 ;save sr
    move.w      #$2700,sr             ;all ints off

    lea.l       save_mfp,a0           ;restore mfp regs
    move.b      (a0)+,$fffffa07
    move.b      (a0)+,$fffffa13
    move.b      (a0)+,$fffffa1b
    move.b      (a0)+,$fffffa21

    move.l      save_timer_b,$120.w   ;restore timer_b

    move.w      d0,sr                 ;restore sr

    jsr         player+8              ;stop player

    move.l      save_stack,-(sp)      ;exit super
    move.w      #32,-(sp)
    trap        #1
    addq.l      #6,sp

    clr.w       -(sp)                 ;pterm()
    trap        #1

timer_b:
    jsr         player+4              ;call player
    bclr        #0,$fffffa0f          ;clear timer_b busyflag
    rte

    section     data

    even
player: incbin  'amsid.dat'           ;replay routines
    even
song:   incbin  'song.tri'            ;songdata
    even
voice:  incbin  'song.tvs'            ;sounddata
    even

    section     bss

    even
save_stack:     ds.l    1             ;save stack
save_mfp:       ds.l    1             ;save mfp (timer_b)
save_timer_b:   ds.l    1             ;save timer_b



III - Note aux amateurs de GFA.


Je suis désolé de ne pas avoir parlé de la manière d'utiliser le player avec ce fabuleux langage, j'avais promis à The Beast de le faire, mais je n'ai tout simplement pas le temps. Mais compter sur moi pour revenir dessus dès que possible. Tout au plus, vous pouvez toujours m'envoyer un email pour me le rappeler comme ça je vous enverrais directement le player pour le GFA et le listing d'exemple qui va avec.



IV - This is the end, beautiful friend, the end.


Normalement vous trouverez sur la disquette le code listing d'Evl, ainsi que le player modifié par mes soins.


Voilà voilou, vous devriez pouvoir vous débrouiller avec ce player, d'autant plus que le son est d'excellente qualité et les musiciens utilisant Sid Sound Designer font en général des merveilles, pour vous en rendre compte, allez écouter les chips de 505 et de Dma SC dans le dernier Undercover mag (14).


A+ Les zamis.


Contact : th.reiss@wanadoo.fr (noon ! pas les tomates !)
Vous pouvez aussi me laisser un message sur RTEL en bal FroST.


Je ne peux pas m'empécher de rajouter ça :
Greetings goes to : ST Survivor, Thyrex, Exyl, Moondog, MC Laser, 505, Evl, Razaac, The Beast, EdO, ST Ghost, Hello, DMA SC, QueST, CKJ, Creature XL et tout ceux que j'oublie...




Edito Rubriques habituelles Planè Atari Internet Techniques et programmation Interviews Jeux Vidéo Humour Musique Chroniques, etc. Divers