我想从MIDI钢琴中获取数据流。 我在这里使用了来自另一个MIDI相关问题的一些代码,但我似乎无法使其工作,因为我收到此消息:
mai 31,2016 4:20:16 PM java.util.prefs.WindowsPreferences
警告:无法在根0x80000002处打开/创建prefs根节点Software \ JavaSoft \ Prefs。 Windows RegCreateKeyEx(...)返回错误代码5。
我用来存储应该读取的内容的轨道也只包含一个ImmutableEndOfTrack。
最后,我们的目标是获得所播放音符的流,而不是像听众那样存储它们。
import javax.sound.midi.*;
public class Main {
private static final String DEVICE_NAME = "Medeli e-Drum "; // MIDI piano
public static void main(String args[]) {
MidiDevice md = null;
Sequencer seqr = null;
Transmitter trans = null;
Receiver rec = null;
Sequence seq = null;
Track currTrack = null;
try {
seq = new Sequence(Sequence.PPQ, 24);
currTrack = seq.createTrack();
seqr = MidiSystem.getSequencer();
seqr.setSequence(seq);
seqr.setTickPosition(0);
seqr.recordEnable(currTrack, -1);
// get MIDI device by DEVICE_NAME
for(MidiDevice.Info md_i : MidiSystem.getMidiDeviceInfo())
if(DEVICE_NAME.equals(md_i.getName()))
md = MidiSystem.getMidiDevice(md_i);
if(!md.isOpen())
md.open();
seqr.open();
seqr.startRecording();
Thread t = new Thread(new Runnable() { // Just to have the time to play on the piano
@Override
public void run() {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
t.start();
t.join();
seqr.stopRecording();
for(int i = 0 ; i < currTrack.size() ; i++)
System.out.println(currTrack.get(i).getMessage());
} catch (InvalidMidiDataException e) {
e.printStackTrace();
} catch (MidiUnavailableException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
md.close();
seqr.close();
}
}
}