さて、前回の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デバイス機器の情報を取得するコードを修正して、
ベンダ情報などを追加して取得してみました。
何かの参考になれば幸いです。