begin process at 2012 05 27 16:35:40
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Divers

 > GÉNÉRATION DE FICHIER .WAV

GÉNÉRATION DE FICHIER .WAV


 Information sur la source

 Description

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

  • #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;
  • }
#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.


 Sources du même auteur

Source avec Zip ÉDITEUR DE RECTANGLES EN CONSOLE
CONVERSION DE FICHIER EN FICHIER BMP

 Sources de la même categorie

Source avec Zip EDITION D'ÉTIQUETTES SANS OUTIL EXTERNE par ucfoutu
Source avec Zip Source .NET (Dotnet) APPRENDRE À PRONONCER LES MOTS ANGLAIS par alpha5
Source avec Zip Source .NET (Dotnet) AFFICHAGE DE TEXTE DANS UNE PICTUREBOX par alpha5
Source avec Zip TEXTBOX EN NUMÉRIQUE par 320C
Source avec Zip DÉCIMAL TO HEXDECIMAL par loulou27200

Commentaires et avis

Commentaire de seoseo le 20/12/2011 07:36:55

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é.

Commentaire de macsou01 le 21/12/2011 13:57:28

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 :).

Commentaire de buno le 21/12/2011 15:56:35 administrateur CS

Why not...Attention toutefois à caster le retour de la méthode malloc

Commentaire de seoseo le 21/12/2011 20:13:58

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.

Commentaire de seoseo le 21/12/2011 20:26:48

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.

Commentaire de buno le 22/12/2011 09:37:45 administrateur CS

Ben, par exemple avec Visual Studio 2005, tu as 4 erreurs ;)

Commentaire de CptPingu le 22/12/2011 11:08:29 administrateur CS

@buno: En C, point besoin de cast (quelque soit le compilateur). La seule raison pour laquelle tu pourrais avoir besoin d'un cast, c'est si tu utilises un compilateur C++ pour faire du C.

Commentaire de buno le 22/12/2011 13:16:15 administrateur CS

Ah oui, exact, j'étais en C++...Au temps pour moi

Commentaire de LA_Tupac le 22/12/2011 21:12:28

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

Commentaire de LA_Tupac le 23/12/2011 09:24:37

C'est cool avec une oreille entrainée on peut détecter les virus !! :D

Commentaire de seoseo le 24/12/2011 06:50:24

É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".

Commentaire de kinkek le 28/12/2011 21:44:27

un programme rigolo qui ne sert finalement à rien.

Commentaire de seoseo le 28/12/2011 23:50:26

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.

 Ajouter un commentaire




Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,718 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales