Java Sound APIは、オーディオ・データとMusical Instrument Digital Interface (MIDI)データの両方を含む音声メディアの入出力への効果と制御のための低レベルAPIです。Java Sound APIは、拡張性と柔軟性を向上させるフレームワークによって、サウンド入出力に通常必要な機能に対する明示的な制御を提供します。
サウンドはもっとも基本的な要素であるため、Java Sound APIは広範なアプリケーション開発者のニーズに対応しています。たとえば次のような領域のアプリケーションに適用されます。
Java Sound APIは、Javaプラットフォームでもっとも低レベルのサウンド機能を提供します。そして、アプリケーション・プログラムにサウンド操作のための非常に多くの制御を提供するとともに、拡張性も備えています。Java Sound APIは、システム・リソース(オーディオ・ミキサー、MIDIシンセサイザ、ほかのオーディオ・デバイスまたはMIDIデバイス、ファイル・リーダーおよびライター、サウンド形式コンバータなど)に対するインストール、アクセス、操作の各メカニズムを備えています。Java Sound APIには、高度なサウンド・エディタやグラフィック・ツールはありませんが、それらのプログラムを作成するために使用できる機能を提供します。また、この低レベル制御機能は、一般的にエンド・ユーザーが期待する以上のものです。
サウンド関連の要素を持つJavaプラットフォームAPIは他にもあります。Java Media Framework (JMF)はさらに高レベルのAPIで、現在はJavaプラットフォームの標準拡張機能として入手可能です。JMFは、時間ベース・メディアの取込みと再生のための統合アーキテクチャ、メッセージ交換プロトコル、プログラミング・インタフェースを定めています。JMFは基本的なメディア再生アプリケーション・プログラムに、より簡単なソリューションを提供します。また、JMFを使用すると、オーディオとビデオ間など異種のメディア間の同期化が可能になります。一方、サウンドを重視するプログラム、特にバッファリングされたオーディオの再生を細かく制御する能力やMIDIシンセサイザを直接操作する能力など、高度な機能を必要とするプログラムでは、Java Sound APIが役立ちます。サウンド機能に関連するJava APIとしては、この他に、Java 3Dおよび、電話と発話のためのAPIがあります。これらのAPIは、Java Sound APIの実装を内部的に使用して実装できますが、使用しなくても構いません。
Java Sound APIには、デジタル・オーディオとMIDIデータの両方をサポートする機能が含まれています。これらの主な2つの機能のモジュールは、別々のパッケージで提供されます。
javax.sound.sampled
このパッケージでは、デジタル(サンプリング)オーディオの取り込み、ミキシング、および再生のためのインタフェースを指定しています。javax.sound.midi
このパッケージでは、MIDI合成、シーケンシング、およびイベント転送のためのインタフェースを提供しています。
javax.sound.sampled
パッケージが処理するデジタル・オーディオ・データを、Java Sound APIでは「サンプリング・オーディオ」と呼びます。サンプルとは、信号の連続するスナップショットのことです。オーディオの場合、その信号は音波です。マイクロフォンがアコースティック信号をアナログの電気信号に変換し、そのアナログ信号をアナログ・デジタル・コンバータがサンプリング・デジタル形式に変換します。次の図に、録音の一部を示します。
グラフの縦軸は音圧(振幅)を示し、横軸は時間を示します。アナログ音波の振幅は一定の間隔で周期的に測定すると、デジタル・オーディオ信号を構成する離散的なサンプル(図の赤いデータ・ポイント)になります。中央の水平線は振幅0を示し、これより上の点は正の値のサンプル、これより下の点は負の値です。アナログ信号のデジタル近似の精度は、時間の分解能(サンプリング・レート)と量子化つまり振幅の分解能(各サンプルを表現するために使用するビットの数)に依存します。参考基準として、コンパクト・ディスク用に録音されるオーディオのサンプリング・レートは44,100回/秒で、各サンプルのビット数は16です。
ここでは、「サンプリング・オーディオ」という用語はあまり厳密に定義していません。音波は、アナログ形式のまま離散間隔でサンプリングすることもできます。ただし、Java Sound APIでは、「サンプリング・オーディオ」は「デジタル・オーディオ」と同義です。
一般に、コンピュータ上のサンプリング・オーディオは録音によって作成されますが、合成して生成する場合もあります(プッシュホン式電話の音声を作成する場合など)。「サンプリング・オーディオ」という用語は、データの種類を表し、データの出所を表すものではありません。
デジタル・オーディオ・データの構造の詳細は、第2章「Sampledパッケージの概要」の「整形済みオーディオ・データとは」を参照してください。
Java Sound APIは、特定のオーディオ・ハードウェア構成を想定していません。システム上に様々な種類のオーディオ・コンポーネントをインストールできるように設計されており、それらにはAPIを使ってアクセスできます。Java Sound APIは、サウンド・カードに対する入出力(サウンド・ファイルの録音や再生など)、オーディオの複数のストリームのミキシングなど、一般的な機能をサポートしています。次に、一般的なオーディオ・アーキテクチャの例を示します。
一般的なオーディオ・アーキテクチャこの例では、サウンド・カードなどのデバイスにさまざまな入出力ポートがあり、ミキシングはソフトウェア内で行われます。ミキサーが受け取るデータは、ファイルから読み込んだもの、ネットワークからのストリーム、アプリケーション・プログラムが進行中に生成したもの、MIDIシンセサイザが生成したものなどさまざまです。次に説明するjavax.sound.midi
パッケージは、シンセサイザのためのJava言語インタフェースです。ミキサーはすべてのオーディオ入力を1本のストリームにまとめるので、それを出力デバイスに送ってレンダリングすることができます。
javax.sound.midi
パッケージには、MIDIイベントの転送とシーケンシングのためのAPI、およびそれらのイベントからのサウンドを合成するためのAPIがあります。
サンプリング・オーディオがサウンドそのものの直接表現であるのに対し、MIDIデータは音、特に音楽を作成するためのレシピと考えることができます。MIDIデータは、オーディオ・データのようにサウンドを直接記述することはありません。かわりに、シンセサイザにより作成されるサウンドに影響を与えるイベントを記述します。MIDIデータは、グラフィカル・ユーザー・インタフェースのキーボード・イベントとマウス・イベントに類似しています。MIDIの場合は、イベントは鍵盤に対するアクション、または楽器のペダル、スライダ、スイッチ、つまみなどに対するアクションであると考えることができます。これらのイベントは、実際にハードウェアとしての楽器から生じている必要はありません。ソフトウェアでシミュレーションしたものをMIDIファイルに保存することができます。これらのファイルを作成、編集、実行するプログラムをシーケンサと呼びます。コンピュータ用サウンド・カードにはMIDI制御可能な音楽シンセサイザ・チップが搭載されていることが多く、シーケンサからMIDIイベントを送ることができます。シンセサイザをソフトウェア内に完全に実装することもできます。それらのシンセサイザは、受け取ったMIDIイベントを解釈してオーディオ出力を生成します。通常、MIDIデータから合成される音は、発話などではなく、音楽です。MIDIシンセサイザにより、各種のサウンド・エフェクトを生成することもできます。
一部のサウンド・カードにはMIDI入出力ポートがあり、外部ハードウェア・デバイス(キーボード・シンセサイザなどの機器)を接続できます。アプリケーション・プログラムは、外部のMIDI搭載楽器が生成したイベントをMIDI入力ポートから受信できます。プログラムは、コンピュータの内部シンセサイザを使って音楽の演奏をしたり、MIDIファイルとしてディスクに保存したり、音符に変換したりすることができます。また、プログラムはMIDI出力ポートを使って外部の楽器を演奏したり、録音機器などの外部デバイスを制御することができます。
MIDIデータについては、第8章「MIDIパッケージの概要」に説明がありますが、特に「MIDIについて: ワイヤーとファイル」の節に詳細な説明がありますので参照してください。
下の図に、Java Sound APIを基にした、MIDI構成例の中の主なコンポーネント間の機能の関係を示します。オーディオの場合と同様に、Java Sound APIではさまざまなMIDIソフトウェア・デバイスをインストールして相互接続することができます。ここで示すシステムは、一例に過ぎません。コンポーネント間のデータの流れは、矢印で示してあります。データは、標準ファイル形式のデータの場合もあり、オーディオ、raw MIDIバイト、時間のタグが付いたMIDIメッセージなどの場合もあります(図の右下隅のkeyを参照)。
MIDI構成の例この例では、アプリケーション・プログラムは、ディスク上に標準MIDIファイルとして保存されている楽譜をロードして音楽の演奏の準備をします(図の左側)。標準MIDIファイルには、トラックが含まれています。それぞれのトラックは、時間のタグが付いたMIDIイベントのリストです。イベントのほとんどは音符(ピッチとリズム)を表します。このMIDIファイルをソフトウェア・シーケンサが読み込み、次に「演奏」します。シーケンサは、内部または外部のシンセサイザなどのデバイスにMIDIメッセージを送信することによって音楽の演奏を行います。シンセサイザ自体が、特定の楽器のサウンドをエミュレートするための指示が含まれているサウンドバンク・ファイルを読み込むこともあります。それ以外の場合は、シンセサイザはすでにシンセサイザにロードされている楽器のサウンドをすべて使って、MIDIファイルの中の音を再生します。
図に示すとおり、MIDIイベントはMIDI出力ポートを使って外部のシンセサイザに送信する前に、時間のタグが付いていないraw MIDIに変換される必要があります。同様に、外部MIDIソース(図の鍵盤楽器)からコンピュータに入力されるraw MIDIデータは時間のタグが付いたMIDIメッセージに変換されます。このメッセージによりシンセサイザを制御できます。また、後で使用するためにシーケンサでこのメッセージを保存しておくこともできます。MIDIデータの流れに関しては、MIDIについての後続の章で詳細に説明しています(このガイドの第Ⅱ部を参照)。
javax.sound.sampled.spi
パッケージとjavax.sound.midi.spi
パッケージには、ソフトウェア開発者がオーディオまたはMIDIリソースを新規に作成するために使用できるAPIが含まれています。これらのリソースは、ユーザーに個別に配布したり、既存のJava Sound API実装に「プラグイン」させたりすることができます。この方法で追加できるサービス(リソース)として、次のようなものがあります。
Java Sound APIの実装にはサービスの基本セットが含まれていますが、サービス・プロバイダ・インタフェース(SPI)パッケージを使ってサード・パーティによる新しいサービスの作成も可能です。このようなサード・パーティ・サービスは、組込みサービスと同様の方法でシステムに統合されます。sampled
パッケージ内のAudioSystem
クラスとmidi
パッケージ内のMidiSystem
クラスは、アプリケーション・プログラムがサービスに明示的または暗黙的にアクセスするための調整役として働きます。あるサービスの存在が、そのサービスを使用するアプリケーション・プログラムにはまったく見えないこともよくあります。サービス・プロバイダ・メカニズムにより、Java Sound APIをベースとするアプリケーション・プログラムのユーザーは、便利さを享受することができます。それは、JDKまたは実行環境の新しいリリース、また多くの場合、アプリケーション・プログラムそのものの新しいリリースさえも必要とせずに、プログラムに新しいサウンド機能を追加できるからです。