录制后,Java Midi Sequencer无法播放

时间:2016-01-09 21:18:18

标签: java midi

我写了一个midi录音机,后来应该播放这首曲目:

Sequencer seqr=MidiSystem.getSequencer();

//Transmitters and receivers here

seqr.startRecording();

//Some Stuff (basically waiting)

seqr.stopRecording();
seqr.setTickPosition(0);
seqr.setLoopStartPoint(0);
seqr.setLoopEndPoint(seqr.getTickLength());
seqr.setLoopCount(Sequencer.LOOP_CONTINUOUSLY);
seqr.start();

它没有,但是 - 这让我感到困惑 - 如果我添加:

File midFile=new File("MyMidiFile.mid");
MidiSystem.write(seqr.getSequence(), 1, midFile);
seqr.setSequence(MidiSystem.getSequence(midFile));

播放stopRecoding()之后

告诉我,录音和播放工作正常。

//问题结束

修改

我要求的整个midi代码

发射器和接收器

public static MidiDevice inputDevice;
public static MidiDevice outputDevice;
public static Transmitter usbTransmitter;
public static Receiver usbReciever;

public static Sequencer seqr;
public static Transmitter seqTransmitter;
public static Receiver seqReciever;

初​​始化:

try{
    seqr = MidiSystem.getSequencer();

    Info[] midiDeviceInfo = MidiSystem.getMidiDeviceInfo();

    inputDevice = MidiSystem.getMidiDevice(midiDeviceInfo[1]);
    outputDevice = MidiSystem.getMidiDevice(midiDeviceInfo[4]);
    seqr = MidiSystem.getSequencer();
    inputDevice.open();
    outputDevice.open();
    seqr.open();

    seqReciever = seqr.getReceiver();
    seqTransmitter = seqr.getTransmitters().get(0);

    usbTransmitter = inputDevice.getTransmitter();
    usbReciever = outputDevice.getReceiver();
    usbTransmitter.setReceiver(seqReciever);
    seqTransmitter.setReceiver(usbReciever);

    Sequence seq = new Sequence(Sequence.PPQ, 24);

    seqr.setSequence(seq);
    seqr.setTickPosition(0);
} catch (MidiUnavailableException | InvalidMidiDataException e) {
    e.printStackTrace();
}

录音:

Track track;
Sequencer seqr;
Sequence seq;

public TrackControler(Sequencer seqr) {
    this.seqr = seqr;
    this.seq = seqr.getSequence();
    this.track = seq.createTrack();
}

private void startRecordNow() {
    seqr.recordEnable(track, -1);
    seqr.startRecording();
}

private void endRecordNow() {
    seqr.stopRecording();

    seqr.setTickPosition(0);
    seqr.setLoopStartPoint(0);
    seqr.setLoopEndPoint(seqr.getTickLength());
    seqr.setLoopCount(Sequencer.LOOP_CONTINUOUSLY);
    seqr.start();
}

1 个答案:

答案 0 :(得分:1)

在没有看到您的MIDI录音或播放代码的情况下,我不得不猜测MidiSystem.write()Sequencer.setSequence()正在进行一些您正在忽略的初始化。我的第二个猜测是Sequencer.stopRecording()不会让事情处于正确的状态。

如果没有进一步的信息,这是我能做的最好的事情。

更新(因此您无需浏览评论):

似乎Java做了一些缓存,需要seqr.setSequence(seqr.getSequence()之类的东西来提交缓存。我已经找到了更直接的方法来做到这一点,但还没找到任何东西。