Java で仮想 MIDI ポートを使用するために、snd-virmidi カーネル モジュールをインストールしました。これらの MIDI ポートのおかげで、Java は Linux 上の Java 以外の MIDI ソフトウェア シンセサイザーに接続できます。
しかし、openjdk はこれらの仮想 MIDI ポートを検出するのに長い時間がかかります...さらに、「aconnect」コマンド ラインで仮想ポートが 4 つしかないと通知されている間に、仮想ポートの長いリストを検出します...
impro-visor (Java ソフトウェア) と現在の開発 (MIDI アプリケーション) でこの動作を確認しました。
Ubuntu 12.04 で openjdk 7 を使用しています。
これは、さまざまなキー MIDI メソッドの時間応答をテストするために使用したコードです。
public static void main(String[] args) throws Exception {
long start = new Date().getTime();
Sequencer sequencer = MidiSystem.getSequencer(true);
long end = new Date().getTime();
System.out.println("getSequencer true end : " + (end - start) + " ms");
start = new Date().getTime();
sequencer = MidiSystem.getSequencer(false);
end = new Date().getTime();
System.out.println("getSequencer false end : " + (end - start) + " ms");
start = new Date().getTime();
List<String> outputDeviceList = new ArrayList<String>();
// Obtain information about all the installed synthesizers.
MidiDevice.Info[] infos = MidiSystem.getMidiDeviceInfo();
// Scan all found devices and check to see what type they are
MidiDevice device = null;
for (MidiDevice.Info info : infos) {
try {
device = MidiSystem.getMidiDevice(info);
} catch (MidiUnavailableException e) {
continue;
}
if (device instanceof Synthesizer) {
outputDeviceList.add(info.getName());
continue;
}
if (!(device instanceof Synthesizer)
&& !(device instanceof Sequencer)) {
// The device is an instance of a hardware Midi port.
int numReceivers = device.getMaxReceivers();
if (numReceivers != 0) {
outputDeviceList.add(info.getName());
}
}
}
end = new Date().getTime();
System.out.println("getAllOutputDevice end : " + (end - start) + " ms");
}
上記のコードは、openjdk を使用して i3 Intel プロセッサ (Ubuntu 12.04) で実行されています。
java version "1.7.0_15"
OpenJDK Runtime Environment (IcedTea7 2.3.7) (7u15-2.3.7-0ubuntu1~12.04.1)
OpenJDK Server VM (build 23.7-b01, mixed mode)
次の出力が得られます。
getSequencer true end : 20811 ms
getSequencer false end : 6945 ms
getAllOutputDevice end : 13933 ms
snd-virmidi カーネル モジュールをアンロードすると、結果は次のようになります。
getSequencer true end : 412 ms
getSequencer false end : 5 ms
getAllOutputDevice end : 11 ms
Java 仮想 MIDI ポートの検出とシーケンサーの初期化プロセスを高速化する方法はありますか?