Ce tutoriel simple montre comment jouer de la musique au format mod dans les programmes compilés avec newcc65.
Tout d'abord rendons à César ce qui appartient à César, le code original ainsi que le tracker permettant d'exporter les mods sont l'oeuvre de Björn Spruck.
Son site web : http://bjoern.spruck.net/lynx/
Le code original : http://bjoern.spruck.net/lynx/chip_in_c_1.1.tgz
Chipper, le tracker : http://bjoern.spruck.net/lynx/Chipper_1.7.6.0.zip
Vous aurez aussi besoin de mettre à jour newcc65 avec la version patchée par le même Björn :
Version patchée de newcc65 : http://bjoern.spruck.net/lynx/newcc65_exe.zip
Une fois que vous avez mis à jour newcc65, téléchargez mon archive qui contient le code et des mods d'exemple :
http://www.godwarriors.com/__REPOS/LYNX/mod3.zip
PARTIE I : les mods, création et compilation
Je ne suis pas un expert des trackers donc ne comptez pas sur moi pour vous expliquer comment créer un mod. Le plus simple reste encore de lancer Chipper :
1) Chargez un des exemples (dans le répertoire data/demosongs).
2) Exportez-le : Export > For BLL Driver > Export for BLL LyxAss (appelons-le "my_tune_data.asm")
3) Créez un nouveau fichier (par exemple my_tune.asm) en copiant le code suivant, et en ajustant le nom du fichier inclu :
include "soundbs.mac"
run $8000
dc.w CHANNEL_0, CHANNEL_1, CHANNEL_2, CHANNEL_3
include "my_tune_data.asm"
(notez l'adresse $8000, c'est l'adresse ou le mod sera chargé et que vous pouvez modifier à votre convenance, voir plus bas)
Vous avez alors 2 fichiers asm : my_tune.asm et my_tune_data.asm
4) Assurez-vous que ces fichiers soient dans le repertoire res/mod (ou en tout cas dans le même répertoire que la version correcte du fichier soundbs.mac) et compilez-le avec la commande suivante:
lyxass -v my_tune.asm
5) Vous avez alors un fichier my_tune.o, que vous ajouterez à votre cartouche avec lynxer (voir mod3.mak)
PARTIE II : le code
Il y a 3 fichiers de Björn qui sont repris quasiment tel quel :
- file_bs3.h/.c : Contient un loader de fichier qui semble solide (100% asm). La seule méthode qui nous intéresse est LoadFileTo qui charge un fichier à une adresse mémoire donnée.
- soundbs.h/.c et macros.h : l'API proprement dite (voir partie III).
Il y a enfin le "main", mod3.c, ou j'ai fait le principal de mon travail, à savoir nettoyer et virer tout ce qui était inutile. Le programme s'explique de lui même je pense, si on est familier avec newcc65 en tout cas.
Compilez et linkez tous ces fichiers, et le tour est joué.
PARTIE III : l'API soundbs
Rien de sorcier ici. Enfin si le code l'est quand même un peu, mais bonne nouvelle on peut se contenter d'utiliser les 3 fonctions exportées, à savoir SndInit(), SndStart() et enfin SndStop(). Mais avant de pouvoir utiliser l'API il faut d'abord charger le code à l'adresse reservée. Pour jouer un mod, le code ressemblera donc toujours à ca :
// Charge le fichier "fileId" à une adresse définie pour Chipper (0x8000 ici), initialise soundbs avec le mod chargé ensuite
LoadFileTo(fileId, CHIPPER_ADDRESS);
SndInit();
// No comment
SndStart();
// No comment non plus ^^
SndStop();
La seule subtilité restante, c'est donc cette fameuse adresse mémoire. En fait, on peut charger le mod où on veut mais on doit définir une adresse statiquement et il n'est pas possible d'en changer durant l'exécution du programme. Personnellement, comme je ne pense pas utiliser le buffer de collision, je charge mes mods à partir de 0xa000. Une fois une adresse choisie, il faut encore la mettre à jour à TROIS emplacements différents :
1) dans le fichier "my_tune.asm", mettez à jour la ligne "run $8000"
2) dans le fichier soundbs.c, aux alentours de la ligne 220, soit dans le corps de la fonction SndStart, il faut mettre à jour les 8 adresses mémoire, en prenant bien garde à l'incrément. Dans mon exemple on aurait donc $a000, puis $a001 sur la seconde ligne, etc.
3) Enfin, il faut donner cette adresse lors de l'appel à LoadToFile
Et voilà !
Note : je relirais demain, j'ai peut-être et même surement zappé des trucs vu l'heure ^^