本屋にいったら「ポケットミク」という面白そうなものを売っていたので、買ってみた。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件のフィードバック