Initial commit
This commit is contained in:
commit
a3d7b77c66
17
gadget
Normal file
17
gadget
Normal file
@ -0,0 +1,17 @@
|
||||
20
|
||||
220
|
||||
247
|
||||
262
|
||||
294
|
||||
330:2
|
||||
262
|
||||
311
|
||||
247
|
||||
294
|
||||
262:2
|
||||
220
|
||||
247
|
||||
262
|
||||
294
|
||||
330:2
|
||||
262
|
BIN
gadget.wav
Normal file
BIN
gadget.wav
Normal file
Binary file not shown.
119
generateur.c
Normal file
119
generateur.c
Normal file
@ -0,0 +1,119 @@
|
||||
# include "stdio.h"
|
||||
# include "stdlib.h"
|
||||
# include "string.h"
|
||||
# include "math.h"
|
||||
# include "wave_stuff.h"
|
||||
# ifndef M_PI
|
||||
# define M_PI 3.14159265358979323846
|
||||
# endif
|
||||
# define TAILLE_MAX 100
|
||||
|
||||
char **str_split (char *s, const char *ct)
|
||||
{
|
||||
char **tab = NULL;
|
||||
|
||||
if (s != NULL && ct != NULL)
|
||||
{
|
||||
int i;
|
||||
char *cs = NULL;
|
||||
size_t size = 1;
|
||||
|
||||
/* (1) */
|
||||
for (i = 0; (cs = strtok (s, ct)); i++)
|
||||
{
|
||||
if (size <= i + 1)
|
||||
{
|
||||
void *tmp = NULL;
|
||||
|
||||
/* (2) */
|
||||
size <<= 1;
|
||||
tmp = realloc (tab, sizeof (*tab) * size);
|
||||
if (tmp != NULL)
|
||||
{
|
||||
tab = tmp;
|
||||
}
|
||||
else
|
||||
{
|
||||
fprintf (stderr, "Memoire insuffisante\n");
|
||||
free (tab);
|
||||
tab = NULL;
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
}
|
||||
/* (3) */
|
||||
tab[i] = cs;
|
||||
s = NULL;
|
||||
}
|
||||
tab[i] = NULL;
|
||||
}
|
||||
return tab;
|
||||
}
|
||||
|
||||
void generer_note(int freq, int note, int duree, float *xd, int start)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = start; i < start+duree; i++)
|
||||
{
|
||||
xd[i] += (int)(32767 *sin(2*M_PI*note*i/freq));
|
||||
}
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
if (argc < 5)
|
||||
{
|
||||
fprintf(stderr,"Usage: %s partition output.wav bpm silence\n",argv[0]);
|
||||
return 0;
|
||||
}
|
||||
|
||||
float *xd;
|
||||
int nx = 0, freq = 44100, canal = 0, verbose = 0, BitsPerSample = 16, dureeNote = 0, start = 0, n = 0, silence, Split1, Split2;
|
||||
float time = 1./atof(argv[3])*60.;
|
||||
char ligne[TAILLE_MAX];
|
||||
FILE* partition = NULL;
|
||||
|
||||
partition = fopen(argv[1], "r");
|
||||
fgets(ligne, TAILLE_MAX, partition);
|
||||
n = atoi(ligne);
|
||||
silence = atoi(argv[4]);
|
||||
|
||||
if(silence == 1)
|
||||
{
|
||||
nx = (int)(freq*time*(n+n/8));
|
||||
}
|
||||
else
|
||||
{
|
||||
nx = (int)(freq*time*n);
|
||||
}
|
||||
|
||||
dureeNote = (int)(freq*time);
|
||||
xd = (float*)calloc(nx,sizeof(float));
|
||||
|
||||
while(fgets(ligne, TAILLE_MAX, partition) != NULL)
|
||||
{
|
||||
if(strchr(ligne, ':')!=NULL)
|
||||
{
|
||||
char** Split=str_split(ligne, ":");
|
||||
Split1=atoi(Split[0]);
|
||||
Split2=atoi(Split[1]);
|
||||
}
|
||||
else
|
||||
{
|
||||
Split1=atoi(ligne);
|
||||
Split2=1;
|
||||
}
|
||||
|
||||
generer_note(freq, Split1, Split2*dureeNote, xd, start);
|
||||
start += Split2*dureeNote;
|
||||
|
||||
if(silence == 1)
|
||||
{
|
||||
generer_note(freq, 0, (int)(Split2*dureeNote/8), xd, start);
|
||||
start += (int)(Split2*dureeNote/8);
|
||||
}
|
||||
}
|
||||
|
||||
save_wave_from_array(xd, nx, argv[2], freq, BitsPerSample);
|
||||
return 0;
|
||||
}
|
BIN
generateur.out
Executable file
BIN
generateur.out
Executable file
Binary file not shown.
79
generer_partition.c
Normal file
79
generer_partition.c
Normal file
@ -0,0 +1,79 @@
|
||||
# include "stdio.h"
|
||||
# include "stdlib.h"
|
||||
# include "string.h"
|
||||
|
||||
int main()
|
||||
{
|
||||
char note[100];
|
||||
int stop = 0, duree = 0;
|
||||
|
||||
while(stop == 0)
|
||||
{
|
||||
printf("Note ? ");
|
||||
scanf("%s", note);
|
||||
|
||||
printf("Durée ? ");
|
||||
scanf("%d", duree);
|
||||
|
||||
switch(note)
|
||||
{
|
||||
case "RE":
|
||||
printf("294:%d\n",duree);
|
||||
break;
|
||||
|
||||
case "MI":
|
||||
printf("330:%d\n",duree);
|
||||
break;
|
||||
|
||||
case "FA":
|
||||
printf("349:%d\n",duree);
|
||||
break;
|
||||
|
||||
case "SOL":
|
||||
printf("392:%d\n",duree);
|
||||
break;
|
||||
|
||||
case "LA":
|
||||
printf("440:%d\n",duree);
|
||||
break;
|
||||
|
||||
case "SI":
|
||||
printf("494:%d\n",duree);
|
||||
break;
|
||||
|
||||
case "DO":
|
||||
printf("523:%d\n",duree);
|
||||
break;
|
||||
|
||||
case "RE2":
|
||||
printf("587:%d\n",duree);
|
||||
break;
|
||||
|
||||
case "MI2":
|
||||
printf("659:%d\n",duree);
|
||||
break;
|
||||
|
||||
case "FA2":
|
||||
printf("699:%d\n",duree);
|
||||
break;
|
||||
|
||||
case "SOL2":
|
||||
printf("794:%d\n",duree);
|
||||
break;
|
||||
|
||||
case "LA2":
|
||||
printf("880:%d\n",duree);
|
||||
break;
|
||||
|
||||
case "SI2":
|
||||
printf("988:%d\n",duree);
|
||||
break;
|
||||
|
||||
default:
|
||||
stop = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
45
lune
Normal file
45
lune
Normal file
@ -0,0 +1,45 @@
|
||||
64
|
||||
523
|
||||
523
|
||||
523
|
||||
587
|
||||
659:2
|
||||
587:2
|
||||
523
|
||||
659
|
||||
587
|
||||
587
|
||||
523:4
|
||||
523
|
||||
523
|
||||
523
|
||||
587
|
||||
659:2
|
||||
587:2
|
||||
523
|
||||
659
|
||||
587
|
||||
587
|
||||
523:4
|
||||
587
|
||||
587
|
||||
587
|
||||
587
|
||||
440:2
|
||||
440:2
|
||||
587
|
||||
523
|
||||
494
|
||||
440
|
||||
392:4
|
||||
523
|
||||
523
|
||||
523
|
||||
587
|
||||
659:2
|
||||
587:2
|
||||
523
|
||||
659
|
||||
587
|
||||
587
|
||||
523:4
|
9
makefile
Normal file
9
makefile
Normal file
@ -0,0 +1,9 @@
|
||||
all : generateur.out
|
||||
|
||||
|
||||
generateur.out : generateur.c wave_stuff.o
|
||||
gcc -lm -o generateur.out generateur.c wave_stuff.o
|
||||
|
||||
|
||||
wave_stuff.o : wave_stuff.c wave_stuff.h
|
||||
gcc -c wave_stuff.c
|
BIN
misc_christmas_vive_le_vent_jingle_bells.pdf
Normal file
BIN
misc_christmas_vive_le_vent_jingle_bells.pdf
Normal file
Binary file not shown.
BIN
output.wav
Normal file
BIN
output.wav
Normal file
Binary file not shown.
35
read_wav.c
Normal file
35
read_wav.c
Normal file
@ -0,0 +1,35 @@
|
||||
|
||||
# include "stdio.h"
|
||||
# include "stdlib.h"
|
||||
# include "string.h"
|
||||
# include "wave_stuff.h"
|
||||
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
float *xd;
|
||||
int i, freq = 0, nx = 0, canal = 0, verbose = 0;
|
||||
|
||||
if (argc < 3)
|
||||
{
|
||||
fprintf(stderr,"Usage: %s wavefile canal [verbose]\nExample %s d:\\low.wav 1\n",argv[0],argv[0]);
|
||||
return 0;
|
||||
}
|
||||
if (sscanf(argv[2],"%d",&canal) != 1)
|
||||
{
|
||||
fprintf(stderr,"cannot read canal value %s\n",argv[2]);
|
||||
return 1;
|
||||
}
|
||||
if (argc > 3) sscanf(argv[3],"%d",&verbose);
|
||||
xd = read_wave_create_array(argv[1], canal, verbose, &nx, &freq);
|
||||
if (xd == NULL)
|
||||
{
|
||||
fprintf(stderr,"cannot read canal wave file %s\n",argv[1]);
|
||||
return 2;
|
||||
}
|
||||
printf("%% %s wave file, canal %d, frequence %d, nb. of sample %d\n",argv[1],canal,freq,nx);
|
||||
for (i = 0; i < nx; i++)
|
||||
printf("%d\n",(int)xd[i]);
|
||||
|
||||
return 0;
|
||||
}
|
BIN
read_wav.out
Normal file
BIN
read_wav.out
Normal file
Binary file not shown.
47
sapin
Normal file
47
sapin
Normal file
@ -0,0 +1,47 @@
|
||||
80
|
||||
392
|
||||
523:2
|
||||
523
|
||||
523:3
|
||||
587:2
|
||||
659:2
|
||||
659
|
||||
659:2
|
||||
523
|
||||
587
|
||||
659
|
||||
699:2
|
||||
523:2
|
||||
587:2
|
||||
523:4
|
||||
784
|
||||
784
|
||||
659
|
||||
880:2
|
||||
784
|
||||
784
|
||||
699
|
||||
699:4
|
||||
699
|
||||
699:2
|
||||
784
|
||||
587:2
|
||||
699
|
||||
699:2
|
||||
659
|
||||
659:4
|
||||
392
|
||||
523:2
|
||||
523
|
||||
523:3
|
||||
587:2
|
||||
659:2
|
||||
659
|
||||
659:2
|
||||
523
|
||||
587
|
||||
659
|
||||
699:2
|
||||
523:2
|
||||
587:2
|
||||
523:4
|
77
save_wav.c
Normal file
77
save_wav.c
Normal file
@ -0,0 +1,77 @@
|
||||
|
||||
# include "stdio.h"
|
||||
# include "stdlib.h"
|
||||
# include "string.h"
|
||||
# include "wave_stuff.h"
|
||||
|
||||
# define MAX_LINE_LENGTH 1024
|
||||
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
char line[MAX_LINE_LENGTH], *l;
|
||||
float *xd = NULL;
|
||||
int i, freq = 0, nx = 0, canal = 0, BitsPerSample = 16, data, min, max;
|
||||
FILE *fp;
|
||||
|
||||
if (argc < 4)
|
||||
{
|
||||
fprintf(stderr,"Usage: %s wave_data.txt wavefile_to_create.wav frequency BitsPerSample\nExample %s d:\\low.wav 44100 16\n",argv[0],argv[0]);
|
||||
return 0;
|
||||
}
|
||||
if ((fp = fopen(argv[1], "r")) == NULL)
|
||||
{
|
||||
fprintf(stderr,"cannot open file %s\n",argv[1]);
|
||||
return 1;
|
||||
}
|
||||
if (sscanf(argv[3],"%d",&freq) != 1)
|
||||
{
|
||||
fprintf(stderr,"cannot read freq value %s\n",argv[3]);
|
||||
return 1;
|
||||
}
|
||||
if (argc > 4) sscanf(argv[4],"%d",&BitsPerSample);
|
||||
|
||||
for(nx = 0, l = fgets(line, MAX_LINE_LENGTH, fp); l != NULL; l = fgets(line, MAX_LINE_LENGTH, fp))
|
||||
{
|
||||
if (strcspn(line,"%") >= strlen(line))
|
||||
{
|
||||
if (sscanf(line,"%d",&data) == 1)
|
||||
nx++;
|
||||
}
|
||||
}
|
||||
fclose(fp);
|
||||
if (nx <= 0)
|
||||
{
|
||||
fprintf(stderr,"could not read data");
|
||||
return 2;
|
||||
}
|
||||
xd = (float*)calloc(nx,sizeof(float));
|
||||
if (xd == NULL)
|
||||
{
|
||||
fprintf(stderr,"could not create float array");
|
||||
return 2;
|
||||
}
|
||||
min = max = 0;
|
||||
fp = fopen(argv[1], "r");
|
||||
for(i = 0, l = fgets(line, MAX_LINE_LENGTH, fp); l != NULL; l = fgets(line, MAX_LINE_LENGTH, fp))
|
||||
{
|
||||
if (strcspn(line,"%") >= strlen(line))
|
||||
{
|
||||
if (sscanf(line,"%d",&data) == 1)
|
||||
{
|
||||
xd[i] = (float)data;
|
||||
i++;
|
||||
}
|
||||
}
|
||||
}
|
||||
fclose(fp);
|
||||
printf("%d sample read\n",nx);
|
||||
i = save_wave_from_array(xd, nx, argv[2], freq, BitsPerSample);
|
||||
if (i)
|
||||
{
|
||||
fprintf(stderr,"cannot save wave file %s\n",argv[2]);
|
||||
return 2;
|
||||
}
|
||||
free(xd);
|
||||
return 0;
|
||||
}
|
3810243
test.wav.txt
Normal file
3810243
test.wav.txt
Normal file
File diff suppressed because it is too large
Load Diff
96
vivelevent
Normal file
96
vivelevent
Normal file
@ -0,0 +1,96 @@
|
||||
130
|
||||
392
|
||||
659
|
||||
587
|
||||
523
|
||||
392:3
|
||||
392
|
||||
392
|
||||
659
|
||||
587
|
||||
523
|
||||
440:3
|
||||
440
|
||||
440
|
||||
699
|
||||
659
|
||||
587
|
||||
794:3
|
||||
794
|
||||
699
|
||||
794
|
||||
699
|
||||
587
|
||||
659:4
|
||||
392
|
||||
659
|
||||
587
|
||||
523
|
||||
392:3
|
||||
392
|
||||
392
|
||||
659
|
||||
587
|
||||
523
|
||||
440:3
|
||||
440
|
||||
440
|
||||
699
|
||||
659
|
||||
587
|
||||
794:2
|
||||
794
|
||||
794
|
||||
699
|
||||
794
|
||||
699
|
||||
587
|
||||
523:2
|
||||
794:2
|
||||
659
|
||||
659
|
||||
659:2
|
||||
659
|
||||
659
|
||||
659:2
|
||||
659
|
||||
794
|
||||
523
|
||||
587
|
||||
659:4
|
||||
699
|
||||
699
|
||||
699:2
|
||||
659
|
||||
659
|
||||
659:2
|
||||
587
|
||||
587
|
||||
587
|
||||
659
|
||||
587:2
|
||||
794:2
|
||||
659
|
||||
659
|
||||
659:2
|
||||
659
|
||||
659
|
||||
659:2
|
||||
659
|
||||
794
|
||||
523
|
||||
587
|
||||
659:4
|
||||
699
|
||||
699
|
||||
699
|
||||
699
|
||||
659
|
||||
659
|
||||
659
|
||||
659
|
||||
794
|
||||
794
|
||||
699
|
||||
587
|
||||
523:4
|
BIN
vivelevent.wav
Normal file
BIN
vivelevent.wav
Normal file
Binary file not shown.
48
vivelevent2
Normal file
48
vivelevent2
Normal file
@ -0,0 +1,48 @@
|
||||
71
|
||||
554
|
||||
554
|
||||
554:2
|
||||
554
|
||||
554
|
||||
554:2
|
||||
554
|
||||
659
|
||||
440
|
||||
494
|
||||
554:2
|
||||
587
|
||||
587
|
||||
587:2
|
||||
587
|
||||
587
|
||||
554
|
||||
554:2
|
||||
494
|
||||
494:2
|
||||
554
|
||||
494
|
||||
659:2
|
||||
554
|
||||
554
|
||||
554:2
|
||||
554
|
||||
554
|
||||
554:2
|
||||
554
|
||||
659
|
||||
440
|
||||
494
|
||||
554:2
|
||||
587
|
||||
587
|
||||
587
|
||||
587
|
||||
587:2
|
||||
554
|
||||
554:2
|
||||
554
|
||||
659
|
||||
659
|
||||
587
|
||||
494:2
|
||||
440:2
|
BIN
vivelevent2.wav
Normal file
BIN
vivelevent2.wav
Normal file
Binary file not shown.
247
wave_stuff.c
Normal file
247
wave_stuff.c
Normal file
@ -0,0 +1,247 @@
|
||||
# ifndef _WAVE_STUFF_C_
|
||||
# define _WAVE_STUFF_C_
|
||||
|
||||
# include "stdio.h"
|
||||
# include "stdlib.h"
|
||||
# include "string.h"
|
||||
# include "wave_stuff.h"
|
||||
|
||||
|
||||
|
||||
int save_wave_from_array(float *x, int nx, char *file, int Frequence, int BitsPerSample)
|
||||
{
|
||||
FILE *fp;
|
||||
unsigned char *uch;
|
||||
int i, j, FileSize, tmp, BytePerSec, DataSize, data, noctets;
|
||||
short int AudioFormat = 1, NbrCanaux = 1, BytePerBloc, BitsPerSamp;
|
||||
|
||||
if (file == NULL || x == NULL) return -1;
|
||||
|
||||
noctets = BitsPerSample/8;
|
||||
BytePerBloc = (NbrCanaux * BitsPerSample/8);
|
||||
DataSize = nx * BytePerBloc;
|
||||
FileSize = DataSize + 44;
|
||||
BytePerSec = Frequence * BytePerBloc;
|
||||
BitsPerSamp = (short int)BitsPerSample;
|
||||
fp = fopen(file,"wb");
|
||||
if (fp == NULL) {fprintf(stderr,"could not open file %s to save wav",file);return 1;}
|
||||
// [Bloc de déclaration d'un fichier au format WAVE] 12 octets
|
||||
if (fwrite("RIFF",sizeof(char),4,fp) != 4) {fclose(fp); return 2;}
|
||||
if (fwrite(&FileSize,sizeof(int),1,fp) != 1) {fclose(fp); return 3;}
|
||||
if (fwrite("WAVE",sizeof(char),4,fp) != 4) {fclose(fp); return 4;}
|
||||
// [Bloc décrivant le format audio] 24 octets
|
||||
if (fwrite("fmt ",sizeof(char),4,fp) != 4) {fclose(fp); return 5;}
|
||||
tmp = 16; //Nombre d'octets du bloc - 8 (0x10)
|
||||
if (fwrite(&tmp,sizeof(int),1,fp) != 1) {fclose(fp); return 6;}
|
||||
if (fwrite(&AudioFormat,sizeof(short int),1,fp) != 1)
|
||||
{fclose(fp); return 7;}
|
||||
if (fwrite(&NbrCanaux,sizeof(short int),1,fp) != 1)
|
||||
{fclose(fp); return 8;}
|
||||
if (fwrite(&Frequence,sizeof(int),1,fp) != 1) {fclose(fp); return 9;}
|
||||
if (fwrite(&BytePerSec,sizeof(int),1,fp) != 1) {fclose(fp); return 10;}
|
||||
if (fwrite(&BytePerBloc,sizeof(short int),1,fp) != 1)
|
||||
{fclose(fp); return 11;}
|
||||
if (fwrite(&BitsPerSamp,sizeof(short int),1,fp) != 1)
|
||||
{fclose(fp); return 12;}
|
||||
// [Bloc des données] 8 octets + datasize
|
||||
if (fwrite("data",sizeof(char),4,fp) != 4) {fclose(fp); return 13;}
|
||||
if (fwrite(&DataSize,sizeof(int),1,fp) != 1) {fclose(fp); return 14;}
|
||||
for (j = 0, uch = (unsigned char*)&data; j < nx; j++)
|
||||
{
|
||||
data = (int)x[j];
|
||||
if (fwrite(uch,sizeof(unsigned char),noctets,fp) != noctets)
|
||||
{fclose(fp); return j;}
|
||||
}
|
||||
fclose(fp);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
float* read_wave_create_array(char *file, int canal, int verbose, int *ny, int *freq)
|
||||
{
|
||||
FILE *fp;
|
||||
char ch[16];
|
||||
unsigned char uch[4];
|
||||
int i, j, FileSize, BytePerSec, DataSize, nx, data, noctets;
|
||||
short int AudioFormat = 1, NbrCanaux, BytePerBloc, BitsPerSamp, si;
|
||||
int Frequence, offset, cont;
|
||||
float *xd;
|
||||
|
||||
if (file == NULL) return NULL;
|
||||
|
||||
fp = fopen(file,"rb");
|
||||
if (fp == NULL)
|
||||
{ fprintf(stderr,"could not open file %s to read wav",file); return NULL;}
|
||||
// [Bloc de déclaration d'un fichier au format WAVE] 12 octets
|
||||
if (fread(ch,sizeof(char),4,fp) != 4) // read 4
|
||||
{ fclose(fp); fprintf(stderr,"could not read RIFF label"); return NULL; }
|
||||
if (strncmp(ch,"RIFF",4) != 0)
|
||||
{ fclose(fp); fprintf(stderr,"could not read RIFF tag"); return NULL; }
|
||||
if (fread(&FileSize,sizeof(int),1,fp) != 1) // read 4
|
||||
{ fclose(fp); fprintf(stderr,"could not read File size"); return NULL;}
|
||||
if (verbose) fprintf(stderr,"file size %d",FileSize);
|
||||
if (fread(ch,sizeof(char),4,fp) != 4) // read 4
|
||||
{ fclose(fp); fprintf(stderr,"could not read WAVE label"); return NULL; }
|
||||
if (strncmp(ch,"WAVE",4) != 0)
|
||||
{ fclose(fp); fprintf(stderr,"could not read WAVE tag"); return NULL; }
|
||||
|
||||
// [Bloc décrivant le format audio] 24 octets
|
||||
if (fread(ch,sizeof(char),4,fp) != 4) // read 4
|
||||
{ fclose(fp); fprintf(stderr,"could not read fmt label"); return NULL; }
|
||||
if (strncmp(ch,"fmt ",4) != 0)
|
||||
{ fclose(fp); fprintf(stderr,"could not read fmt tag"); return NULL; }
|
||||
if (fread(&offset,sizeof(int),1,fp) != 1) // read 4
|
||||
{ fclose(fp); fprintf(stderr,"could not read offset"); return NULL; }
|
||||
if (verbose) fprintf(stderr,"offset %d",offset); // read 4
|
||||
if (fread(&AudioFormat,sizeof(short int),1,fp) != 1) // read 2
|
||||
{ fclose(fp); fprintf(stderr,"could not read Audio format"); return NULL;}
|
||||
if (fread(&NbrCanaux,sizeof(short int),1,fp) != 1) // read 2
|
||||
{ fclose(fp); fprintf(stderr,"could not read Nb. of canaux"); return NULL;}
|
||||
if (verbose) fprintf(stderr,"NbrCanaux %d",(int)NbrCanaux); // read 4
|
||||
if (fread(&Frequence,sizeof(int),1,fp) != 1)
|
||||
{ fclose(fp); fprintf(stderr,"could not read Frequence"); return NULL; }
|
||||
if (verbose) fprintf(stderr,"Frequence %d",Frequence); // read 4
|
||||
if (fread(&BytePerSec,sizeof(int),1,fp) != 1)
|
||||
{ fclose(fp); fprintf(stderr,"could not read BytePerSec"); return NULL;}
|
||||
if (verbose) fprintf(stderr,"BytePerSec %d",BytePerSec);
|
||||
if (fread(&BytePerBloc,sizeof(short int),1,fp) != 1) // read 2
|
||||
{ fclose(fp); fprintf(stderr,"could not read BytePerSec"); return NULL; }
|
||||
if (verbose) fprintf(stderr,"BytePerBloc %d",(int)BytePerBloc);
|
||||
if (fread(&BitsPerSamp,sizeof(short int),1,fp) != 1) // read 2
|
||||
{ fclose(fp); fprintf(stderr,"could not read BitsPerSamp"); return NULL; }
|
||||
if (verbose) fprintf(stderr,"BitsPerSamp %d",(int)BitsPerSamp);
|
||||
// [Bloc des données] 8 octets + datasize
|
||||
if (fread(ch,sizeof(char),4,fp) != 4) // read 4
|
||||
{ fclose(fp); fprintf(stderr,"could not read data label"); return NULL;}
|
||||
|
||||
if (strncmp(ch,"LIST",4) == 0)
|
||||
{
|
||||
if (fread(&offset,sizeof(int),1,fp) != 1) // read 4
|
||||
{ fclose(fp); fprintf(stderr,"could not read offset"); }
|
||||
if (verbose) fprintf(stderr,"found list block skipping %d bytes",offset);
|
||||
for (i = 0; i < offset; i++)
|
||||
{
|
||||
if (fread(ch,sizeof(char),1,fp) != 1)
|
||||
{ fclose(fp); fprintf(stderr,"could not read data"); return NULL;}
|
||||
}
|
||||
if (fread(ch,sizeof(char),4,fp) != 4) // read 4
|
||||
{ fclose(fp); fprintf(stderr,"could not read data label"); return NULL;}
|
||||
}
|
||||
if (strncmp(ch,"data",4) != 0)
|
||||
{
|
||||
ch[4] = 0;
|
||||
cont = 0;
|
||||
fprintf(stderr,"could not read data tag!\n read %s instead "
|
||||
"\ntype 1 to continue anything else to stop",ch);
|
||||
scanf("%d",&cont);
|
||||
if (cont == 1)
|
||||
{
|
||||
fclose(fp);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
if (fread(&DataSize,sizeof(int),1,fp) != 1) // read 4
|
||||
{
|
||||
fclose(fp);
|
||||
fprintf(stderr,"could not read datasize");
|
||||
return NULL;
|
||||
}
|
||||
noctets = BitsPerSamp/8;
|
||||
nx = DataSize/BytePerBloc;
|
||||
if (verbose) fprintf(stderr,"DataSize %d nx %d noctets %d" ,DataSize,nx,noctets);
|
||||
|
||||
if (BytePerBloc != (NbrCanaux * BitsPerSamp/8))
|
||||
{
|
||||
fclose(fp);
|
||||
fprintf(stderr,"Byte per bloc pb!\n"
|
||||
"Byte per bloc %d != NbrCanaux %d x Bitspersample %d/8"
|
||||
,BytePerBloc,(int)NbrCanaux,(int)BitsPerSamp);
|
||||
return NULL;
|
||||
}
|
||||
/*
|
||||
if (FileSize != DataSize + 44)
|
||||
{
|
||||
cont = 0;
|
||||
i = fprintf(stderr,"File size pb!\n"
|
||||
"File size %d != datasize %d + 44"
|
||||
"\ntype 1 to continue anything else to stop"
|
||||
,FileSize,DataSize);
|
||||
scanf("%d",&cont);
|
||||
if (cont == 1)
|
||||
{
|
||||
fclose(fp);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
*/
|
||||
if (BytePerSec != Frequence * BytePerBloc)
|
||||
{
|
||||
cont = 0;
|
||||
i = fprintf(stderr,"Byte count pb!\n"
|
||||
"Byte per sec %d != Frequence %d x Byte per bloc %d"
|
||||
"\ntype 1 to continue anything else to stop"
|
||||
,BytePerSec,Frequence,BytePerBloc);
|
||||
scanf("%d",&cont);
|
||||
if (cont == 1)
|
||||
{
|
||||
fclose(fp);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
xd = (float*)calloc(nx,sizeof(float));
|
||||
if (xd == NULL)
|
||||
{
|
||||
fclose(fp);
|
||||
fprintf(stderr,"could not create float array");
|
||||
return NULL;
|
||||
}
|
||||
if (freq) *freq = Frequence;
|
||||
if (ny) *ny = nx;
|
||||
for (j = 0; j < nx; j++)
|
||||
{
|
||||
for (i = 0; i < NbrCanaux; i++)
|
||||
{
|
||||
uch[0] = uch[1] = uch[2] = uch[3] = 0;
|
||||
data = 0;
|
||||
if (noctets == 1)
|
||||
{
|
||||
if (fread(uch,sizeof(unsigned char),noctets,fp) != noctets)
|
||||
{
|
||||
fclose(fp);
|
||||
fprintf(stderr,"could not read unsigned int data at %d %d",i,j);
|
||||
return NULL;
|
||||
}
|
||||
data = uch[0];
|
||||
}
|
||||
if (noctets == 2)
|
||||
{
|
||||
if (fread(&si,sizeof(short int),1,fp) != 1)
|
||||
{
|
||||
fclose(fp);
|
||||
fprintf(stderr,"could not read short int data at %d %d",i,j);
|
||||
return NULL;
|
||||
}
|
||||
data = (int)si;
|
||||
}
|
||||
if (noctets == 3)
|
||||
{ // to be checked
|
||||
if (fread(uch,sizeof(unsigned char),noctets,fp) != noctets)
|
||||
{
|
||||
fclose(fp);
|
||||
fprintf(stderr,"could not read data at %d %d",i,j);
|
||||
return NULL;
|
||||
}
|
||||
data = (uch[0] << 8) | (uch[1] << 16) | (uch[2] << 24);
|
||||
data /= 256;
|
||||
}
|
||||
if (i == canal) xd[j] = (float)data;
|
||||
}
|
||||
}
|
||||
fclose(fp);
|
||||
return xd;
|
||||
}
|
||||
|
||||
|
||||
|
||||
# endif
|
27
wave_stuff.h
Normal file
27
wave_stuff.h
Normal file
@ -0,0 +1,27 @@
|
||||
# ifndef _WAVE_STUFF_H_
|
||||
# define _WAVE_STUFF_H_
|
||||
|
||||
|
||||
/*
|
||||
read a sound wave file and save it in a float array which is allocated by the function
|
||||
char *file : the filename of the sound wave file (example "c:\\music\\test.wav"
|
||||
int canal : the canal to be read if the wav file is in stereo two values are possible 0 and 1
|
||||
int verbose : flag producing lost of debugging info if different of 0
|
||||
int *ny : the address of an integer to return the number of points read
|
||||
int *freq : the address of an integer to return the sampling frequency
|
||||
if the function fails it return a null pointer
|
||||
*/
|
||||
float* read_wave_create_array(char *file, int canal, int verbose, int *ny, int *freq);
|
||||
/*
|
||||
save an array of float in a file of format wav,
|
||||
char *file : the filename of the futur sound wave file (example "c:\\music\\test.wav"
|
||||
int BitsPerSample : the number of bits per sample (typically 16)
|
||||
int verbose : flag producing lost of debugging info if different of 0
|
||||
int nx : the number of points to save
|
||||
int Frequence : the sampling frequency
|
||||
on success return 0 otherwise an error code
|
||||
*/
|
||||
int save_wave_from_array(float *x, int nx, char *file, int Frequence, int BitsPerSample);
|
||||
|
||||
# endif
|
||||
|
Loading…
Reference in New Issue
Block a user