录制多个MIDI轨道

时间:2016-01-19 16:45:41

标签: java midi javasound

我正在编写一个记录键盘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"));  

  } 

}

提前感谢任何建议!

0 个答案:

没有答案