Bonjour,
je suis actuellement en stage et je dois absolument pouvoir créer un son a partir de fréquences données. J'ai évidemment cherché partout sur le site mais sans succès en C#. Donc j'ai récupéré un tuto sur la création de son en VB mais ma traduction en C# ne doit pas être bonne car le fichier créé est illisible.
Donc je vous copie le code de la procédure qui crée le fichier wav et si vous pouviez m'aider à le débugger j'en serais heureux. Merci d'avance.
public class Class1
{
BinaryWriter bw = null;
BinaryReader br = null;
private long Freq_E = 44100;
private int Bit_16 = 16;
private long fmt = 16;
private int Mono = 1;
private int PCM_Format = 1;
private int blockAlign = 2;
private double Pi = Math.PI*2;
public Class1()
{
//
// TODO : ajoutez ici la logique du constructeur
//
}
public void create()
{
byte[] buffer = new byte[512];
byte[] buffer2;
//ArrayList buffer = new ArrayList();
int compteur; //Variable de comptage pour l'état du buffer
long t=0; //Temps total
long longueur; //longueur du son en échantillons
double FreqBip1; //en Hz
double FreqBip2; //en Hz
double FreqBip3; //modulation de phase en Hz
double Qte; //amplitude de la modulation de phase
int Volume; //entre 0 et 32767
double tmpFreq; //variables temporaires
double TmpDbl;
long tmpLong;
//Valeurs a ajuster par l'utilisateur
FreqBip1 = 1200;
FreqBip2 = 200;
FreqBip3 = 10;
Qte = 3;
longueur = 88200;
Volume = 5000;
FreqBip1 = FreqBip1 / Freq_E; //calcul des frequence à l'échelle de l'échantillon
FreqBip2 = FreqBip2 / Freq_E;
FreqBip3 = FreqBip3 / Freq_E;
TmpDbl = (FreqBip2 - FreqBip1) / (2 * longueur); //calcul du pas pour la fréquence
if (!File.Exists("test.wav"))
{
// Le fichier n'existe pas. On le crée
bw = new BinaryWriter(File.Create("test.wav"));
}
else
{
File.Delete("test.wav");
bw = new BinaryWriter(File.Create("test.wav"));
}
//En tête
WriteChars(bw,"RIFF");
tmpLong = longueur * 2 + 36;
bw.Write((int)tmpLong);
WriteChars(bw,"WAVEfmt ");
bw.Write((int)fmt);
bw.Write((int)PCM_Format);
bw.Write((int)Mono);
bw.Write((int)Freq_E);
tmpLong = Freq_E * (Bit_16 / 8) * Mono;
bw.Write((int)tmpLong);
bw.Write((int)blockAlign);
bw.Write((int)Bit_16);
WriteChars(bw,"data");
tmpLong = longueur * 2;
bw.Write(tmpLong);
//Fin en tête
do
{
compteur = 0;
do
{
tmpFreq = Pi * (FreqBip1 + t * TmpDbl); //calcul de la frequence du son a produire
buffer[compteur]=(byte)((Volume * Math.Sin(t * tmpFreq + (Qte * Math.Sin(Pi * t * FreqBip3)))));
t++;
compteur = compteur + 1;
}while( t < longueur && compteur < 512);
if(t == longueur)
{
buffer2 = new byte[compteur - 1];
for(int j=0;j<compteur-1;j++)
{
buffer2[j] = buffer[j];
}
bw.Write(buffer2);
}
else
{
bw.Write(buffer);
}
}while(t != longueur);
bw.Close();
buffer = null;
MessageBox.Show("Emplacement du fichier :" + "test.wav");
}
La procédure WriteChars fut récupérée de MSDN et permet d'écrire chaque caractère de la string passée en paramètre avec le BinaryWriter.
Lorsque j'essaie de le lire avec Windows Media Player (il faut que ca marche avec celui la) il me dit que le format est incorrect.
Si vous avez en plus des idées pour faire ressortir une représentation spectrale du son dans le temps, je suis preneur ^^
Voila c'est tout.
Vive la Vie !!!