Génération de fichier .wav

Soyez le premier à donner votre avis sur cette source.

Snippet vu 4 037 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

C'est relatif aux besoins des utilisateurs. Ça sert, entre autres, à transformer un fichier en wav, et l'utilisateur pourra ouïr, voire jouir, d'une merveilleuse trame sonore digne des pires films de science-fiction. On pourrait effectivement dire que ça ne sert à rien, comme dire que jouer à démineur durant les heures de classe ne sert à rien, mais ce programme apporte, avec son code source, de plusieurs centaines d'octets de l'information et de la connaissance pour les futurs visiteurs de ce site en quête de savoir.
kinkek
Messages postés
7
Date d'inscription
jeudi 17 juillet 2008
Statut
Membre
Dernière intervention
13 janvier 2012

un programme rigolo qui ne sert finalement à rien.
seoseo
Messages postés
12
Date d'inscription
samedi 20 mars 2010
Statut
Membre
Dernière intervention
23 janvier 2012

Évidemment, on reconnait un virus on son qu'il produit, c'est connu. Dans la prochaine version, une analyse du fichier sera effectué pour distinguer les données qui donnent des sons intéressants de celles qui produisent que du : "sfigaukdsfhksbdfjwebvjkahvfaevwyvtf43xnb87g o8goyg oG&^ODS^gns8dgnfo8GSOGDSon".
cs_LA_Tupac
Messages postés
305
Date d'inscription
jeudi 29 avril 2004
Statut
Membre
Dernière intervention
18 janvier 2012

C'est cool avec une oreille entrainée on peut détecter les virus !! :D
cs_LA_Tupac
Messages postés
305
Date d'inscription
jeudi 29 avril 2004
Statut
Membre
Dernière intervention
18 janvier 2012

C'est très amusant, je trouves. Du code machine donne un son assez interressant, tandis qu'une archive compressée donne un bourdonnement régulier...
Si ça se trouve, avec une oreille entrainée on peut repérer les virus :D

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.