< 目次

第9章: MIDIシステム・リソースへのアクセス

 

注:

バージョン5.0では、sound.propertiesファイルを使用して、SequencerSynthesizerTransmitter、およびReceiverのデフォルトのデバイスを設定できます。詳細については、APIのMidiSystemクラス、例については、このガイドの「付録2: sound.propertiesファイル」を参照してください。


Java Sound APIは、サンプリング・オーディオ・システムを構成する場合と同様、柔軟性の高いMIDIシステム構成用モデルを提供します。Java Sound APIの実装そのものにより、様々な種類のMIDIデバイスの提供が可能になり、その他にもサービス・プロバイダが提供できるものやユーザーがインストールできるものもあります。コンピュータにインストールされるMIDIデバイスの種類をほとんど意識することなく、プログラムを作成できます。一方で、プログラムでMIDIシステムのデフォルトを利用することも、利用可能な任意のデバイスをユーザーが選択して使用することもできます。

ここでは、プログラムが、インストールされているMIDIリソースを認識し、使用するMIDIリソースにアクセスする方法を説明します。デバイスへのアクセスおよびオープンが完了すると、デバイス間の相互接続が可能になります。詳細は、次の章「MIDIメッセージの送信および受信」で説明します。

MidiSystemクラス

Java Sound APIのMIDIパッケージにおけるMidiSystemクラスの役割は、サンプリングオーディオ・パッケージにおけるAudioSystemの役割に類似しています。MidiSystemは、インストールされたMIDIリソースにアクセスするための情報センターとして機能します。

MidiSystemへの問い合わせを行なってインストールされているデバイスの種類がわかったら、利用可能なデバイスを繰返し処理して、目的のデバイスへのアクセスを取得できます。たとえば、起動時に利用可能なシンセサイザをMidiSystemに問い合わせてそのリストを表示し、ユーザーの選択を待つ、といった動作をするアプリケーション・プログラムを作成できます。また、単にデフォルトのシンセサイザを使用するだけという、より単純なアプリケーション・プログラムを作成することも可能です。

MidiSystemクラスは、また、MIDIファイルとSequences間の変換を行うメソッドも提供します。具体的には、MIDIファイルのファイル形式のレポート、およびほかのタイプのファイルの書込みが可能です。

アプリケーション・プログラムは、MidiSystemから次のリソースを取得できます。

この章では、最初の4つのリソースについて説明します。MidiSystemクラスのファイル処理機能については、第11章「MIDIシーケンスの再生、記録、および編集」および第12章「サウンドの合成」で説明します。MIDIシステムがこれらのすべてのリソースにアクセスする方法については、このドキュメントの第III部「サービス・プロバイダ・インタフェース」を参照してください。

デフォルト・デバイスの取得

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(infos[i]);
    } catch (MidiUnavailableException e) {
          // Handle or throw exception...
    }
    if (device instanceof Synthesizer) {
        synthInfos.add(infos[i]);
    }
}
// Now, display strings from synthInfos list in GUI.    

別の例として、ユーザーを介在させずに、プログラムによってデバイスを選択する方法について考えましょう。ほとんどの音色を同時に再生できるシンセサイザを取得するとします。上記のように、すべてのMidiDevice.Infoオブジェクトを繰返し処理して、デバイスがシンセサイザであることを確認できた時点で、SynthesizergetMaxPolyphonyメソッドを呼び出して機能を問い合わせます。次のセクションで示すように、最大のポリフォニ(同時に演奏できる音)を保持するシンセサイザを予約します。ユーザーにシンセサイザの選択を求めない場合でも、ユーザーへの参考情報として、選択したMidiDevice.Infoオブジェクトから返る文字列を表示することもできます。

デバイスのオープン

前のセクションでは、インストールされているデバイスを取得する方法を示しました。ただし、デバイスはインストールされていても、利用できない場合があります。たとえば、別のアプリケーション・プログラムが、排他的に使用している場合があります。使用するプログラム用にデバイスを確実に予約するには、次のようにMidiDeviceopenメソッドを使用する必要があります。

if (!(device.isOpen())) {
    try {
      device.open();
  } catch (MidiUnavailableException e) {
          // Handle or throw exception...
  }
}

デバイスにアクセスしてオープンすることにより予約が完了したら、そのデバイスをほかの1つまたは複数のデバイスに接続して、相互にMIDIデータをやり取りすることができます。この手順は、第10章「MIDIメッセージの送信および受信」で説明します。

デバイスに関連する作業が完了したら、MidiDevicecloseメソッドを呼び出して、ほかのプログラムから利用できるようにデバイスを解放します。

 


Copyright © 1993, 2020, Oracle and/or its affiliates. All rights reserved.