Skip to content

Instantly share code, notes, and snippets.

@kurogelee
Created April 5, 2014 10:51
Show Gist options
  • Save kurogelee/9990338 to your computer and use it in GitHub Desktop.
Save kurogelee/9990338 to your computer and use it in GitHub Desktop.
ポケット・ミクをJava/Clojureから操作してみる ref: http://qiita.com/kurogelee/items/12a175866ef620f3c520
(ns pokemiku.core
(:import [javax.sound.midi MidiSystem ShortMessage SysexMessage MidiDevice]
[javax.xml.bind DatatypeConverter]))
(def dev
(->> (seq (MidiSystem/getMidiDeviceInfo))
(filter #(re-find #"NSX-39" (:name (bean %))))
(filter #(re-find #"External" (:description (bean %))))
first
(MidiSystem/getMidiDevice)))
(with-open [dev dev]
(.open dev)
(let [r (.getReceiver dev)
data (DatatypeConverter/parseHexBinary (str "F0437909110A00" 37 "F7"))]
(.send r (SysexMessage. data (count data)) -1)
(.send r (ShortMessage. ShortMessage/NOTE_ON 72 127) -1)
(Thread/sleep 2000)))
package pokemiku;
import javax.sound.midi.MidiDevice;
import javax.sound.midi.MidiSystem;
import javax.sound.midi.Receiver;
import javax.sound.midi.ShortMessage;
import javax.sound.midi.SysexMessage;
import javax.xml.bind.DatatypeConverter;
public class PokeMikuSample {
public static void main(String... args) throws Exception{
try(MidiDevice d = getDevice()){
d.open();
Receiver r = d.getReceiver();
byte[] data = DatatypeConverter.parseHexBinary("F0437909110A00"+ 21 +"F7");
r.send(new SysexMessage(data, data.length), -1);
r.send(new ShortMessage(ShortMessage.NOTE_ON, 80, 127), -1);
Thread.sleep(2000);
}
}
static MidiDevice getDevice() throws Exception{
for(MidiDevice.Info i : MidiSystem.getMidiDeviceInfo()){
if(i.getName().startsWith("NSX-39") && i.getDescription().startsWith("External")){
return MidiSystem.getMidiDevice(i);
}
}
throw new RuntimeException();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment