|
JDK1.3で追加されたJava Sound APIを使うと、JavaでPCMオーディオやMIDIデータの作成・再生を行うことが可能になります。今回は、このJava Sound APIを使用し、Javaアプリケーションで配列に作成したPCM(Wave)音声データを再生してみましょう。 Java Sound APIによる音声作成と再生実際にJavaでPCMデータを再生する処理では、まず音声入出力を管理するミキサーに関連付けられているデータ入出力用の「ライン」を取得する必要があります。出力用ラインには、予めデータを読み込んでおくClipとプログラムでリアルタイムにデータを送信するソースデータラインがありますが、今回は扱いの容易なClipを使って音声を出力してみましょう。 AudioFormat frm=new AudioFormat(44100,8,1,true,true); DataLine.Info di=new DataLine.Info(Clip.class,frm); Clipを取得するには、まずオーディオの形式をAudioFormatで指定してラインの情報(Line.InfoのサブクラスDataLine.Info)を作成します。上の例では、44.1KHz符号付8ビットのPCMデータを指定しています。ラインの情報が出来たら、それをAudioSystemのgetLine()に渡してClipを取得。 Clip cp=null; cp=(Clip)AudioSystem.getLine(di); 続いて、Clipに波形データを記録した配列を読み込みます。配列を読み込むopen()では、配列のオフセットと長さを指定できるので、配列内の任意の領域を読み込む事が出来ます。 cp.open(frm,data,0,data.length); これでデータを読み込んだクリップが出来たので、あとはこのクリップに対し再生や停止、シークなどの操作を行います。 今回は、渡された配列を指定した周波数の符号付8ビットPCM音声データとして再生するメソッドplay()を作ってみました。このメソッドは、配列datを周波数fで再生します。
private void play(byte dat[],int f) {
AudioFormat frm=new AudioFormat(f,8,1,true,true);
DataLine.Info di=new DataLine.Info(Clip.class,frm);
Clip cp=null;
try {
cp=(Clip)AudioSystem.getLine(di);
cp.open(frm,data,0,data.length);
} catch(Exception e) {
dispose();
}
cp.start();
}
Java Sound APIによる音声再生プログラム今回のサンプルプログラムは、Java2アプリケーションです。 ウインドウ上には、周波数を指定するコンボボックスと周期を指定するテキストフィールドがあるので、周波数と周期を指定したら、Playボタンをクリックしてください。周期で指定されたサンプル数の周期をもつ1秒分の矩形波を作成し、再生します。 矩形波作成と再生処理を行うJavaのコード
if (e.getSource()==play) { // Playボタンクリック
int l=Integer.parseInt(len.getText());
if (l<1)
return;
int freq=freqs[flist.getSelectedIndex()];
data=new byte[freq];
for (int i=0;i<freq;i++) // 周期lの矩形波作成
if (i % l < l/2)
data[i]=110;
else
data[i]=-110;
play(data,freq);
}
プログラムを実行すると音声が再生されますので、ご注意ください。 |