我需要“连线”两个音序器:播放器和录音机。 播放器可以接收来自不同来源的midi事件,录音机将负责将整个事件记录到文件中。
以下代码只是用于理解机制的示例,但它无法正常工作。它将创建一个文件,其大小和属性与原始文件非常相似,但无法正常播放。输出文件长度只有3秒,只生成垃圾声!
import javax.sound.midi.*;
import java.io.File;
public class test {
public static void main(String[] args) throws Exception {
Sequence play, record;
Sequencer player, recorder;
Transmitter t;
Receiver r;
try {
play = MidiSystem.getSequence(new File("input.mid"));
record = new Sequence(play.getDivisionType(), play.getResolution(), play.getTracks().length);
player = MidiSystem.getSequencer();
player.open();
player.setSequence(play);
recorder = MidiSystem.getSequencer();
recorder.open();
recorder.setSequence(record);
for (Track track : record.getTracks())
recorder.recordEnable(track, -1);
// Do some wiring
r = recorder.getReceiver();
t = player.getTransmitter();
t.setReceiver(r);
// let the show begin !
recorder.startRecording();
player.start();
Thread.sleep(play.getMicrosecondLength() / 1000);
while (player.isRunning())
;
recorder.stopRecording();
MidiSystem.write(record, MidiSystem.getMidiFileTypes(record)[0], new File("output.mid"));
} catch(Exception e) {
e.printStackTrace();
System.exit(1);
}
System.exit(0);
}
}
任何人都可以查明问题吗? 感谢。
答案 0 :(得分:0)
这里只是一个疯狂的猜测,但我敢打赌,如果你将播放器和录音机放在两个不同的线程中,这将会更好。
答案 1 :(得分:0)
上面代码创建的MIDI文件包含所有相关事件,但它们都是在0时刻堆积的。
也许这是因为“录音机”中的所有曲目都是空的。
无论如何,将(meta)事件添加到“记录”中的其中一个曲目中,以适当的时间点为我工作。
干杯, 恩佐