これは手助けすることにした。
Waveファイルを読み込んで、音を鳴らしながら、 音声データを数値表示するプログラム ReadWave.java を作成した。 Wave ファイルの読み込みをする部分は、 Java で Hello World! サウンド編 にある HelloWorldSound.java を参考にした。 オーディオ・データの形式は、 Java のクラス・ライブラリィが調べてくれるので、 「尋ねる」だけである。 音のビット・データを Byte の配列として読み込むわけだが、 それをどのように数値として解釈するかは、 色々場合分けが必要で結構面倒である (定番の、16ビット・ステレオ、符号付き PCM データに限れば簡単だと思うが…)。
javac ReadWave.java |
java ReadWave piano.wav |
java ReadWave piano.wav > piano.txt |
チェック用に piano.wav を ReadWave で処理した結果 piano.txt を載せておく。
ソース・プログラムは案外長いが、 (i) 16ビット・ステレオ、(ii) 8ビット・ステレオ、 (iii) 16ビット・モノラル、(iv) 8ビット・モノラル、 と4つに場合分けしてあるからである (本当はこれにエンディアンの違いと、符号の有無の違いで、 さらに場合分けする必要があるが、それは無視した)。
16ビット・ステレオの場合 (リトル・エンディアン, 符号付き) |
nBytesRead = audioInputStream.read(abData, 0, abData.length); if (nBytesRead >= 0) { for (int i = 0; i < nBytesRead; i += 4) { short left, right; left = (short)(abData[i ] | (abData[i+1] << 8)); right = (short)(abData[i+2] | (abData[i+3] << 8)); System.out.println("" + left + " " + right); } } |