2012-06-04 3 views
0

두 개의 시퀀서 : 플레이어와 레코더를 "연결"해야합니다. 플레이어는 여러 소스에서 미디 이벤트를 수신 할 수 있으며 레코더는 모든 것을 파일로 레코딩하는 역할을 담당합니다.미디 시퀀서 연결

다음 코드는 메커니즘을 이해하기위한 샘플 일 뿐이지 만 제대로 작동하지 않습니다. 원본과 크기 및 속성이 매우 비슷하지만 올바르게 재생되지 않는 파일이 생성됩니다. 출력 파일의 길이는 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에 쌓여있다가 아마도 이것은이다.

어쨌든, 미래의 적절한 틱에서 "기록"의 트랙 중 하나에 (메타) 이벤트를 추가하면 나를 위해 일했습니다.

건배, 엔조 대답에 대한