我正在编写一个记录键盘MIDI数据的应用程序。
它应该能够录制多个曲目并将它们存储在一个MIDI文件中。 它由三个按钮控制 - “录音”,“停止录音”和“写入MIDI文件”。
我在StackOverflow上跟随this tutorial来编写录制方法。
在我尝试录制第二首曲目之前,一切进展顺利。轨道#2被录制,但它被放置在轨道#1后面的序列中,即它们不能同时在MIDI文件中播放,如果我尝试只播放轨道#2,则会有在它的开头很多空白。
我读到我必须使用
Sequencer.setTickPosition(0);
我做了,但没有任何影响。
以下是代码的一部分:
用户按下“记录”按钮:
sequencer.open();
sequencer.setSequence(mySequence);
newTrack = mySequence.createTrack();
sequencer.setTickPosition(0);
sequencer.recordEnable(newTrack, -1);
sequencer.startRecording();
按下“停止录制”按钮时:
sequencer.stopRecording();
sequencer.recordDisable(newTrack);
最后按下“写入MIDI文件”按钮时:
Sequence tmp = sequencer.getSequence();
MidiSystem.write(tmp, 1, new File("Sequence.MID"));
// *********** **********************
这是我的完整代码:
private MidiDevice inputDevice // Selected from a combo box
private Sequencer sequencer = MidiSystem.getSequencer();
private Transmitter transmitter = inputDevice.getTransmitter();
private Receiver receiver = sequencer.getReceiver();
transmitter.setReceiver(receiver);
private Sequence seq = new Sequence(Sequence.PPQ,24);
private Track newTrack;
/*
.
Buttons added
.
*/
public void actionPerformed( ActionEvent e ){
Object source = e.getSource();
if (source == record){
sequencer.open();
sequencer.setSequence(seq);
newTrack = seq.createTrack();
sequencer.setTickPosition(0);
sequencer.recordEnable(newTrack, -1);
sequencer.startRecording();
}
//*********************************************************************
if (source == stop){
sequencer.stopRecording();
sequencer.recordDisable(newTrack);
}
//******************************************************************
if(source == write){
Sequence tmp = sequencer.getSequence();
MidiSystem.write(tmp, 1, new File("MyMidiFile1.mid"));
}
}
提前感谢任何建议!