Ce programme prend en argument le nom du fichier qui servira de source à la création d'un fichier musical de type wav et le nom de ce dernier, le fichier wav.wav sera créé à défaut de fournir un deuxième argument.
Je me suis inspiré d'un vidéo sur YouTube où on pouvait entendre le programme mspaint de Windows 7 pour faire ce programme. C'est à dire que les fichiers wav créés sont 8 bits, stéréo et 22050 Hertz.
Les informations sur le header sont disponibles sur Wikipedia.
Source / Exemple :
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[])
{
char *rawname = NULL;
if(argc > 1)
{
rawname = malloc(strlen(argv[1])*sizeof(char));
if(rawname == NULL)
{
printf("Dynamic memory allocation failed.\n");
return -1;
}
strcpy(rawname, argv[1]);
}
else
{
printf("wav [RawFile]\n");
return -1;
}
FILE * raw = NULL;
raw = fopen(rawname, "rb+");
if(raw == NULL)
{
printf("File \"%s\" not found.\n", rawname);
return -1;
}
free(rawname);
char *wavname;
if(argc > 2)
{
wavname = malloc(strlen(argv[2])*sizeof(char));
strcpy(wavname, argv[2]);
}
else
{
wavname = malloc(strlen("wav.wav")*sizeof(char));
strcpy(wavname, "wav.wav");
}
FILE * wav = NULL;
wav = fopen(wavname, "wb");
if(wav == NULL)
{
printf("%s creation failed.\n", wavname);
return -1;
}
fseek(raw, 0 , SEEK_END);
int wavsize = ftell(raw);
printf("wavsize = %d bits (%.0f kb)\n", wavsize+44, (float)(wavsize+44)/1024);//taille des donnees + header
char RIFF[4] = {'R','I','F','F'}; //0x52,0x49,0x46,0x46
int FileSize = wavsize+44-8; // 44 bits pour le header - 8 bits
char WAVE[4] = {'W','A','V','E'}; //0x57,0x41,0x56,0x45
char fmt[4] = {'f','m','t',' '}; //0x66,0x6D, 0x74,0x20
int BlocSize = 0x10 ; //size of WAVE section chunck
short AudioFormat = 0x01 ; //2 octets, WAVE type format
short NbrCanaux= 0x02 ; //2 octets, mono (0x01) or stereo (0x02)
int Frequence = 0x5622; // 4 octets, 22050(Hertz)
int BytePerSec;// 4 octets
short BytePerBloc; // 2 octets
short BitsPerSample = 0x8; // 2 octets, 8-16-24
BytePerBloc = NbrCanaux * (BitsPerSample/8);
BytePerSec = Frequence * (int)BytePerBloc;
char data[4] = {'d','a','t','a'};
int DataSize = wavsize;
/* DATA[] [Octets du Sample 1 du Canal 1] [Octets du Sample 1 du Canal 2] */
fwrite(RIFF, 1, 4, wav);
fwrite(&FileSize, 4, 1, wav);
fwrite(WAVE, 1, 4, wav);
fwrite(fmt , 1, 4, wav);
fwrite(&BlocSize, 4, 1, wav);
fwrite(&AudioFormat, 2, 1, wav);
fwrite(&NbrCanaux,2,1, wav);
fwrite(&Frequence, 4, 1, wav);
fwrite(&BytePerSec, 4, 1, wav);
fwrite(&BytePerBloc, 2, 1, wav);
fwrite(&BitsPerSample, 2, 1, wav);
fwrite(data, 1, 4, wav);
fwrite(&DataSize, 4, 1, wav);
fseek(raw, 0, SEEK_SET);
printf("Creating %s...\n", wavname);
/*//Premier algorithme de copie
int i;
for(i = 0; i < FileSize; i++)
{
//printf("\r%d%c",(i*100)/FileSize,'%');
fread(&p, 1, 1, raw);
fwrite(&p, 1, 1, wav);
}
/* */
/*//Deuxieme algorithme de copie
int read = 0;
char buffer[512];
while ((read = fread(buffer, 1, 512, raw)) != 0)
fwrite(buffer, 1, read, wav);
/* */
//*//Troisieme algorithme de copie, le plus rapide (etrangement)
char *p = malloc(wavsize*sizeof(char));
if(p == NULL)
{
printf("Dynamic memory allocation failed.\n");
return -1;
}
fread(p, 1, wavsize, raw);
fwrite(p, 1, wavsize, wav);
/* */
printf("%s created.\n", wavname);
free(p);
free(wavname);
fclose(raw);
fclose(wav);
return 0;
}
Conclusion :
Les résultats sont (pour mes gouts musicaux) intéressants. mspaint.exe pourrait, avec explorer.exe et SHELL32.dll, faire partie de l'album du Best Of de Windows. (Pas génial pour des fichiers trop denses comme des bmp ou des txt.)
Laissez-moi vos commentaires et amusez-vous.
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.