2012-06-04 38 views
0

我需要“连接”两个音序器:播放器和录音机。 玩家可能会收到来自不同来源的midi事件,录音机将负责将整个事件录制到文件中。连线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

感谢您的回答。即使将播放器和录音机放在不同的线程中也不能解决问题。 –

0

上面的代码创建的MIDI文件包含所有相关的事件,但它们在蜱0

所有堆积也许这是因为在“记录”的所有曲目都是空的。

无论如何,在未来适当的刻度线添加一个(元)事件到“记录”中的轨道之一对我来说很合适。

干杯, 恩佐