Suivez-nous sur X
|
|
|
0,
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L,
M,
N,
O,
P,
Q,
R,
S,
T,
U,
V,
W,
X,
Y,
Z,
ALL
|
|
0,
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L,
M,
N,
O,
P,
Q,
R,
S,
T,
U,
V,
W,
X,
Y,
Z
|
|
0,
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L,
M,
N,
O,
P,
Q,
R,
S,
T,
U,
V,
W,
X,
Y,
Z
|
|
A propos d'Obligement
|
|
David Brunet
|
|
|
|
Programmation : GFA Basic - Jouer une musique SoundTracker
(Article écrit par Max et extrait d'Amiga News Tech - juin 1990)
|
|
Nous allons encore une fois faire une légère digression au sein de notre cours assembleur, pour étudier
de près un problème soulevé par Jean-Marc Fauchan, gentil lecteur de Sâone-et-Loire, à savoir : jouer
une musique SoundTracker depuis le GFA Basic.
La PlayRoutine livrée avec SoundTracker est en effet destinée presque exclusivement à une inclusion au
sein d'une démo, donc écrite en assembleur. Pour ce qui est de l'incorporer au GFA, c'est une toute
autre paire de manches, que nous allons d'ailleurs relever dès maintenant et sans plus tarder.
Bref, nous allons la disséquer joyeusement et l'adapter au format désiré, c'est-à-dire :
- La rendre entièrement relogeable (c'est indispensable et le plus gros du travail (quoique...)).
- Rendre son appel possible depuis le GFA, c'est-à-dire lui faire accepter certains paramètres, passés par
l'intermédiaire de la pile.
- Évidemment, l'appeler sous interruption, tous les 1/50e de seconde (à chaque VBL, quoi).
Du GFA au LM
Avant d'aller plus loin, je tiens à préciser que je ne dispose que de la version 2.1 de la PlayRoutine,
c'est-à-dire autorisant un maximum de 15 instruments (alors que mon SoundTracker est le 2.4 avec 31
instruments), mais le principe reste le même.
Examinons tout d'abord comment le GFA Basic passe ses paramètres à une routine en langage machine.
Ceux qui ont déjà tâté du C ne seront pas du tout dépaysés, puisque c'est exactement le même
procédé qui est utilisé (d'où le nom de la fonction "C:", d'ailleurs), à savoir que les paramètres
sont passés par la pile, dans l'ordre de leur énumération. Ainsi par exemple mais pas par hasard :
VOID C:adresse%(L:parametre1%,W:parametre2&,W:parametre3&) sera empilé comme suit :
- SP : adresse de retour (pour RTS).
- SP + 4 : paramètre 1% (32 bits).
- SP + 8 : paramètre 2& (16 bits).
- SP + 10 paramètre 3& (16 bits).
(nous ne traiterons pas des variables alphanumériques, qui n'ont strictement aucun rapport
avec notre article du mois).
Pour récupérer ces paramètres, il suffit donc de faire quelque chose dans le genre :
move.l4(sp),d0 ; d0 = paramètre 1%
move.w 8(sp),d1 ; d1 = paramètre 2&
move.w 10(sp),d2 ; d2 = paramètre 3&
|
Mais pourquoi donc se masturber ainsi les neurones à passer des paramètres ?
Tout simplement parce que la routine d'initialisation de la PlayRoutine nécessite de
connaître l'adresse où est logé le module à jouer (ce sera notre "parametre 1%").
Pour la frime, "parametre 2&" permettra de définir la vitesse de la musique (commande
F dans SoundTracker), ce qui peut s'avérer utile lorsqu'on veut jouer plusieurs morceaux
les uns à la suite des autres et que les uns changent de vitesse sans prévenir personne.
Et enfin, le troisième paramètre servira à définir la priorité du serveur d'interruption
que nous allons créer spécialement pour l'occasion.
Cette priorité, comprise entre -128 et +127, est la cuisine interne d'Exec et n'a pas ici
un rôle réellement capital, une valeur de 0 étant tout à fait convenable. De toute manière,
le temps que vole la PlayRoutine pendant la VBL suffit à faire passer l'Amiga pour un ZX81
de compétition. Que voulez-vous, on a rien sans rien...
Un mot encore à propos de l'adresse du module : il doit se trouver en mémoire Chip
pour que le processeur sonore puisse accéder aux instruments numérisés. Le listing 3,
superbe exemple en GFA, évidemment, s'occupe de ce détail. Le listing 2, quant à lui,
se charge de créer le fichier "REPLAY.INL" qui sera inséré dans l'INLINE. Et enfin,
le listing 1 est le source assembleur de la PlayRoutine modifiée (écrit pour Devpac 2,
il serait temps de jeter K-Seka aux orties) plus les diverses initialisations et
l'installation du serveur d'interruption (car chez moi, on fait les choses proprement,
ma bonne dame).
Voilà. Je n'en dirai pas plus sur le GFA et vous laisse ipso facto avec quelques jolies
lignes de données bien fournies à taper (attention les crampes). On se retrouve le mois
prochain avec une routine pour lire/décompacter un fichier IFF ILBM toutes résolutions,
même en suraffichage.
Listing 1 : la PlayRoutine légèrement personnalisée
Listing 2 : créateur de REPLAY.INL
Listing 3 : exemple
|