以下はwav形式のサウンドファイルをC言語で開くプログラムです
時間とデータを出力します.
リニアPCM形式16ビットのモノラルデータに対応しています.
//wav形式データを読み込むプログラム
//リニアPCM形式のデータなら先頭の44バイトがヘッダである
//16ビットモノラルデータに対応
//時間とデータを出力する
//ヘッダは下位データから並ぶ正数
//波形データは下位データから並ぶ符号付整数
//0Xは16進数,0Bは2進数
#include <stdio.h>
main(){
int i,a,b,rate;
FILE *fin=fopen("test.wav","rb");
for(i=0;i<20; i++)b=fgetc(fin);//RIFF to "fmt ""byte"
for(i=0;i<2; i++)b=fgetc(fin);//format ID
b=fgetc(fin);
b+=fgetc(fin)*0X100;
printf("ch=%d\n",b);
b=fgetc(fin);
b+=fgetc(fin)*0X100;
b+=fgetc(fin)*0X10000;
b+=fgetc(fin)*0X1000000;
printf("rate=%d\n",b);
rate=b;//サンプリングレート(sample/s)
b=fgetc(fin);
b+=fgetc(fin)*0X100;
b+=fgetc(fin)*0X10000;
b+=fgetc(fin)*0X1000000;
printf("Byte/sec=%d\n",b);
for(i=0;i<2; i++)b=fgetc(fin);//Block size
//bit/sample
b=fgetc(fin);
b+=fgetc(fin)*0X100;
if(b!=16){printf("data is not 16bit"); return 0;}
for(i=0;i<4; i++)b=fgetc(fin);//data
b=fgetc(fin);
b+=fgetc(fin)*0X100;
b+=fgetc(fin)*0X10000;
b+=fgetc(fin)*0X1000000;
printf("total data=%d\n",b);
for(i=0;i<1000;i++){
a=fgetc(fin);//下位バイト
b=fgetc(fin);//上位バイト
a+=(b%0X80)*0X100;
if(b&gt;=0X80)a-=0X8000;
printf("%f\t%d\n",(float)i/rate,a);
}
fclose(fin);
}
ATMELのAT-Tiny26,ATmega,R8Cなどのワンチップマイコン,C言語,JAVAなどのプログラミング言語の入門のためのページです.サンプルプログラムを中心に紹介します.他にもLinixや数学ソフトなどの紹介も行います.