Génération de fichier .wav

Soyez le premier à donner votre avis sur cette source.

Snippet vu 3 872 fois - Téléchargée 18 fois

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

Ajouter un commentaire

Commentaires

seoseo
Messages postés
12
Date d'inscription
samedi 20 mars 2010
Statut
Membre
Dernière intervention
23 janvier 2012
-
La coloration syntactique du code source laisse place à certaines ambiguïtés au niveau des commentaires. "Premier algorithme de copie [...]" et "Deuxieme algorithme de copie [...]" devraient être en commentaires. Je les ai laissés pour montrer les différences entre chaque algorithme que j'ai testé.
macsou01
Messages postés
45
Date d'inscription
mardi 20 mars 2007
Statut
Membre
Dernière intervention
28 juillet 2011
-
Bonjour,

Amusant comme programme. Je constate que la création d'un fichier WAV de base est une chose assez simple. J'ai essayé avec mspaint.exe et ça donne en effet un résultat assez étrange. Ça pourrait presque intéresser les amateurs de musique concrète :).
BunoCS
Messages postés
14568
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
19 août 2019
88 -
Why not...Attention toutefois à caster le retour de la méthode malloc
seoseo
Messages postés
12
Date d'inscription
samedi 20 mars 2010
Statut
Membre
Dernière intervention
23 janvier 2012
-
Effectivement, les fichiers wav, comme les bmp, ne sont pas compressés, ce qui rend leur utilisation très simple. Les fichiers avec des ressources, shell32.dll, certains exécutables, donnent en général des résultats autre que de la neige avec des passages qui se répètent.
seoseo
Messages postés
12
Date d'inscription
samedi 20 mars 2010
Statut
Membre
Dernière intervention
23 janvier 2012
-
Caster le retour de malloc n'est pas vraiment nécessaire dans le contexte. La plupart des compilateurs castent automatiquement l'adresse de retour pour la mettre dans le bon type.

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.