Création fichier wav avec fréquences

Signaler
Messages postés
8
Date d'inscription
lundi 15 novembre 2004
Statut
Membre
Dernière intervention
15 octobre 2007
-
Messages postés
8
Date d'inscription
lundi 15 novembre 2004
Statut
Membre
Dernière intervention
15 octobre 2007
-
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 !!!

4 réponses

Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
36
Salut, faudrait voir comment est définie WriteChars, n'oublie pas que les chars en NET sont sur 2 octets.
Messages postés
8
Date d'inscription
lundi 15 novembre 2004
Statut
Membre
Dernière intervention
15 octobre 2007

private






void
WriteChars(BinaryWriter wrtr,

string
text){


   for
(

int
i = 0; i < text.Length; i++)   {


      byte
c = (

byte
)text[i];      wrtr.Write(c);

   }

}

Voila la définition de WriteChars ^^

Vive la Vie !!!
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
36
Ca écrit bien un seul octet..
Messages postés
8
Date d'inscription
lundi 15 novembre 2004
Statut
Membre
Dernière intervention
15 octobre 2007

J'ai également essayé avec
char c = (char)text[i];
ca n'a pas fonctionné pour autant...

Vive la Vie !!!