如何从Java流式传输MIDI钢琴的输入?

时间:2016-05-31 14:48:34

标签: java midi

我想从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();
        }
    }
}

0 个答案:

没有答案