<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
	<id>https://t4ctech.hyperion-roleplay.com/index.php?action=history&amp;feed=atom&amp;title=Fichiers_SONS</id>
	<title>Fichiers SONS - Historique des versions</title>
	<link rel="self" type="application/atom+xml" href="https://t4ctech.hyperion-roleplay.com/index.php?action=history&amp;feed=atom&amp;title=Fichiers_SONS"/>
	<link rel="alternate" type="text/html" href="https://t4ctech.hyperion-roleplay.com/index.php?title=Fichiers_SONS&amp;action=history"/>
	<updated>2026-07-10T05:46:55Z</updated>
	<subtitle>Historique des versions pour cette page sur le wiki</subtitle>
	<generator>MediaWiki 1.40.1</generator>
	<entry>
		<id>https://t4ctech.hyperion-roleplay.com/index.php?title=Fichiers_SONS&amp;diff=24&amp;oldid=prev</id>
		<title>FunJp : Page créée avec « == 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 ... »</title>
		<link rel="alternate" type="text/html" href="https://t4ctech.hyperion-roleplay.com/index.php?title=Fichiers_SONS&amp;diff=24&amp;oldid=prev"/>
		<updated>2016-02-25T21:54:49Z</updated>

		<summary type="html">&lt;p&gt;Page créée avec « == 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 ... »&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nouvelle page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== Format des fichiers snmci._, snmcf._ et snmcd._ ==&lt;br /&gt;
