JavaTM Sound API は、サンプリングオーディオシステムを構成する場合と同様、柔軟性の高い MIDI システム構成用モデルを提供します。Java Sound API を実装することにより、さまざまな種類の MIDI デバイスの提供が可能になりました。さらに、サービスプロバイダの提供する他の MIDI デバイスの追加およびインストールもできるようになりました。コンピュータにインストールされる MIDI デバイスの種類をほとんど意識せずに、プログラムを作成できます。一方で、プログラムで MIDI システムのデフォルトを利用することも、利用可能な任意のデバイスをユーザが選択して使用することもできます。
このセクションでは、プログラムが、インストールされている MIDI リソースを認識し、使用する MIDI リソースにアクセスする方法を説明します。デバイスへのアクセスおよびオープンが完了すると、デバイス間の相互接続が可能になります。詳細は、次の章「MIDI メッセージの送信および受信」で説明します。
Java Sound API の MIDI パッケージにおける MidiSystem
クラスの役割は、サンプリングオーディオパッケージにおける AudioSystem
の役割にまさに類似しています。MidiSystem
は、インストールされた MIDI リソースにアクセスするための情報センターとして機能します。
MidiSystem
へのクエリーを行なってインストールされているデバイスの種類を知ることができたら、利用可能なデバイスへの繰り返し処理を実行して、目的のデバイスへのアクセスを取得できます。たとえば、起動時に利用可能なシンセサイザを MidiSystem
に問い合わせてそのリストを表示し、ユーザの選択を待つ、といった動作をするアプリケーションプログラムを作成できます。また、単にデフォルトのシンセサイザを使用するだけという、より単純なアプリケーションプログラムを作成することも可能です。
MidiSystem
クラスは、また、MIDI ファイルと Sequence
間の変換を行うメソッドも提供します。具体的には、MIDI ファイルのファイル形式のレポート、および他タイプのファイルの書き込みが可能です。
アプリケーションプログラムは、MidiSystem
から次のリソースを取得できます。
Java Sound API を使用する通常の MIDI アプリケーションプログラムは、起動時に必要なデバイス群を取得します。デバイス群は、1 つまたは複数のシーケンサ、シンセサイザ、入力ポート、および出力ポートなどから構成されます。
デフォルトのシンセサイザデバイス、デフォルトのシーケンサデバイス、デフォルトの送信デバイス、およびデフォルトの受信デバイスが、1 つずつ存在します。通常、後の送信と受信の 2 つのデバイスは、それらがシステムで利用可能な場合、MIDI の入力ポートおよび出力ポートをそれぞれ表します。ここで、入力と出力の方向性を間違えやすいので注意してください。ポートの送信および受信は、物理ポートに接続する外部の物理デバイスとの関係ではなく、ソフトウェアとの関係で理解する必要があります。MIDI 入力ポートは、データを外部デバイスから Java Sound API Receiver
に「送信」します。同様に、MIDI 出力ポートは、ソフトウェアオブジェクトからデータを「受信」して外部デバイスに中継します。
単純なアプリケーションプログラムは、インストールされているすべてのデバイスを調査せずに、デフォルトのデバイスを使用します。MidiSystem
クラスには、デフォルトのリソースを検索する際に使用する、次のメソッドが含まれます。
static Sequencer getSequencer() static Synthesizer getSynthesizer() static Receiver getReceiver() static Transmitter getTransmitter()
はじめの 2 つのメソッドは、システムのデフォルトのシーケンシングリソースおよび合成リソースを取得します。各リソースは、物理デバイスの場合もあれば、完全にソフトウェアに実装されている場合もあります。getReceiver
メソッドは、送信された MIDI メッセージを受け取ってデフォルトの受信デバイスに中継する Receiver
オブジェクトを取得します。同様に、getTransmitter
メソッドは、デフォルトの送信デバイスに代わって MIDI メッセージを受信側に送信できる Transmitter
オブジェクトを取得します。
デフォルトのデバイスを使用する代わりに、システムにインストールされている全デバイスの中から目的のデバイスを確実に選択するという方法もあります。アプリケーションプログラムでは、方針に基づいて目的のデバイスを選択することも、利用可能なデバイスのリストを表示してユーザに選択させることも可能です。MidiSystem
クラスでは、インストールされているデバイスを確認するためのメソッド、および指定されたタイプのデバイスを取得するための対応するメソッドが提供されます。
static MidiDevice.Info[] getMidiDeviceInfo()
ご覧のとおり、このメソッドは情報オブジェクトの配列を返します。返される各 MidiDevice.Info
オブジェクトは、シーケンサ、シンセサイザ、ポートをそれぞれ 1 種類、またはインストールされている他のデバイスを示します。システムが保持する、指定タイプのインスタンスは、通常多くても 1 つです。 たとえば、特定のベンダーの特定モデルのシンセサイザは、一度だけインストールされます。 MidiDevice.Info
には、デバイスを表す次の文字列が含まれます。
ただし、文字列をユーザに表示するためではなく、デバイスを選択するという方針として文字列を使用するには、そのデバイスの情報をあらかじめ取得する必要があります。各デバイスを提供する企業は、文書にこのデバイス情報を記載する必要があります。特定のデバイスの使用が必要、または推奨されるアプリケーションプログラムは、この情報を使ってデバイスを検出できます。この方法には、プログラムできるのは事前に情報のあるデバイス実装に限定されるという欠点があります。
このほかに、より一般的な方法として、複数の MidiDevice.Info
オブジェクトに対して繰り返しを実行して、各オブジェクトに対応するデバイスを取得し、各デバイスが使用に適しているかどうか (または少なくとも各デバイスが、ユーザに表示する選択リストに含めることが適切かどうか) を方針として決定する方法です。次のセクションでは、この方法を説明します。
適切なデバイスの info オブジェクトが検出されると、アプリケーションプログラムは次の MidiSystem
メソッドを呼び出して対応するデバイス自体を取得します。
static MidiDevice getMidiDevice(MidiDevice.Info info)
このメソッドを使用できるのは、必要なデバイスが記述された info オブジェクトをすでに検出している場合です。ただし、getMidiDeviceInfo
が返す info オブジェクトを解釈して必要なデバイスを判定できない場合、またはすべてのデバイスの情報をユーザに表示することを望まない場合、代わりに、getMidiDeviceInfo
が返すすべての MidiDevice.Info
オブジェクトに対し、上記のメソッドを繰り返し実行して対応するデバイスを取得し、各デバイスが使用に適しているかどうかテストする方法もあります。つまり、ユーザに表示するデバイスリストに含める前に、またはユーザを介在させずにプログラムの方針に基づいてデバイスを決定する手段の 1 つとして、各デバイスにそのクラスおよび機能を問い合わせることができます。たとえば、プログラムがシンセサイザを必要とする場合、次に示すように、インストールされている各デバイスを取得し、Synthesizer
インタフェースを実装するクラスのインスタンスを判別してリストに表示して、ユーザの選択を待ちます。
// Obtain information about all the installed synthesizers. Vector synthInfos; MidiDevice device; MidiDevice.Info[] infos = MidiSystem.getMidiDeviceInfo(); for (int i = 0; i < infos.length; i++) { try { device = MidiSystem.getMidiDevice(info); } catch (MidiUnavailableException e) { // Handle or throw exception... } if (device instanceof Synthesizer) { synthInfos.add(info); } } // Now, display strings from synthInfos list in GUI.
別の例として、ユーザを介在させずに、方針に基づいてデバイスを選択する方法について考えましょう。ほとんどの音色を同時に再生できるシンセサイザを取得するとします。 上記のように、すべての MidiDevice.Info オブジェクトに対して繰り返し実行しますが、デバイスがシンセサイザであることを確認できた時点で、Synthesizer
の getMaxPolyphony
メソッドを呼び出して機能を問い合わせます。次のセクションで示すように、最大のポリフォニ (同時に演奏できる音) を保持するシンセサイザを予約します。ユーザにシンセサイザの選択を求めないとしても、ユーザへの参考情報として、選択した MidiDevice.Info
オブジェクトから返る文字列を表示させることもできます。
前のセクションでは、インストールされているデバイスを取得する方法を示しました。ただし、デバイスはインストールされていても、利用できない場合があります。たとえば、別のアプリケーションプログラムが、排他的に使用している場合があります。 使用するプログラム用にデバイスを確実に予約するには、次のように MidiDevice
の open
メソッドを使用する必要があります。
if (!(device.isOpen())) { try { device.open(); } catch (MidiUnavailableException e) { // Handle or throw exception... } }
デバイスにアクセスしてオープンすることにより予約が完了したら、そのデバイスを他の 1 つまたは複数のデバイスに接続して、相互に MIDI データをやり取りすることができます。この手順は、第 10 章「MIDI メッセージの送信および受信」で説明します。
デバイスに関連する作業が完了したら、MidiDevice
の close
メソッドを呼び出して、他のプログラムから利用できるようにデバイスを解放します。