1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
|
struct Wave_File_Header
{
char RIFF[4]; //"RIFF" in ASCII form
long Data_Size_plus_36; // filesize-8 = nbr data * bitsperdata+ 36
char WAVE[4]; // lettres "WAVE"
char fmt[4]; // lettress "fmt "
long Remain_in_Chunk1; // 16 en format PCM .
// ce qui reste du Subchunk après ce nombre .
// = audioformat+numchanel+samplerate+byterate+blockalign+bitpersample
// =2+2+4+4+2+2 = 16
short AudioFormat; // PCM = 1 (i.e. Linear quantization) Values other than 1 indicate some form of compression.
short NumChannels; // Mono = 1, Stereo = 2, etc.
long SampleRate;// 8000, 44100, etc.
long ByteRate; // SampleRate * NumChannels * BitsPerSample/8
short BlockAlign; // NumChannels * BitsPerSample/8
short BitsPerSample; // 8 bits = 8, 16 bits = 16, etc.
// maintenant The "data" subchunk contient la taille des data puis les data eux-mêmes
char data[4];// "data"
long Data_Size; // taille des data = NumSamples * NumChannels * BitsPerSample/8
// ici commence les data dans le fichier wave
};
// fonction qui change la frequence et retourne le nombre de data
// atention : le nombre d'echantillons est = à nombre de data / BitsPerSample * 8 c'est à dire en 116b il y a 2X moins de d'échantillon
// que de data. De plus si dans le header on trouve stereo, le nombre d'echantillon / canal
// est encore la moitié du chiffre ci-dessus
// stop ici si les waves: le sujet est illustrer acces fichier binaire
// BitsPerSample = 8 ou 16
long Set_Frequency_and_return_Ndata(Ansistring WAV, short fr)
// attention a l'execution d'1 telle routine s'assurer que fr est une frequence
// admise par la carte son en place. c'est facile de les connaitre mais cela est un autre sujet.
{
long l;
char C[255];
FILE *f;
stuct Wave_File_Header HD;
if ( ! FileExists(WAV))
{ ShowMwessage("fichier absent"); return -1;}
for (short i=1; i<=WAV.Length(); i++) { C[i-1] = WAV[i]; C[i]='\0';}
f = fopen(C,"rb");
if ( f == NULL)
{ showMessage(Impossible d'ouvrir en lecture " + WAV); return -1;}
if (filesize(fileno(f)) < sizeof(HD))
{ShowMessage("même pas les 44 bytes du header! fichier DETRUIT"); fclose(f); unlink(C); return -1;}
fread(&HD,1,44,f);
fclose(f);
l = HD.SampleRate; // ancien data
HD.SampleRate = fr;
HDByteRate=HD.ByteRate*fr/l; // pour cet example d'un header --.wav
f = fopen(C,"rb+"); // pas "wb" qui ecrase le file pour en creer un new
// pas besoin de fseek ici car on pointe deja au debut
fwrite(&HD,44,1,f);
fclose(f);
return HD.Data_Size;
}
// ( j'ai tapé ce tout petit code ici sans test d'une eventuelle erreur de frappe ) |
Partager