2012-03-17 2 views
0

나는 현재 재생 한 음표를 사용자가 재생할 수있는 기능을 구현했습니다.Java Midi 시퀀서 - 재생 헤드로 재생 참고 사항

public void playNotes() throws InvalidMidiDataException, 
     MidiUnavailableException { 

    ArrayList<KeyPress> keyPressList = keyPressListCollection.getKeyPressList(); 
    double bpm = keyPressListCollection.getMetronome().getBpm(); 
    double millisPerTick = (60000.0/(bpm * 16.0)); 
    double ticksPerMilli = 1/millisPerTick; 

    if (keyPressListCollection.isPlaying()) { 
     sequencer.stop(); 
     sequencer.close(); 
    } 

    sequencer = MidiSystem.getSequencer(); 
    sequencer.open(); 
    Sequence sequence = new Sequence(Sequence.PPQ, 16); 
    Track track = sequence.createTrack(); 

    for (int i = 0; i < keyPressList.size(); i++) { 
     KeyPress keyPress = keyPressList.get(i); 

     ShortMessage noteOnMsg = new ShortMessage(); 
     noteOnMsg.setMessage(ShortMessage.NOTE_ON, 0, keyPress.getKeyNumber(), keyPress.getVelocity()); 

     ShortMessage noteOffMsg = new ShortMessage(); 
     noteOffMsg.setMessage(ShortMessage.NOTE_OFF, 0, keyPress.getKeyNumber(), 0); 

     track.add(new MidiEvent(noteOnMsg, (long) (keyPress.getStartTime() * ticksPerMilli))); 
     track.add(new MidiEvent(noteOffMsg, (long) (keyPress.getEndTime() * ticksPerMilli))); 

    } 

    keyPressListCollection.setPlaying(true); 
    sequencer.setSequence(sequence); 
    sequencer.setTempoInBPM((float) bpm); 
    sequencer.start(); 

이 잘 작동하고 플레이 내 ArrayList에있는 메모를이다 : 여기

는 코드입니다. 그러나 나는 어떤 음표가 연주되고 있는지 또는 연주의 위치가 사용자에게 시각적으로 보여지기를 원합니다.

질문 : 시퀀서가 처리하는 각 MidiEvent에 대해 메소드 호출을 작성하려면 어떻게해야합니까?

답변

1

진행 상황을 차트로 표시하는 데 사용할 수있는 "메타 이벤트"를 만들면 진행 상황을 알려주는 MetaEventListener를 갖출 수 있습니다. 각 음표 시작에 대해 "틱"처럼 간단 할 수 있습니다.

getMicroSecondPosition 또는 Length를 통해 쿼리하는 경우 업데이트의 타이밍과 정확도는 경우에 따라 설문 조사에 의해 결정됩니다. 때로는 괜찮습니다. MetaEventListener를 사용하면 이벤트 자체가 트리거됩니다.