コース: 音声

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には高度な音声エディタやグラフィカル・ツールはありませんが、そのようなプログラムを構築するために使用できる機能があります。 低いレベルの制御を特徴としたこのAPIは、一般的にエンドユーザーが期待する以上のものです。

Java Sound APIでは、デジタル音声データとMIDIデータの両方がサポートされています。 これら2つの主要な機能モジュールは個別パッケージで提供されています。

このほかに、以下の2つのパッケージを使用すると、(アプリケーション開発者とは逆の立場の)サービス・プロバイダが、Java Sound APIを実装する機能を拡張するカスタム・ソフトウェア・コンポーネントを作成できるようになります。

このページでは、サンプリング・オーディオ・システム、MIDIシステム、SPIパッケージについて説明します。 それぞれのパッケージの詳細については、このチュートリアルの後半のレッスンで説明します。


注:JavaプラットフォームのAPIには、他にも音声関連の要素を含むものがあります。 Java Media Framework API(JMF)はより高レベルなAPIであり、現在はJavaプラットフォームのStandard Extensionとして提供されています。 JMFでは、時系列メディアの取込みと再生を行うための、統一されたアーキテクチャ、メッセージング・プロトコル、プログラミング・インタフェースが定められています。 JMFを使用すると、基本的なメディア・プレーヤ型アプリケーション・プログラム向けの簡単なソリューションが提供されるとともに、オーディオとビデオなどの異なるメディア・タイプ間での同期が可能になります。 音声を重視したプログラムには、Java Sound APIの方が適しています。バッファリングされたオーディオの再生を細かく制御したり、MIDIシンセサイザを直接操作したりするような、より高度な機能が必要とされる場合は特に有効です。 音声に関連したJava APIにはほかに、Java 3Dや電話通信および音声向けのAPIがあります。 これらのAPI実装では、内部でJava Sound APIの実装が使用されている場合がありますが、必須ではありません。

サンプリング・オーディオとは

javax.sound.sampled パッケージが処理するデジタル・オーディオ・データを、Java Sound APIではサンプリング・オーディオと呼んでいます。 サンプルとは、信号の連続するスナップショットです。 オーディオの場合、この信号は音波です。 マイクロフォンによって音響信号がアナログ電気信号に変換され、アナログからデジタルへのコンバータによってアナログ信号がサンプリング・デジタル形式へと変換されます。 次の図に、録音の一部を示します。

音波のサンプリング

音波のサンプリング

このグラフの縦軸は音圧(振幅)を示し、横軸は時間を示します。 一定の間隔で定期的にアナログ音波の振幅を計測すると、デジタル・オーディオ信号を構成する離散的なサンプル(図で赤く示されたデータ・ポイント)が得られます。 中央の水平線は振幅ゼロを示し、この線より上の点は正の値のサンプル、下の点は負の値のサンプルです。 アナログ信号のデジタル近似精度は、時間の分解能(サンプリング・レート)とその量子化、つまり振幅の分解能(各サンプルを表すために使用されるビット数)によって異なります。 参考基準として、コンパクト・ディスクのストレージに録音されたオーディオは、1秒当たり44,100回サンプリングされており、サンプルのビット数は16です。

ここでは、"サンプリング・オーディオ"という用語はあまり厳密に定義していません。 音波は、アナログ形式のまま離散間隔でサンプリングすることもできます。 ただし、Java Sound APIでは、"サンプリング・オーディオ"は"デジタル・オーディオ"と同義です。

一般に、コンピュータ上のサンプリング・オーディオは録音によって生成されますが、合成して生成することもできます(プッシュホン式電話の音を作成する場合など)。 "サンプリング・オーディオ"という用語はデータの種類を表すものであり、その出所を示すものではありません。

Java Sound APIは、特定のオーディオ・ハードウェア構成を想定していません。さまざまな種類のオーディオ・コンポーネントをシステムにインストールできるように、またAPIからアクセスできるように設計されています。 Java Sound APIでは、サウンド・カードに対する入出力(音声ファイルの記録や再生など)や複数のオーディオ・ストリームのミキシングなど、一般的な機能がサポートされています。 次に、一般的なオーディオ・アーキテクチャの例を示します。

図の説明は以下を参照

一般的なオーディオ・アーキテクチャ

この例では、サウンド・カードなどのデバイスに各種の入出力ポートが設定されており、ミキシングはソフトウェアで実行されています。 ミキサーが受け取るデータは、ファイルから読み込んだもの、ネットワークからのストリーム、アプリケーション・プログラムが実行中に生成したもの、MIDIシンセサイザが生成したものなどさまざまあります。 ミキサーは、すべてのオーディオ入力を1つのストリームにまとめ、それを出力デバイスに送信してレンダリングすることが可能です。

MIDIとは

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イベントのリストです。 ほとんどのイベントは音符(ピッチとリズム)を表しています。 このMIDIファイルをソフトウェア・シーケンサが読み込み、次に"演奏"します。 シーケンサはMIDIメッセージを別のデバイス(内部または外部のシンセサイザなど)に送信することで、音楽を演奏します。 シンセサイザ自体が、特定の楽器の音色をエミュレートするための指示を含むサウンドバンク・ファイルを読み込むこともあります。 そうでない場合は、シンセサイザはすでにロードされている楽器の音色を使用して、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をベースにしたアプリケーション・プログラムのユーザーにとって便利な機能です。


サンプル・プログラムで問題が発生した場合は、 『サンプル・コードのコンパイルと実行: FAQ』をお試しください。
不満な点や 賞賛、 提案などがあれば、 フィードバックをお願いいたします

前のページ: チュートリアルの開始部分
次のページ: Overview of the Sampled Package