Java Midi Sequencer 录音后不播放
Java Midi Sequencer doesn't play after recording
我写了一个小的 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();
}
在没有看到您的 MIDI 录音或播放代码的情况下,我不得不猜测 MidiSystem.write()
或 Sequencer.setSequence()
正在执行一些您忽略的初始化。我的第二个猜测是 Sequencer.stopRecording()
没有让事情处于正确的状态以供播放。
这是我在没有更多信息的情况下所能做的最好的。
更新(这样你就不用翻看评论了):
似乎 Java 做了一些缓存,需要像 seqr.setSequence(seqr.getSequence()
这样的东西来提交缓存。我一直在寻找一种更直接的方法来做到这一点,但还没有找到任何东西。
我写了一个小的 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();
}
在没有看到您的 MIDI 录音或播放代码的情况下,我不得不猜测 MidiSystem.write()
或 Sequencer.setSequence()
正在执行一些您忽略的初始化。我的第二个猜测是 Sequencer.stopRecording()
没有让事情处于正确的状态以供播放。
这是我在没有更多信息的情况下所能做的最好的。
更新(这样你就不用翻看评论了):
似乎 Java 做了一些缓存,需要像 seqr.setSequence(seqr.getSequence()
这样的东西来提交缓存。我一直在寻找一种更直接的方法来做到这一点,但还没有找到任何东西。