テスト用の楽器の WAVE ファイルは、 例えば 『楽器の音のWAVEファイル』 で入手して下さい。
WAVE ファイルの内部構造を詳しく知る必要はないと思うが、 参考までに WAVE ファイルを読み取るプログラム readwave.c を紹介しておく。 これは WAVE ファイルを読んで、 内容をテキスト・ファイルにするプログラムである。
コンパイルは簡単、実行も簡単 |
oyabun% ls Makefile piano.wav readwave.c writewave.c oyabun% gcc -o readwave readwave.c oyabun% ./readwave piano.wav > piano.txt |
こうして出来た piano.txt は、 cat や less, emacs などで読むことができる。
40000行から41000行までを切り出して、gnuplot で表示 |
oyabun% gawk '(NR>=40000 && NR< 41000) {print NR,$1,$2}' piano.txt > piano2.txt oyabun% gnuplot gnuplot> plot "piano2.txt" with lines |
piano.txt |
# RIFF データのサイズ=1234584 # fmt データのサイズ=18 # 01 00 02 00 44 ac 00 00 10 b1 02 00 04 00 10 00 # 00 00 # 非圧縮PCMです。 # ステレオです。 # サンプリング・レート(標本化周波数)=44100 # 1秒当りのバイト数=176400 # ブロック境界=4 # ビット数/サンプル=16 # 拡張情報サイズ=0 # PAD チャンクがあります。# PAD チャンクのサイズ=4042 # 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 (中略) # 00 00 00 00 00 00 00 00 00 00 # fact チャンクがあります。# fact データのサイズ=4 # 49 af 04 00 # data データのサイズ=1228068 #original file: piano.wav #number of channels: 2 #sampling rate: 44100 #number of bits (per sample): 16 #number of samples: 307017 64 64 62 62 (中略 --- 結構長い) -114 -63 -111 -59 -112 -61 -109 -53 -108 -51 |
以上、素朴に音声データ (音圧の時間変化) をグラフに表示できた。
Java で Hello World! サウンド編 にある HelloWorldSound.java, HelloWorldRecorder.java を参考にして、Java で実現したい。
while (nBytesRead != -1) { // オーディオストリームからデータを読み込みます nBytesRead = audioInputStream.read(abData, 0, abData.length); if (nBytesRead >= 0) { // オーディオデータをミキサーに書き込みます int nBytesWritten = line.write(abData, 0, nBytesRead); } } |