2011-05-12 5 views
1

이 짧은 프로그램을 작성하여 javax.sound.midi 시스템을 학습했습니다. 이것은 Java 6을 사용합니다. 출력은 예상대로 (Sequencer 이벤트에 의해 트리거되는 일련의 System.out.println() 문자열)이지만 마지막 음향 효과 후 프로그램이 루프에 있고 ' 예상대로 종료하지 마십시오.Java Midi 출력을 종료하십시오.

누구든지 해결 방법을 말할 수 있습니까? 도움을 주셔서 감사합니다 :

import javax.sound.midi.MidiEvent; 
import javax.sound.midi.ShortMessage; 
import javax.sound.midi.InvalidMidiDataException; 
import javax.sound.midi.ControllerEventListener; 
import javax.sound.midi.Sequencer; 
import javax.sound.midi.MidiSystem; 
import javax.sound.midi.Sequence; 
import javax.sound.midi.Track; 
import javax.sound.midi.InvalidMidiDataException; 
import javax.sound.midi.MidiUnavailableException; 

class MySound { 

    public static MidiEvent makeEvent(int comd, int chan, int one, 
             int two, int tick) { 
     MidiEvent event = null; 

     try { 

      ShortMessage a = new ShortMessage(); 
      a.setMessage(comd, chan, one, two); 
      event = new MidiEvent(a, tick); 

     } catch (InvalidMidiDataException imde) { 

      imde.printStackTrace(); 
     }  

     return event; 
    } 
} 

class MyControllerListener implements ControllerEventListener { 

    public void controlChange(ShortMessage event) { 

     System.out.println("la"); 
    } 
} 

class SoundEffects { 

    public static void main(String[] args) { 

     try { 

      Sequencer seq = MidiSystem.getSequencer(); 
      seq.open(); 

      int[] events = { 127 }; 

      MyControllerListener mcl = new MyControllerListener(); 

      seq.addControllerEventListener(mcl, events); 

      Sequence s = new Sequence(Sequence.PPQ, 4); 

      Track t = s.createTrack(); 

      for (int i = 5; i < 60; i += 4) { 

       t.add(MySound.makeEvent(144, 1, i, 100, i)); 
       t.add(MySound.makeEvent(176, 1, 127, 0, i)); 
       t.add(MySound.makeEvent(128, 1, i, 100, i + 2)); 
      } 

      seq.setSequence(s); 

      seq.setTempoInBPM(220); 

      seq.start(); 

     } catch (InvalidMidiDataException imde) { 

      imde.printStackTrace(); 

     } catch (MidiUnavailableException mue) { 

       mue.printStackTrace(); 
     }  
    } 
} 

답변

4

트랙 재생이 끝나면 seq.close()를 호출해야합니다. 그렇게하는 방법은 메타 메시지 리스너를 추가하고 0x2F 유형의 메시지 (선택 사항이 아닌 메타 메시지 "end of track")를 만날 때 close()를 호출하는 것입니다. 당신이 익명 인터페이스 구현에 참조하기 위해 seqfinal 수정을 추가해야

 seq.addMetaEventListener(new MetaEventListener() { 

      @Override 
      public void meta(MetaMessage metaMsg) { 
       if (metaMsg.getType() == 0x2F) { 
        seq.close(); 
       } 
      } 
     }); 

참고 : 코드를 다음과 같이 보일 것입니다.

희망이 있습니다.