Java Sound APIは、アプリケーション開発者の幅広いニーズに対応しています。 期待される応用分野は次のとおりです。
Java Sound APIは、Javaプラットフォームでもっとも低レベルの音声サポートを提供します。 音声操作に対する広範な制御機能をアプリケーション・プログラムに提供し、拡張性も備えています。 例を挙げると、Java Sound APIは、システム・リソース(オーディオ・ミキサー、MIDIシンセサイザ、その他の音声またはMIDIデバイス、ファイル・リーダーおよびファイル・ライター、音声形式コンバータなど)のインストール、アクセス、および操作のためのメカニズムを備えています。 Java Sound APIには高度な音声エディタやグラフィカル・ツールはありませんが、そのようなプログラムを構築するために使用できる機能があります。 低いレベルの制御を特徴としたこのAPIは、一般的にエンドユーザーが期待する以上のものです。
Java Sound APIでは、デジタル音声データとMIDIデータの両方がサポートされています。 これら2つの主要な機能モジュールは個別パッケージで提供されています。
javax.sound.sampled
– このパッケージでは、デジタル(サンプリングされた)オーディオの取込み、ミキシング、再生を行うためのインタフェースが提供されています。
javax.sound.midi
– このパッケージでは、MIDIの合成、シーケンシング、イベント・トランスポートを行うためのインタフェースが提供されています。
javax.sound.sampled
パッケージが処理するデジタル・オーディオ・データを、Java Sound APIではサンプリング・オーディオと呼んでいます。 サンプルとは、信号の連続するスナップショットです。 オーディオの場合、この信号は音波です。 マイクロフォンによって音響信号がアナログ電気信号に変換され、アナログからデジタルへのコンバータによってアナログ信号がサンプリング・デジタル形式へと変換されます。 次の図に、録音の一部を示します。
音波のサンプリング
ここでは、"サンプリング・オーディオ"という用語はあまり厳密に定義していません。 音波は、アナログ形式のまま離散間隔でサンプリングすることもできます。 ただし、Java Sound APIでは、"サンプリング・オーディオ"は"デジタル・オーディオ"と同義です。
一般に、コンピュータ上のサンプリング・オーディオは録音によって生成されますが、合成して生成することもできます(プッシュホン式電話の音を作成する場合など)。 "サンプリング・オーディオ"という用語はデータの種類を表すものであり、その出所を示すものではありません。
Java Sound APIは、特定のオーディオ・ハードウェア構成を想定していません。さまざまな種類のオーディオ・コンポーネントをシステムにインストールできるように、またAPIからアクセスできるように設計されています。 Java Sound APIでは、サウンド・カードに対する入出力(音声ファイルの記録や再生など)や複数のオーディオ・ストリームのミキシングなど、一般的な機能がサポートされています。 次に、一般的なオーディオ・アーキテクチャの例を示します。
一般的なオーディオ・アーキテクチャ
javax.sound.midiパッケージには、MIDIイベントの転送およびシーケンシングのためのAPIに加えて、これらのイベントからの音声を合成するAPIが含まれています。
サンプリング・オーディオが音自体を直接表しているのに対し、MIDIデータは音、特に音楽を作り出すためのレシピであると考えられます。 MIDIデータはオーディオ・データとは異なり、音を直接記述することはありません。 代わりに、MIDIに対応したデバイスや楽器(シンセサイザなど)によって演奏される音(またはアクション)に影響を与えるイベントを記述します。 MIDIデータは、グラフィカル・ユーザー・インタフェースのキーボード・イベントやマウス・イベントに似ています。 MIDIの場合は、イベントは、鍵盤に対するアクション、楽器のペダル、スライダ、スイッチやつまみに対するアクションであると考えることができます。 これらのイベントは実際の楽器から作られたものである必要はありません。ソフトウェアでシミュレートしたものをMIDIファイルに保存できます。 これらのファイルを作成、編集、および実行するプログラムは、シーケンサと呼ばれています。 多くのコンピュータのサウンド・カードにはMIDI制御可能な音楽シンセサイザ・チップが搭載されており、シーケンサからこれらのチップにMIDIイベントを送信できます。 シンセサイザは、完全にソフトウェア内に実装することもできます。 シンセサイザは、受信したMIDIイベントを解釈してオーディオ出力を生成します。 通常、MIDIデータから合成される音は、(発話などではなく)音楽です。 また、MIDIシンセサイザは各種の音響効果を生成する機能を備えています。一部のサウンド・カードにはMIDI入出力ポートが搭載されており、外部のMIDIハードウェア・デバイス(キーボード・シンセサイザやその他の楽器など)をこれらのポートに接続できます。 アプリケーション・プログラムは、外部のMIDI対応楽器によって生成されたイベントをMIDI入力ポートから受信できます。 このプログラムはコンピュータに内蔵されたシンセサイザを使用して音楽を演奏したり、MIDIファイルとしてディスクに保存したり、または音符に変換したりできます。 また、プログラムからMIDI出力ポートを使用して、外部の楽器を演奏することも、録音機器などの外部デバイスを制御することもできます。
下図は、Java Sound APIを基にした、MIDI構成例での主要なコンポーネント間の機能関係を示したものです (オーディオの場合と同様に、Java Sound APIは、各種のMIDIソフトウェア・デバイスをインストールして相互接続できます。 ここで示すシステムは、一例にすぎません)。 コンポーネント間のデータ・フローは、矢印で示されています。 データは標準ファイル形式である場合もあれば、オーディオやRAW MIDIバイト、または時刻タグ付きのMIDIメッセージである場合もあります(図の右下のKey部分を参照)。
MIDI構成の例
図に示すとおり、MIDIイベントは、MIDI出力ポート経由で外部のMIDI楽器に送信される前に、RAW(時間タグの付いていない)MIDIに変換される必要があります。 同様に、外部のMIDIソース(図では鍵盤楽器)からコンピュータに入力されるRAW MIDIデータは、時刻タグの付いたMIDIメッセージに変換されます。こうすることで、シンセサイザを制御できるようになります。また、後で使用するためにシーケンサによってこのメッセージを保存できます。
javax.sound.sampled.spi
パッケージと
javax.sound.midi.spi
パッケージに含まれるAPIを使用すると、ソフトウェア開発者は新しいオーディオ・リソースやMIDIリソースを作成できます。これらのリソースは個別にユーザーに提供したり、既存のJava Sound API実装に"プラグイン"させたりすることが可能です。 次に、この方法で追加できるサービス(リソース)の例を挙げます。
一部のケースでは、サービスがハードウェア・デバイス(サウンド・カードなど)の機能に対するソフトウェア・インタフェースになり、その場合は、サービス・プロバイダはハードウェア・ベンダーと同じ意味になります。 別のケースでは、サービスが完全にソフトウェア内に存在します。 たとえば、シンセサイザまたはミキサーがサウンド・カード上のチップに対するインタフェースになる場合や、ハードウェアをまったくサポートしないで実装される場合があります。
Java Sound APIの実装には基本的なサービス・セットが含まれていますが、サービス・プロバイダ・インタフェース(SPI)パッケージを使用すると、サード・パーティによる新しいサービスの作成も可能です。 サード・パーティによるこのようなサービスは、組込みサービスと同じ方法でシステムに統合されます。
AudioSystem
クラスと
MidiSystem
クラスが調整役を担うことで、アプリケーション・プログラムは明示的または暗黙的にサービスにアクセスできるようになります。 多くの場合、サービスを使用するアプリケーション・プログラムにとって、サービスは完全に透過的な存在です。 サービス・プロバイダのメカニズムを利用すると、JDKや実行環境の新しいリリース、また多くの場合はアプリケーション・プログラム自体の新しいリリースさえも必要とせずに新しい音声機能をプログラムに追加できるため、Java Sound APIをベースにしたアプリケーション・プログラムのユーザーにとって便利な機能です。