85Fermer87
FadestLe 29/01/2008 à 09:42
Oulah, c'est vieux ce truc là.
Et ce n'est pas forcément la meilleure solution, car ça se basait sur des bruitages digits (et donc bouffait beaucoup de mémoire)
Le mieux je pense, ce serait d'utiliser ABCMusic, qui peut permettre de jouer des musiques, mais aussi en setupant bien l'instrument de faire des bruitages.
Je crois que Cooper avait pas mal creusé l'étude des parametres pour trouver lesquelks correspondaient à quel instrument.
Et il avait commencé à regarder pour faire un mod2ABC je crois aussi.

De mon coté, j'avais traduit un article écrit par Karri pour Revival à l'époque sur ABCMusic :

La librairie ABCMusic

Interlude musical pour cette initialisation à la programmation Lynx avec la présentation de la librairie ABCMusic.
ABCMusic est une librairie destinée à jouer de la musique simplement avec le kit BLL. Son auteur, Karri Kaksonnen, est finlandais et a bien voulu nous écrire un petit article expliquant comment utiliser sa librairie.

Utiliser ABCMusic par Karri Kaksonnen (traduit par Fadest)

J’ai créé un programme minimal.c qui utilise ma librairie abcmusic.m65. Il montre comment inclure des musiques sur 4 voies dans vos programmes en C en utilisant le module abcmusic.m65.


Voici la référence des commandes pour ABCMusic :
Contrôle des instruments :
On - octave n=0..6
Xn - XOR taps n=0..511
In - intergate n=0..1
Vn - volume n=0..127
Tn - durée n=0..255
Rn - Ramp (attack) n=0..127
Hn - Hold n=0..255
Kn - Kill (decay) n=0..127

Structure d’une piste
|: - début de section
: - repeat

Notes
CDEFGABcdefgabz - notes (z = silent)
Cn – joue la note C pour la durée n=2..4

Les espaces sont ignorés, Les codes d’instruments peut apparaître n’importe ou dans la chaîne de la musique. Donc, il est possible de changer d’instrument en cours de restitution.

Une musique est définie comme une chaîne ASCII :

char tune[]="O1 X7 I0 V66 T33 R60 H2 K3 |:CDEEDEFFEFGEFDGG:"

La musique est jouée par la commande abcmusic() qui reçoit en paramètre la voie ( de 0 à 3) et la musique.
Par exemple, la musique définit par tune[] sera jouée sur la voie 0 :
abcmusic(0, tune);


et un exemple de code donné par Karri :
/*
 * minimal.c by Karri Kaksonen
 *
 * This is a minimal application showing how abcmusic works in
 * for the Atari Lynx in C.
 */
#include <lynx.h>
#include <lynxlib.h>
#include <stdlib.h>

/* Routines defined in abcmusic.m65 */
extern void silence();
extern void abcmusic();
extern void update_music();

extern char abcmusic0[];
extern char abcmusic1[];
extern char abcmusic2[];
extern char abcmusic3[];

#asm
          xref _abcmusic0
          xref _abcmusic1
          xref _abcmusic2
          xref _abcmusic3

_abcmusic0  
            dc.b "O1X7I0V45T20R40H2K3" 
            dc.b "|:CDEEDEFFEFGEFDGG"
            dc.b "I1CDEEDEFFEFGEFDCC"
            dc.b "I0cBAABAGGAGFFEDEE"
            dc.b "cBAABAGGAGFFEDCC"
            dc.b "ECDDFDEEGEFGABcc"
            dc.b "ECDDFDEEGEFGABcc"
            dc.b "CDEEDEFFEFGEFDGG"
            dc.b "CDEEDEFFEFGEFDCC:"
            dc.b 0

_abcmusic1  
            dc.b "O2X7I0V45T20R80H8K1" 
            dc.b "|:C4D4E4F4"
            dc.b "C4D4E4F4"
            dc.b "c4B4A4E4"
            dc.b "c4B4A4E4"
            dc.b "E4F4G4A4"
            dc.b "E4F4G4A4"
            dc.b "C4D4E4F4"
            dc.b "C4D4E4F4:"
            dc.b 0

_abcmusic2  
            dc.b "O1X7I0V45T20R40H2K3" 
            dc.b "zzzzzzzz"
            dc.b "|:CDEEDEFFEFGEFDGG"
            dc.b "I1CDEEDEFFEFGEFDCC"
            dc.b "I0cBAABAGGAGFFEDEE"
            dc.b "cBAABAGGAGFFEDCC"
            dc.b "ECDDFDEEGEFGABcc"
            dc.b "ECDDFDEEGEFGABcc"
            dc.b "CDEEDEFFEFGEFDGG"
            dc.b "CDEEDEFFEFGEFDCC:"
            dc.b 0

_abcmusic3  
            dc.b "O2X7I0V45T20R80H8K1" 
            dc.b "z4z4z2"
            dc.b "|:C4D4E4F4"
            dc.b "C4D4E4F4"
            dc.b "c4B4A4E4"
            dc.b "c4B4A4E4"
            dc.b "E4F4G4A4"
            dc.b "E4F4G4A4"
            dc.b "C4D4E4F4"
            dc.b "C4D4E4F4:"
            dc.b 0

#endasm

uchar SCREEN1[8160]       at (0xfff8-2*8160); // screen 1
uchar SCREEN2[8160]       at (0xfff8-1*8160); // screen 2

char pal[]={
	0x00,0x00,0x01,0x05,0x08,0x0b,0x0e,0x00,0x02,0x00,0x03,0x07,0x0a,0x0d,0x0f,0x00,
	0x00,0xd0,0x11,0x55,0x88,0xbb,0xee,0x0d,0x22,0xf0,0x33,0x77,0xaa,0xdd,0xff,0x0f};
 
/*
  Using drawPending and swapping buffers in the interrupt
  creates a flicker-free display. Idea borrowed from Tom Schenks.
*/
char drawPending;

VBL() interrupt
{
    if (drawPending) {
        SwapBuffers();
        drawPending = 0;
    }
    update_music();
}

int main()
{
    InitIRQ();
    CLI;
    SetBuffers(SCREEN1, SCREEN2, 0);
    _SetRGB(pal);
    InstallIRQ(2,VBL);
    EnableIRQ(2);
    silence();
    abcmusic(0,abcmusic0);
    abcmusic(1,abcmusic1);
    abcmusic(2,abcmusic2);
    abcmusic(3,abcmusic3);
    while (1) ;
}



Il te manquera la librairie abcmusic.obj.
Je n'ai qu'une vieille version qui devrait faire l'affaire :
http://fadest.free.fr/DevLynx/ABCMUSIC.OBJ

Tu copies dans le répertoire OBJ de ton sous-projet, tu modifies Makelibr.bat pour que ce soit inclus dans ta librairie.



Et puis de toutes manières, vu la taille d'un lecteur MP3 et le confort que ça apporte (qualité du son + choix de sa musique préférée), je suis MP3 compliant maintenant gni

@GT : bah ouais, étonnant n'est ce pas. D'un autre coté, il parait que GT a déjà fait un jeu eek wink