本屋にいったら「ポケットミク」という面白そうなものを売っていたので、買ってみた。USB経由でMIDI信号を送って、リアルタイム歌唱合成できるらしい。早速コードを書いていじってみる。
Javaでメッセージを送ってみる

最終的にはMacでObjective-C層から操作できるようにしたいのだけど、ググった感じまだCoreMIDIを使ってNSX-39を操作するコードを公開してる人いないし、MIDIデバイスを使うプログラムなんてほとんど書いたことがないし、なかなか難易度高そう。Qiitaで検索してみたらJavaで操作する方法を書いてる方がいたので、まずはその記事を参考にJavaでNSX-39を操作してみることにした。
記事の通りに実行してみたが、自分の環境(Mavericks)ではDeviceの検出に失敗していた。
Audio MIDI 設定アプリで確認するとNSX-39は確かにつながっているので、Java側でどう見えているのか確認してみる。
MidiDevice.Info[] devicesInfo = MidiSystem.getMidiDeviceInfo();
System.out.println("Number of devices: " + devicesInfo.length);
for(MidiDevice.Info i : devicesInfo){
System.out.println("Device " + i.getName() + " desc: " + i.getDescription());
}
とやってみると、
Number of devices: 4 Device NSX-39 desc: NSX-39 Device NSX-39 desc: NSX-39 Device Real Time Sequencer desc: Software sequencer Device Java Sound Synthesizer desc: Software wavetable synthesizer and receiver
となって、記事の通りNSX-39は二つ検出されているのだけど、OSの違いなのかなんなのかよくわからないんだけど、記事と違ってDescriptionは両方とも「NSX-39」。
調べてみると片方ではMIDIメッセージ受信用のReceiverの取得で失敗し、他方では成功するので、IN用/OUT用がそれぞれDeviceとしてリストに出てきているっぽいので、Receiverを取得できる方のDeviceを使うようにしたところ、無事動いた。
static MidiDevice getDevice() throws Exception {
MidiDevice.Info[] devices = MidiSystem.getMidiDeviceInfo();
System.out.println("Number of devices: " + devices.length);
for (MidiDevice.Info i : devices) {
if (i.getName().startsWith("NSX-39")) {
MidiDevice device = MidiSystem.getMidiDevice(i);
try {
device.getReceiver();
return device;
} catch(Exception e) {
System.out.println("No receiver");
}
}
}
throw new RuntimeException();
}
Javaで動作確認できたので、次はこれを参考にしつつObjective-C(CoreMIDI)で操作できないか試してみる。
「NSX-39(ポケットミク)で遊んでみる1(まずはJava編)」への1件のフィードバック