Membaca File .wav Dengan Menggunakan C

Posted: December 12, 2011 in Komputaa... -___-", Tutorial
Tags:

Minggu kemaren, aku ditugasi senior di kantor untuk mbikin program yang bisa mbandingin kualitas suara file hasil rekaman dari set dengan file aslinya. File tersebut berekstensikan .wav. Jujur aja, selama ini aku belum pernah utek2 file .wav pake bahasa C. Sebenernya agak ragu2 juga sih, C bisa ngebaca file .wav gak ya?… yup akhirnya, setelah bolak2 searching akhirnya ketemu juga metodenya :D…

Menurut link ini, file .wav sebenernya file biner biasa (ya ntar metode pembacaan/penulisannya pake “rb”/”wb” aja), yang punya format tersendiri. Secara gambaran, format .wav itu seperti ini :

Detail :

ChunkID                       :    Berisikan tulisan “RIFF” dalam ASCII
ChunkSize                    :    Besar dari file minus 8 bytes untuk 2 fields yang tidak termasuk dalam hitungan
Format                          :     Berisikan tulisan “WAVE”
Subchunk1ID               :    Berisikan tulisan “fmt”
Subchunk1Size            :    16 untuk PCM, besar dari subchunk “fmt”
AudioFormat               :    PCM = 1, untuk yang lainnya berarti bukan PCM
NumChannels              :    Mono = 1, Stereo = 2, dsb
SampleRate                  :    8000, 44100, dsb
ByteRate                       :    ==SampleRate*NumChannels*BitsPerSample/8
BlockAlign                    :    ==NumChannels*BitsPerSample/8
Jumlah byte untuk 1 sample di semua channel
BitsPerSample             :    8 bits=8, 16 bits=16, dsb
Subchunk2ID               :    Berisikan tulisan “data”
Subchunk2Size            :    ==NumSamples*NumChannels*BitsPerSample/8
Besar data suara
Data                               :    informasi data suara

Bisa dilihat, bila file .wav itu punya format tersendiri dalam proses pembacaannya. Sehingga, dibutuhkan sebuah struct yang dapat menyimpan informasi dari header file wav. Berikut struct header file wav yang aku buat:

typedef struct Header
{
char fileName[30];
char chunkID[4];
char format[4];
char subchunk1ID[4];
char subchunk2ID[4];
int chunkSize;
int subchunk1Size;
int subchunk2Size;
int sampleRate;
int byteRate;
int wavSize;
short int audioFormat;
short int numChannels;
short int blockAlign;
short int extraParamSize;
short bitsPerSample;
short bits;
};

Nah untuk pembacaannya, gampang aja, jadi seperti baca file biner, pake mode “rb” dan untuk mbacanya pake fread(). Jadi secara garis besar seperti ini :

char FileName[30], InputFile[30];
short DataL, DataR;
char exten[6] = {“.wav”};
printf(“\nPlease input the file name (without .wav): “);
scanf(“%s”,InputFile);
strcpy(FileName,InputFile);
strcat(FileName,exten);
strcpy(file1.fileName,FileName);
FILE *finput=fopen(FileName,”rb”);

if(finput) // continue if file is valid
{
fread(file1.chunkID,1,4,finput);
fread(&file1.chunkSize,4,1,finput);
fread(file1.format,1,4,finput);
fread(file1.subchunk1ID,1,4,finput);
fread(&file1.subchunk1Size,4,1,finput);
fread(&file1.audioFormat,2,1,finput);
fread(&file1.numChannels,2,1,finput);
fread(&file1.sampleRate,4,1,finput);
fread(&file1.byteRate,4,1,finput);
fread(&file1.blockAlign,2,1,finput);
fread(&file1.bitsPerSample,2,1,finput);
fread(&file1.subchunk2ID,1,4,finput);
fread(&file1.subchunk2Size,4,1,finput);
while(!feof(finput) )
{
fread(&DataL,file1.bitsPerSample/8,1,finput);
fread(&DataR,file1.bitsPerSample/8,1,finput);
if(feof(finput)&&feof(finput2))break;
}

}

Yap, sekian dulu postingan saya, semoga bermanfaat 😀

Leave a comment