【Java】(続)midiデバイスの情報を配列で取得する
さて、前回のJavaで「MIDIデバイスの情報を配列で取得する」の続編です。
調べていたところ、もう少しMIDIデバイスの情報が取得できることがわかったので、
前回のコードを修正して試してみました。
修正した箇所は以下
Vendor、Description、Nameのパラメータで取得可能なことがわかったので、
以下のコードの赤字の箇所を追加しています。
MidiDevice.Info[] info=MidiSystem.getMidiDeviceInfo();
for(int i = 0 ; i < info.length; i++){
System.out.println(
"[" + i +"] "+
info[i].getVendor() + " <" +
info[i].getDescription()+"("+
info[i].getName() + ")>"
);
}
ちなみに修正前のコードは以下でした。
MidiDevice.Info[] info=MidiSystem.getMidiDeviceInfo();
for(int i = 0 ; i < info.length; i++){
System.out.println(info[i]);
}
上記のコードでMIDI機器をUSB接続時にデバイス情報を取得した結果は以下となります。
1)macOSX
[0] OpenJDK <Software MIDI Synthesizer(Gervill)> [1] Oracle Corporation <Software sequencer(Real Time Sequencer)> [2] AKAI <MPK mini 3(MPK mini 3)> [3] AKAI <MPK mini 3(MPK mini 3)>
2)Linux
[0] OpenJDK <Software MIDI Synthesizer(Gervill)>
[1] Oracle Corporation <Software sequencer(Real Time Sequencer)>
[2] ALSA (http://www.alsa-project.org) <MPK mini 3, USB MIDI, MPK mini 3(M3 [default])>
[3] ALSA (http://www.alsa-project.org) <MPK mini 3, USB MIDI, MPK mini 3(M3 [hw:0,0,0])>
[4] ALSA (http://www.alsa-project.org) <MPK mini 3, USB MIDI, MPK mini 3(M3 [default])>
[5] ALSA (http://www.alsa-project.org) <MPK mini 3, USB MIDI, MPK mini 3(M3 [hw:0,0,0])>
3)Windows
[0] OpenJDK <Software MIDI Synthesizer(Gervill)>
[1] Oracle Corporation <Software sequencer(Real Time Sequencer)>
[2] Unknown vendor <Windows MIDI_MAPPER(Microsoft MIDI Mapper)>
[3] Unknown vendor <Internal software synthesizer(Microsoft GS Wavetable Synth)>
[4] Unknown vendor <External MIDI Port(MPK mini 3)>
[5] Unknown vendor <No details available(MPK mini 3)>
ベンダー情報のAKAIはmacOSXしか正しく取得できてないですね。
Linuxの場合はVendorはALSA。なぜかダブって表示されていますね。
コード全体は以下
//
import javax.sound.midi.*;
import java.util.*;
//
class MidiKeyBoardChk{
//* Midi Detect
private final static boolean EMULATE_NO_MIDI_IN = false;
private static MidiDevice.Info[] createInputMidiDeviceInfo()
throws MidiUnavailableException {
ArrayList list = new ArrayList();
MidiDevice.Info[] infos = MidiSystem.getMidiDeviceInfo();
for (int i = 0; i < infos.length; i++) {
// throws MidiUnavailableException
MidiDevice device = MidiSystem.getMidiDevice(infos[i]);
if (device.getMaxTransmitters() != 0
&& !(device instanceof Synthesizer)
&& !(device instanceof Sequencer)
&& !EMULATE_NO_MIDI_IN)
list.add(infos[i]);
}
return (MidiDevice.Info[]) list.toArray(new MidiDevice.Info[0]);
}
//
public static void main(String[] args) throws MidiUnavailableException, InvalidMidiDataException, InterruptedException{
//* Main
String osname = System.getProperty("os.name");
String osver = System.getProperty("os.version");
String osarch = System.getProperty("os.arch");
System.out.println(">>> " + osname + " " + osver +"("+ osarch +") <<<");
//
MidiDevice.Info[] info=MidiSystem.getMidiDeviceInfo();
for(int i = 0 ; i < info.length; i++){
System.out.println(
"[" + i +"] "+
info[i].getVendor() + " <" +
info[i].getDescription()+"("+
info[i].getName() + ")>"
);
}
}
}
上記コードを「MidiKeyBoardChk.java」とファイル名で保存し、以下で実行となります。
$ java MidiKeyBoardChk.java
以下の警告が出ますが、無視で大丈夫です。
ノート:MidiKeyBoardChk.javaの操作は、未チェックまたは安全ではありません。
ノート:詳細は、-Xlint:uncheckedオプションを指定して再コンパイルしてください。
まとめ
というわけで今回は前回のJavaでMIDIデバイス機器の情報を取得するコードを修正して、
ベンダ情報などを追加して取得してみました。
何かの参考になれば幸いです。