NSX-39(ポケットミク)で遊んでみる1(まずはJava編)


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

Javaでメッセージを送ってみる

audio-midi

最終的には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件のフィードバック

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です