Sur cette page vous seront exposés tous les algorithmes et les constantes nécessaires à la programmation de votre propre éditeur de sons.&lt;br /&gt;
== Contenu des fichiers ._ ==&lt;br /&gt;
Le fichier snmci._ contient une liste récapitulative des sons se trouvant dans les fichiers snmcf._ et snmcd._ ainsi que plusieurs informations les concernant permettant au client T4C de pouvoir les comprendre (comme par exemple à quel offset débute un son, sa taille, sa fréquence d’échantillonnage, etc...).&lt;br /&gt;
&lt;br /&gt;
Le fichier snmcd._ contient les sons compressés au format .mp3, plus précisément; toutes les musiques du jeu (au nombre de 7 dans le client T4C 1.50 d&amp;#039;origine).&lt;br /&gt;
&lt;br /&gt;
Le fichier snmcf._ contient les sons non-compressés au format .wav, plus précisément; tous les sons d&amp;#039;ambiance du jeu (coup d&amp;#039;épée, mort d&amp;#039;un monstre, etc...) (au nombre de 143 dans le client T4C 1.50 d&amp;#039;origine).&lt;br /&gt;
== Format des fichiers ==&lt;br /&gt;
=== Structure du fichier snmci._ ===&lt;br /&gt;
&amp;#039;&amp;#039;En C:&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;unsignef long  nbsound;&lt;br /&gt;
typedef struct&lt;br /&gt;
{&lt;br /&gt;
   unsigned char  lg_name;&lt;br /&gt;
   char           name[];&lt;br /&gt;
   unsigned long  start;&lt;br /&gt;
   unsigned long  size;&lt;br /&gt;
   unsigned short samplerate;&lt;br /&gt;
   unsigned char  bit_depth;&lt;br /&gt;
   unsigned char  format;&lt;br /&gt;
   char *         data;&lt;br /&gt;
} LISTINFO, *LPLISTINFO;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;En C#:&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public class SoundInfo&lt;br /&gt;
{&lt;br /&gt;
	public byte length_name;&lt;br /&gt;
	public string name;&lt;br /&gt;
	public int start;&lt;br /&gt;
	public int size;&lt;br /&gt;
	public ushort sample_rate;&lt;br /&gt;
	public byte bit_depth;&lt;br /&gt;
	public byte format;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Structure du fichier snmcd._ ===&lt;br /&gt;
Le fichier snmcd._ ne contient que les données des musiques du jeu juxtaposées les unes derrière les autres. Voici un exemple.&lt;br /&gt;
&lt;br /&gt;
* Outdoors Music.mp3 débute à l&amp;#039;offset 0x00000000, dont la taille fait 0x0015f87d.&lt;br /&gt;
* Dungeons Music.mp3 débute à l&amp;#039;offset 0x0015f87d, dont la taille fait 0x00190829.&lt;br /&gt;
* Forest Music.mp3 débute à l&amp;#039;offset 0x002f00a6, dont la taille fait 0x00137fd6.&lt;br /&gt;
&lt;br /&gt;
Il est très simple d&amp;#039;extraire ces fichiers mp3 et de les enregistrer directement sur fichier portant l&amp;#039;extension .mp3.&lt;br /&gt;
=== Structure du fichier snmcf._ ===&lt;br /&gt;
Le fichier snmcf._ ne contient que les données des musiques d&amp;#039;ambiance du jeu juxtaposées les unes derrière les autres au format wave. Le format wave est un format propriétaire Windows très répandu possédant un header permettant d&amp;#039;être compris par un lecteur musical.&lt;br /&gt;
&lt;br /&gt;
Explications sur le format Wave 1&lt;br /&gt;
Explications sur le format Wave 2&lt;br /&gt;
Explications sur le format Wave 3&lt;br /&gt;
&lt;br /&gt;
Pour extraire les musiques d&amp;#039;ambiance, il faudra reconstruire l&amp;#039;header du fichier wave et lui coller les données sonores derrière.&lt;br /&gt;
Voici la structure de l&amp;#039;header wave, dont la taille est de 44 octets.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;En C:&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;typedef struct&lt;br /&gt;
{&lt;br /&gt;
   unsigned char  riff_tag[4];&lt;br /&gt;
   unsigned long  lg_chunkndata;&lt;br /&gt;
   unsigned char  wave_tag[4];&lt;br /&gt;
   unsigned char  fmt_tag[4];&lt;br /&gt;
   unsigned long  lg_fmt;&lt;br /&gt;
   short          wFormat_tag;&lt;br /&gt;
   short          wChannels;&lt;br /&gt;
   unsigned long  dwSamplesPerSec;&lt;br /&gt;
   unsigned long  dwAvgBytesPerSec;&lt;br /&gt;
   short          wBlockAlign;&lt;br /&gt;
   short          dwbitpersample;&lt;br /&gt;
   unsigned char  data_tag[4];&lt;br /&gt;
   unsigned long  lg_data;&lt;br /&gt;
} SOUNDHEADER, *LPSOUNDHEADER;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;En C#:&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public class SoundHeader&lt;br /&gt;
{&lt;br /&gt;
	public char[] riff_tag = new char[4];&lt;br /&gt;
	public int length_chunkndata;&lt;br /&gt;
	public char[] wave_tag = new char[4];&lt;br /&gt;
	public char[] fmt_tag = new char[4];&lt;br /&gt;
	public int lg_fmt;&lt;br /&gt;
	public short wFormat_tag;&lt;br /&gt;
	public short wChannels;&lt;br /&gt;
	public int dwSamplesPerSec;&lt;br /&gt;
	public int dwAvgBytesPerSec;&lt;br /&gt;
	public short wBlockAlign;&lt;br /&gt;
	public short dwbitpersample;&lt;br /&gt;
	public char[] data_tag = new char[4];&lt;br /&gt;
	public int length_data;&lt;br /&gt;
&lt;br /&gt;
	public SoundHeader ()&lt;br /&gt;
	{&lt;br /&gt;
		riff_tag = &amp;quot;RIFF&amp;quot;.ToCharArray();&lt;br /&gt;
		wave_tag = &amp;quot;WAVE&amp;quot;.ToCharArray();&lt;br /&gt;
		fmt_tag = &amp;quot;fmt &amp;quot;.ToCharArray();&lt;br /&gt;
		data_tag = &amp;quot;data&amp;quot;.ToCharArray();&lt;br /&gt;
		lg_fmt = 16;&lt;br /&gt;
		wFormat_tag = 1;&lt;br /&gt;
		wChannels = 1;&lt;br /&gt;
	}&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Exemple de chargement des sons ==&lt;br /&gt;
=== Exemple en pascal ===&lt;br /&gt;
&amp;lt;pre&amp;gt;procedure loadsound();&lt;br /&gt;
	var lg_name : byte;&lt;br /&gt;
begin&lt;br /&gt;
	blockread(ficlist, nbsound, 4);&lt;br /&gt;
	setlength(list, nbsound);&lt;br /&gt;
	for i := 0 to nbsound - 1 do&lt;br /&gt;
		begin	&lt;br /&gt;
			blockread(ficlist, lg_name, 1);&lt;br /&gt;
			setlength(list[i].name, lg_name);&lt;br /&gt;
			blockread(ficlist, list[i].name[1], lg_name);&lt;br /&gt;
			blockread(ficlist, list[i].start, 4);&lt;br /&gt;
			blockread(ficlist, list[i].size, 4);&lt;br /&gt;
			blockread(ficlist, list[i].samplerate, 2);&lt;br /&gt;
			BlockRead(ficlist, list[i].bit_depth, 1);&lt;br /&gt;
			BlockRead(ficlist, list[i].format, 1);&lt;br /&gt;
			setlength(list[i].data, size);&lt;br /&gt;
			if (format = 1) then blockread(ficwave, list[i].data[0], size)&lt;br /&gt;
			else blockread(ficmp3, list[i].data[0], size);&lt;br /&gt;
		end;&lt;br /&gt;
end;&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Exemple en C# ===&lt;br /&gt;
&amp;lt;pre&amp;gt;byte[] snmci;&lt;br /&gt;
byte[] snmcd;&lt;br /&gt;
byte[] snmcf;&lt;br /&gt;
uint number_of_sounds;&lt;br /&gt;
List&amp;lt;SoundInfo&amp;gt; Sounds;&lt;br /&gt;
&lt;br /&gt;
public void LoadSounds ()&lt;br /&gt;
{&lt;br /&gt;
	int file_position = 0;&lt;br /&gt;
&lt;br /&gt;
	try&lt;br /&gt;
	{&lt;br /&gt;
		snmci = File.ReadAllBytes(&amp;quot;snmci._&amp;quot;);&lt;br /&gt;
		snmcd = File.ReadAllBytes(&amp;quot;snmcd._&amp;quot;);&lt;br /&gt;
		snmcf = File.ReadAllBytes(&amp;quot;snmcf._&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
	catch&lt;br /&gt;
	{&lt;br /&gt;
		// error message&lt;br /&gt;
		Environment.Exit(0);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	number_of_sounds = BitConverter.ToUInt32(snmci, file_position); file_position += 4;&lt;br /&gt;
&lt;br /&gt;
	Sounds = new List&amp;lt;SoundInfo&amp;gt;();&lt;br /&gt;
	for (int i = 0; i &amp;lt; number_of_sounds; i++)&lt;br /&gt;
	{&lt;br /&gt;
		SoundInfo sound = new SoundInfo();&lt;br /&gt;
		sound.length_name = snmci[file_position]; file_position += 1;&lt;br /&gt;
		sound.name = Encoding.Default.GetString(snmci, file_position, sound.length_name); file_position += sound.length_name;&lt;br /&gt;
		sound.start = BitConverter.ToInt32(snmci, file_position); file_position += 4;&lt;br /&gt;
		sound.size = BitConverter.ToInt32(snmci, file_position); file_position += 4;&lt;br /&gt;
		sound.sample_rate = BitConverter.ToUInt16(snmci, file_position); file_position += 2;&lt;br /&gt;
		sound.bit_depth = snmci[file_position]; file_position += 1;&lt;br /&gt;
		sound.format = snmci[file_position]; file_position += 1;&lt;br /&gt;
		Sounds.Add(sound);&lt;br /&gt;
	}&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Exemple d&amp;#039;extraction des sons ==&lt;br /&gt;
=== Exemple en pascal ===&lt;br /&gt;
&amp;lt;pre&amp;gt;procedure extract(numsound : integer);&lt;br /&gt;
	var&lt;br /&gt;
		f : file;&lt;br /&gt;
begin&lt;br /&gt;
	if (list[numsound].format = 0) then&lt;br /&gt;
		begin&lt;br /&gt;
			soundheader.riff_tag := &amp;#039;RIFF&amp;#039;;&lt;br /&gt;
			soundheader.lg_chunkndata := list[numsound].size + 36;&lt;br /&gt;
			soundheader.wave_tag := &amp;#039;WAVE&amp;#039;;&lt;br /&gt;
			soundheader.fmt_tag := &amp;#039;fmt&amp;#039;;&lt;br /&gt;
			soundheader.lg_fmt := 16;&lt;br /&gt;
			soundheader.wFormat_tag := 1;&lt;br /&gt;
			soundheader.wChannels := 1;&lt;br /&gt;
			soundheader.dwSamplesPerSec := list[numsound].samplerate;&lt;br /&gt;
			soundheader.dwAvgBytesPerSec := list[numsound].samplerate * (list[numsound].BitDepth div 8);&lt;br /&gt;
			soundheader.wBlockAlign := (list[numsound].bit_depth div 8) * soundheader.wChannels;&lt;br /&gt;
			soundheader.dwbitpersample := list[numsound].bit_depth;&lt;br /&gt;
			soundheader.data_tag := &amp;#039;data&amp;#039;;&lt;br /&gt;
			soundheader.lg_data := list[numsound].size;&lt;br /&gt;
&lt;br /&gt;
			assignfile(f, list[numsound].name + &amp;#039;.wav&amp;#039;);&lt;br /&gt;
			rewrite(f, 1);&lt;br /&gt;
			blockwrite(f, soundheader, sizeof(soundheader));&lt;br /&gt;
			blockwrite(f, list[numsound].data[0], length(list[numsound].data));&lt;br /&gt;
			closefile(f);&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		begin&lt;br /&gt;
			assignfile(f, list[numsound].name + &amp;#039;.mp3&amp;#039;);&lt;br /&gt;
			rewrite(f,1);&lt;br /&gt;
			blockwrite(f, list[numsound].data[0], length(list[numsound].data));&lt;br /&gt;
			closefile(f);&lt;br /&gt;
		end;&lt;br /&gt;
end;&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Comment créer votre propre éditeur de sons ? ==&lt;br /&gt;
&lt;br /&gt;
Il est possible de programmer un éditeur de sons qui travaille exclusivement sur les fichiers snmci._, snmcf._ et snmcd._.&lt;br /&gt;
&lt;br /&gt;
Exemples d&amp;#039;éditeurs de sons (plus puissants que ceux de Vircom ou de Dialsoft):&lt;br /&gt;
* T4C Editeur de Sons (auteur Mestoph)&lt;br /&gt;
* T4C Sound Editor (auteur ChaotikMind)&lt;br /&gt;
* T4C Gustaf Sound Editor (auteur Gustaf)&lt;br /&gt;
* ...&lt;br /&gt;
--Mestoph 12 mars 2008 à 08:31 (UTC)&lt;br /&gt;
&lt;br /&gt;
--Gustaf 29 juillet 2008 à 16:49 (UTC) : Corrections et ajouts d&amp;#039;explications et de code en C#.&lt;/div&gt;</summary>
		<author><name>FunJp</name></author>
	</entry>
</feed>