2011-07-17 2 views
5

Java Sequencer을 사용하여 MIDI 곡을 재생 중입니다. 이 노래는 계속 반복 재생되도록 설계되어 있습니다. sequencer. setLoopCount (Sequencer.LOOP_CONTINUOUSLY)
내부 (사운드 카드) 신시사이저를 통해 재생할 때 제대로 작동하고 (필요한 경우 dummy event이 추가됨) 루프 타이밍이 켜져 있습니다.초기 설정 이벤트에서 MIDI 곡 이벤트를 분리하십시오.

그러나 외부 (USB 또는 직렬) 신스를 통해 재생할 때 출력에서 ​​루프가 발생하는 지점에서 현저한 차이가 있습니다. 이것은 .mid 파일의 시작 부분에 시리얼 라인을 통해 전송되는 데 시간이 걸리는 많은 설정 이벤트가 있다는 사실에 의해 설명됩니다.

노래를로드했지만 기본 (루프 된) Sequence을 사용하지 않을 때 장치에 한 번만 전송되는 Sequence으로 일회성 설치 이벤트를 격리하려고합니다.

두 가지 종류의 이벤트를 구별 할 수있는 간단한 알고리즘 (또는 라이브러리 함수)이 있습니까?

그것은을 제공해야합니다 : 관련 메시지의 그룹으로 전송됩니다

  • Registered parameter 변경됩니다.
  • 경우에 따라 채널 프로그램 변경 사항이 트랙의 중간에 보내지지만 루프 된 시퀀스의 일부 여야합니다.하지만 동일한 프로그램이 노래 전체에 걸쳐 유지되는 경우 (대부분의 경우) 프로그램 변경은 설정 순서. 템포 변경에도 동일하게 적용됩니다.
+0

* 이것은 .mid 파일의 시작 부분에 시리얼 라인을 통해 전송되는 데 다소 시간이 걸리는 많은 설정 이벤트가 있다는 사실에 의해 설명됩니다. * - 이것은 가정 또는 guestimation입니까, 아니면 소스가 있습니까? techincal 기사 또는 디버깅 출력)을 보여줄 수 있습니까? –

+1

@Charles Goodwin, 아니요 수동으로 이벤트를 제거하여 테스트했습니다. – finnw

답변

3

javax.sound.midi를 살펴보십시오. 시퀀스는 트랙으로 구성됩니다. 트랙에는 MidiEvent가 포함됩니다. MidiEvent는 타임 스탬프와 MidiMessage의 조합입니다.

MidiMessage에는 ShortMessage, MetaMessage 및 SysexMessage 하위 클래스가 있습니다.

아마도 Tick 0 (MidiEvent.getTick() == 0)에서 SysexMessages를 필터링하면 트릭을 수행합니다. 그렇지 않다면 틱 0에서 MetaMessages도 필터링 해보십시오. 참고 정보, 프로그램 변경 등은 ShortMessages를 통해 수행되며 필터링하지 마십시오.

for each track in sequence { 
    for all midievents in track at tick 0 { 
    remove from track if instanceof SysexMessage or MetaMessage 
    } 
} 

다른 부분은 초기화 시퀀스를 만드는 것입니다. 같은 divisionType과 해상도로 Sequence를 생성하면됩니다. 하나의 트랙으로 충분합니다. 반복 시퀀스에서 제거 된 모든 이벤트를 초기화 시퀀스의 단일 트랙에 추가 할 수 있습니다.

+0

MetaMessage는 전선을 통해 전송되지 않으므로 문제의 일부가 아닙니다. – finnw

관련 문제