ecrire un programme wavtomidi en c#

ecrire un programme wavtomidi en c#

Par Ettougourti Mohamed Ali

 si nous voulons écrire un programme simple en c# pour convertir 
un fichier wav en midi nous devons commencer par 
 1- identifier la source audio.
fichier audio préalablement crée et enregistré ou au contraire une conversion en temps réel au fur et à mesure de la progression du son.
2-identifier le procédé de transformation du son.
autocorrélation , fast fourrier transform ou fft , cepstrum,
etc..
3- écrire les résultats dans un fichier midi.

pour écrire notre programme nous avons fait les choix suivants:
-utiliser des fichiers wav enregistrés préalablement.
-utiliser l'autocorrélation pour convertir le son en fréquences.

nous aurons donc besoin de routines pouvant traiter les différentes parties composant notre programme.

-lire un fichier wave
-transformer les données audio en fréquences.
-convertir les fréquences en notes musicales.
1 étape : lire un fichier wav:
Nous commençons par définir sur un formulaire 5 labels pour recevoir respectivement le nom du fichier wav sélectionné,
  le taux d'echantillonnage , le nombre de bits par sample : 8,16,24, 32.
le nombre de canaux :1  pour mono , 2 pour stéréo.
un 4 label pour déterminer la durée du morceau.
sur ce même formulaire nous ajoutons un menu avec une premiére commande :ouvrir fichier wav.
nous définissons enfin une fonction privée void dont le nom est ouvrirFichierWavToolStripMenuItem, fonction générée automatiquement par le visual studio.

et dont voici le listing
private void ouvrirFichierWavToolStripMenuItem_Click(object sender, EventArgs e)
        {
System.IO.FileStream s; byte[] buf; int fs; int bit; int channel; int fsize; int fsize2; int fsize3; float duree;
            OpenFileDialog op;
/* créer et configurer la boite de dialogue ouvrir fichier */
           op = new OpenFileDialog();  
            op.DefaultExt = "wav"; 
            op.FileName = "*.wav";
            op.InitialDirectory = "c:\\wave\\";
/*remplacer le repertoire par votre repertoire wav */
//afficher la boite de dialoge ouvrir fichier
            op.ShowDialog();
/*instancier le buffer de réception de l’entête du fichier wav en buf */
            buf = new byte[44];
/* créer le flux fichier s en récupérant le nomdu fichier sélectionné */
             s = new System.IO.FileStream(op.FileName , 
System.IO.FileMode.Open);
*/ lire l’entête les 44 premiers bits */
            s.Read(buf, 0, 44);
/* taux d’échantillonnage */
            fs = BitConverter.ToInt16(buf, 24);
/*nombre de canaux */
            channel = buf[22];
/* nombre de bits par sample */
            bit = buf[34];
/* taille du fichier en utilisant la fonction Seek */
             fsize = (int) s.Seek(0, System.IO.SeekOrigin.End);
/* 2 methode pour obtenir la taille du fichier en lisant les 4 premiers bits */
             fsize2 = BitConverter.ToInt32(buf, 4);
/* 3 methode pour obtenir la taille du fichier en lisant les derniers 4 bits */
             fsize3 = BitConverter.ToInt32(buf, 40);
/* récupérer la durée du son audio en divisant la taille du fichier par le taux d’echantillonnage multiplé par le nombre de bits par sample et par le nombre de canaux */
            duree = fsize3 / (fs *bit/8*channel);
/* convertir la durée en minutes */
            duree /= 60;
/* fermer le flux */
            s.Close();
/* afficher les paramétres du fichier audio sur le formulaire */
/* afficher les résultats obtenus */
            label1.Text = op.FileName ;
            label2.Text = "frequency sampling  "+ fs.ToString();
            label3.Text ="bit  "+ bit.ToString ();
            label4.Text ="channel  "+ channel.ToString ();
            label5.Text ="duree  "+ duree .ToString ();
        }
        }
    }

(597)