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 (); } } }
(609)