Utiliser la bibliothèque MikMod sous C++Builder

Cet article vous expliquera comment compiler la bibliothèque MikMod sous forme de bibliothèque statique (.lib) que vous pourrez intégrer directement dans un programme fait avec C++Builder. Tout d’abord, MikMod est une bibliothèque de programmes codée en langage C qui sert à faire jouer des fichiers module. Cela inclut les fichiers MOD (15 et 31 instruments), S3M (ScreamTracker 3), IT (Impulse Tracker) et XM (FastTracker 2).

La première étape consiste à aller télécharger le code source de la bibliothèque logicielle sur le site Web officiel. Il se trouve dans la section Files de la page. C’est le fichier libmikmod-3.2.0-beta2.zip qui sera utilisé. Il est a noter qu’une version plus récente du code est disponible par CVS sur le site Web de SourceForge.

Une fois le téléchargement terminé, il faut extraire les données dans un dossier que l’on nommera MikMod. Dans C++Builder nous allons créer le nouveau projet en allant dans File / New / Other…. La touche de raccourcis Ctrl+N aurait pu être utilisée. Puis, on sélectionne Static Library et on clique sur OK. Maintenant, nous pouvons sauvegarder notre projet. Pour cela, on va dans File et on sélectionne Save Project As… On choisit comme nom de projet MikMod pour que le fichier lib porte ce nom. L’emplacement du fichier cbproj doit être dans le dossier où les données on été extraites.

Il faut ajouter les fichiers .c au projet.

  • Pour le dossier drivers: "drv_stdout.c" "drv_wav.c" "drv_win.c" "drv_ds.c" "drv_nos.c" "drv_raw.c"
  • Pour le dossier loaders, on sélectionne tous les fichiers.
  • Pour le dossier mmio, on sélectionne tous les fichiers.
  • Pour le dossier playercode, on sélectionne tous les fichiers.

Étant donné que seulement les fichiers .c ont été ajoutés au projet, il manque les chemins d’accès pour certains fichiers .h. Il faut donc aller dans Project / Options… ou Alt+F7. Dans Include path on ajoute: win32\;include\;
Ensuite, dans Conditional defines, on ajoute ceci: WIN32;DRV_WIN;HAVE_FCNTL_H;HAVE_MALLOC_H;HAVE_LIMITS_H;__STDC__=1
Par la suite, on quitte la fenêtre d’option, on choisit la configuration Release et on compile le code. Il se peut qu’il y ait plusieurs avertissements lors de la compilation, mais cela n’empêchera pas le code de fonctionner correctement. Le fichier MikMod.lib devrait être créé dans le dossier Release.

Afin de valider les étapes précédentes, il va falloir créer un nouveau projet indépendant pour être certain que la bibliothèque fonctionnera peu importe l’emplacement du projet. Dans cette nouvelle application VCL, on ajoute un contrôle TTimer et on met la propriété Interval à 100ms. Par la suite, on ajoute au projet les fichiers mikmod_build.h et MikMod.lib.

Dans le constructeur de la Form, on ajoute le code suivant:

// Enregistrement de la bibliothèque
MikMod_RegisterDriver(&drv_win);
MikMod_RegisterAllLoaders();

// Initialise la bibliothèque
if(MikMod_Init(""))
{
    throw(Exception("L'initialisation de MikMod a échouée."));
}
else
{
    // Charge le module
    AnsiString FileName = "..\\music.s3m";
    module = Player_Load(FileName.c_str(), 32, 0);
    if(module)
    {
        module->wrap = true;    // Recommence lorsqu'il finit
        Player_Start(module);   // Démarre la musique
    }
    else
    {
        throw(Exception("Le fichier n'a pu être chargé."));
    }
}

C’est le pilote pour l’API multimédia de Windows qui est chargé à la ligne 2. On aurait aussi pu utiliser drv_ds pour que le son soit pris en charge par DirectSound. Par contre, si l’on décide de faire ce choix, il va falloir ajouter DRV_DS à la liste des Conditional defines. En plus, il est nécessaire d’ajouter le fichier dsound.lib au projet pour accéder aux fonctions l’API de DirectSound. Si vous êtes intéressé à générer un fichier wav plutôt que de lire un fichier audio, alors c’est le pilote drv_wav qu’il faut utiliser.

À la ligne 13, on trouve la variable FileName, on doit lui affecter le chemin du fichier module que l’on veut faire jouer.

Dans le destructeur, on arrête la musique et on libère la mémoire avec le code suivant:

Timer1->Enabled = false;
if(module)
{
    Player_Stop();
    Player_Free(module);
    MikMod_Exit();
}

Dans l’évènement OnTimer du TTimer, on ajoute ceci:

if(module && Player_Active())
{
    MikMod_Update();
}

La fonction MikMod_Update doit être appelée sur une base régulière, car elle sert à remplir la mémoire tampon de la sortie audio.

Si vous êtes intéressé à aller un peu plus loin, vous pouvez ajouter un contrôle TTrackBar au projet auquel les propriétés Max et Position devront être initialisées à 128. Dans l’évènement OnChange, ajoutez le code suivant:

   	Player_SetVolume(TrackBar1->Position);

Un contrôle de volume est maintenant disponible dans votre logiciel.

Si vous êtes à la recherche de pièces musicales, je vous conseille d’aller faire un tour sur le site Web The Mod Archive.

À présent, vous avez tout ce qu’il faut pour inclure de la musique à vos applications.