SONS - OpenMMO/openMMO GitHub Wiki

##Format des fichiers snmci., snmcf. et snmcd._

Sur cette page vous seront exposés tous les algorithmes et les constantes nécessaires à la programmation de votre propre éditeur de sons.

##Contenu des fichiers ._

Le fichier snmci._ contient la liste des sont ainsi que les infos propres à chaque son ou musique, le fichier snmcf._ contient les sons (.mp3), le fichier snmcd._ contient les musiques (.wav).

##Structures pour chaque fichier ._

###Structures pour le fichier snmci._

unsignef long  nbsound;
typedef struct
{
   unsigned char  lg_name;
   char           name[];
   unsigned long  start;
   unsigned long  size;
   unsigned short samplerate;
   unsigned char  bit_depth;
   unsigned char  format;
   char *         data;
} LISTINFO, *LPLISTINFO;

###Structures pour les sons contenus dans les fichiers snmcf._ et snmcd._

typedef struct
{
   unsigned char  riff_tag[4];
   unsigned long  lg_chunkndata;
   unsigned char  wave_tag[4];
   unsigned char  fmt_tag[4];
   unsigned long  lg_fmt;
   short          wFormat_tag;
   short          wChannels;
   unsigned long  dwSamplesPerSec;
   unsigned long  dwAvgBytesPerSec;
   short          wBlockAlign;
   short          dwbitpersample;
   unsigned char  data_tag[4];
   unsigned long  lg_data;
} SOUNDHEADER, *LPSOUNDHEADER;

##Exemple de chargement des sons

###Exemple en pascal pou changer

procedure loadsound();
	var lg_name : byte;
begin
	blockread(ficlist, nbsound, 4);
	setlength(list, nbsound);
	for i := 0 to nbsound - 1 do
		begin	
			blockread(ficlist, lg_name, 1);
			setlength(list[i].name, lg_name);
			blockread(ficlist, list[i].name[1], lg_name);
			blockread(ficlist, list[i].start, 4);
			blockread(ficlist, list[i].size, 4);
			blockread(ficlist, list[i].samplerate, 2);
			BlockRead(ficlist, list[i].bit_depth, 1);
			BlockRead(ficlist, list[i].format, 1);
			setlength(list[i].data, size);
			if (format = 1) then blockread(ficwave, list[i].data[0], size)
			else blockread(ficmp3, list[i].data[0], size);
		end;
end;

##Exemple de chargement des entêtes des sons

###Exemple en pascal

procedure extract(numsound : integer);
	var
		f : file;
begin
	if (list[numsound].format = 1) then
		begin
			soundheader.riff_tag := 'RIFF';
			soundheader.lg_chunkndata := list[numsound].size + 36;
			soundheader.wave_tag := 'WAVE';
			soundheader.fmt_tag := 'fmt';
			soundheader.lg_fmt := 16;
			soundheader.wFormat_tag := 1;
			soundheader.wChannels := 1;
			soundheader.dwSamplesPerSec := list[numsound].samplerate;
			soundheader.dwAvgBytesPerSec := list[numsound].samplerate * (list[numsound].BitDepth div 8);
			soundheader.dwbitpersample := list[numsound].bit_depth;
			soundheader.wBlockAlign := :=(soundheader.dwbitpersample div 8) * soundheader.wChannels;
			soundheader.data_tag := 'data';
			soundheader.lg_data := list[numsound].size;
			assignfile(f, list[numsound].name + '.wav');
			rewrite(f, 1);
			blockwrite(f, soundheader, sizeof(soundheader));
			blockwrite(f, list[numsound].data[0], length(list[numsound].data));
			closefile(f);
		end
	else
		begin
			assignfile(f, list[numsound].name +'.mp3');
			rewrite(f,1);
			blockwrite(fic,list[numsound].data[0], length(list[numsound].data));
			closefile(fic);
		end;
end;