Java Sound APIでPCM(Wave)音声を再生する

JDK1.3で追加されたJava Sound APIを使うと、JavaでPCMオーディオやMIDIデータの作成・再生を行うことが可能になります。今回は、このJava Sound APIを使用し、Javaアプリケーションで配列に作成したPCMWave)音声データを再生してみましょう。

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データを指定しています。ラインの情報が出来たら、それをAudioSystemgetLine()に渡して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);

  }

プログラムソース表示

プログラムを実行すると音声が再生されますので、ご注意ください。


プログラミング資料庫 > Javaプログラミング実験室