ATMELのAT-Tiny26,ATmega,R8Cなどのワンチップマイコン,C言語,JAVAなどのプログラミング言語の入門のためのページです.サンプルプログラムを中心に紹介します.他にもLinixや数学ソフトなどの紹介も行います.

このブログを検索

あなたは 番目のお客様です.

2008年7月7日月曜日

サウンドファイルwavを開く


以下は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&lt;20; i++)b=fgetc(fin);//RIFF to "fmt ""byte"
for(i=0;i&lt;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&lt;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&lt;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&lt;1000;i++){
a=fgetc(fin);//下位バイト
b=fgetc(fin);//上位バイト
a+=(b%0X80)*0X100;
if(b&amp;gt;=0X80)a-=0X8000;
printf("%f\t%d\n",(float)i/rate,a);
}
fclose(fin);
}