如何在Java中对MIDI钢琴的输入进行流式处理?

如何在Java中对MIDI钢琴的输入进行流式处理?,java,midi,Java,Midi,我想流数据,我可以从一个MIDI钢琴。 我在这里使用了另一个MIDI相关问题中的一些代码,但我似乎无法让它工作,因为我得到了以下信息: 2016年5月31日下午4:20:16 java.util.prefs.WindowsPreferences 警告:无法在根0x8000002处打开/创建prefs根节点Software\JavaSoft\prefs。Windows RegCreateKeyEx(…)返回错误代码5 我用来存储应该读取的内容的磁道也只包含一个不可变的EndofTrack 最终,我

我想流数据,我可以从一个MIDI钢琴。 我在这里使用了另一个MIDI相关问题中的一些代码,但我似乎无法让它工作,因为我得到了以下信息:

2016年5月31日下午4:20:16 java.util.prefs.WindowsPreferences

警告:无法在根0x8000002处打开/创建prefs根节点Software\JavaSoft\prefs。Windows RegCreateKeyEx(…)返回错误代码5

我用来存储应该读取的内容的磁道也只包含一个不可变的EndofTrack

最终,我们的目标是播放一个音符流,而不是像听众一样存储它们

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();
        }
    }
}
导入javax.sound.midi.*;
公共班机{
专用静态最终弦乐设备\u NAME=“Medeli e-Drum”//MIDI钢琴
公共静态void main(字符串参数[]){
MIDI设备md=null;
Sequencer seqr=null;
传送器trans=null;
Receiver rec=null;
序列seq=null;
Track currTrack=null;
试一试{
seq=新序列(Sequence.PPQ,24);
currTrack=seq.createTrack();
seqr=MidiSystem.getSequencer();
顺序设置顺序(顺序);
seqr.setTickPosition(0);
seqr.recordEnable(currTrack,-1);
//按设备名称获取MIDI设备
对于(MidiDevice.Info md_i:MidiSystem.getMidiDeviceInfo())
if(DEVICE_NAME.equals(md_i.getName()))
md=MidiSystem.getMidiDevice(md_i);
如果(!md.isOpen())
md.open();
seqr.open();
seqr.startRecording();
Thread t=新线程(new Runnable(){//只是为了有时间在钢琴上弹奏
@凌驾
公开募捐{
试一试{
睡眠(5000);
}捕捉(中断异常e){
e、 printStackTrace();
}
}
});
t、 start();
t、 join();
seqr.stopRecording();
对于(int i=0;i
看看这个问题的答案。这可能对你有所帮助:谢谢你的回答。(最后,我曾经解决过这个问题。但现在,主要问题仍然存在)看看这个问题的答案。这可能对你有所帮助:谢谢你的回答。(最后,我曾经解决过这个问题。但现在,主要问题仍然存在)