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 playerEnsuite, 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+8Cette 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+4Pour 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_FreqOn peut aussi couper le sifflet au player quand on veut en utilisant la fonction set_music_off, comme ceci :
jsr player+16 * Set_music_offOn peut bien évidement lui faire rejouer la zik comme cela :
jsr player+12 * Set_music_onDerniè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...