MIDI情報の読み込み先や書き出し先はMidiSystem.getMidiDeviceInfoというスタティックメソッドで取得できます。ただこのままだと使い勝手が悪いのでユーティリティを作りたいと思います。
実装内容
MidiSystem.getMidiDeviceInfoはシステム上接続できるデバイスを全て返していますが用途によって絞り込んだものを取得したいと思います。だいたい以下のような機能を実装します。
- デバイス名に指定の文字が含まれているもののみ取得できる
- 入力か出力かを指定して取得できる
- 複数のデバイスを取得できる
前にMIDI環境を調べて一覧を表示することができたのでここから取得できる文字列を指定することができます。Javaで作ったMIDI情報を受信できるデバイスであればレシーバーがあることを確認します。また鍵盤などMIDI情報を送信するデバイスであればトランスミッターがあることを確認します。
複数取得するのは同じ名前のデバイスを同時に使う可能性があるためです。一つだけ必要な場合は先頭のを使うことにします。
実装
getMidiDevicesという名前のメソッドにします。引数は指定の文字列と入力か出力かのスイッチです。trueで出力、falseで入力とします。
まずはシステム上の全てのデバイス情報を取得します。
public static MidiDevice[] getMidiDevices(String strDeviceName, boolean output) { MidiDevice.Info[] infos = MidiSystem.getMidiDeviceInfo();
条件に一致したものを保持するリストを作ります。
ArrayList list = new ArrayList<>();
以下取得したデバイス情報を順に見ていきます。
for (MidiDevice.Info info : infos) {
指定した文字列がデバイス名にない場合には次のデバイス情報を見るようにします。
if (!info.getName().contains(strDeviceName)) { continue; }
デバイス名の条件が満たされていても出力デバイスを探しているのにレシーバーがなかったり、入力デバイスを探しているのにトランスミッターがない場合も次のデバイス情報にいきます。このあたりは例外を発生する処理なのであとでtry-catch節で囲むようにします。
MidiDevice device = MidiSystem.getMidiDevice(info); if (output && device.getMaxReceivers() == 0) { continue; } else if (!output && device.getMaxTransmitters() == 0) { continue; }
ここまできたものは条件を満たしたとしてリストに追加します。
list.add(device);
最後にリストを固定の配列に変換して返します。
return list.toArray(new MidiDevice[]{});
確認をする
今の環境は以下のようなものとします。
MidiDevice.Info : 6 item(s) MidiDevice.Info[0] Name : Gervill Version : 1.0 Vendor : OpenJDK Description : Software MIDI Synthesizer Receivers : -1 Transmitters : 0 MidiDevice.Info[1] Name : MIDI Version : Unknown version Vendor : TASCAM Description : US-122 MKII MIDI Receivers : 0 Transmitters : -1 MidiDevice.Info[2] Name : MIDI Version : Unknown version Vendor : TASCAM Description : US-122 MKII MIDI Receivers : -1 Transmitters : 0 MidiDevice.Info[3] Name : ARIA Player Version : Unknown version Vendor : Unknown vendor Description : ARIA Player Receivers : -1 Transmitters : 0 MidiDevice.Info[4] Name : ARIA Player Version : Unknown version Vendor : Unknown vendor Description : ARIA Player Receivers : -1 Transmitters : 0 MidiDevice.Info[5] Name : Real Time Sequencer Version : Version 1.0 Vendor : Oracle Corporation Description : Software sequencer Receivers : -1 Transmitters : -1
“MIDI”という名前の入力デバイスを取得します。
MidiDevice[] devices = getMidiDevices("MIDI", false); for(MidiDevice device:devices){ System.out.println("name :" + device.getDeviceInfo().getName()); System.out.println("receivers :" + device.getMaxReceivers()); System.out.println("transmitters:" + device.getMaxTransmitters()); System.out.println(); }
結果は以下のようになりました。トランスミッターが-1つまり無制限のデバイスが取得できました。
name :MIDI receivers :0 transmitters:-1
今度は”ARIA Player”というシンセサイザーを取得します。同じ名前のデバイスが二つあります。
MidiDevice[] devices = getMidiDevices("ARIA", true); for(MidiDevice device:devices){ System.out.println("name :" + device.getDeviceInfo().getName()); System.out.println("receivers :" + device.getMaxReceivers()); System.out.println("transmitters:" + device.getMaxTransmitters()); System.out.println(); }
結果は以下の通りです。正常にレシーバーを持つデバイスを取得できました。
name :ARIA Player receivers :-1 transmitters:0 name :ARIA Player receivers :-1 transmitters:0
ソース
最後にソースを載せておきます。
package mocha.sound.midi; import java.util.ArrayList; import javax.sound.midi.MidiDevice; import javax.sound.midi.MidiSystem; import javax.sound.midi.MidiUnavailableException; public class MidiUtilDevelopment { public static MidiDevice[] getMidiDevices(String strDeviceName, boolean output) { MidiDevice.Info[] infos = MidiSystem.getMidiDeviceInfo(); ArrayList list = new ArrayList<>(); for (MidiDevice.Info info : infos) { if (!info.getName().contains(strDeviceName)) { continue; } try { MidiDevice device = MidiSystem.getMidiDevice(info); if (output && device.getMaxReceivers() == 0) { continue; } else if (!output && device.getMaxTransmitters() == 0) { continue; } list.add(device); } catch (MidiUnavailableException e) { } } return list.toArray(new MidiDevice[]{}); } public static void main(String[] args) { MidiDevice[] devices = getMidiDevices("ARIA", true); for (MidiDevice device : devices) { System.out.println("name :" + device.getDeviceInfo().getName()); System.out.println("receivers :" + device.getMaxReceivers()); System.out.println("transmitters:" + device.getMaxTransmitters()); System.out.println(); } } }