Génération de fichier .wav

Contenu du snippet

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.

A voir également

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.