2011-01-22 6 views
1

트랙을 사용하여 내 noteOn/noteOff 이벤트를 재생하고 있으며 모든 것이 의도 한대로 작동합니다. 문제는 내가 사용하고있는 악기를 변경하고 싶습니다. 선로.트랙 재생 중 악기 변경 - MIDI/Java

새로운 악기로 모든 MIDI 채널에서 "프로그램 변경"명령을 호출하도록 설계된 다음 코드를 생각해 냈습니다. 문제는 내가 트랙에 적용하는 방법을 알아 냈습니다. 악기가 다르다. 난 당신이 악기가 변화하지만 필요한 정보를 보유하는 객체를 생성하고 트랙에 추가 대해 이동하는 방법을 잘 모르겠어요 의미하는 트랙에게 PROGRAM_CHANGE 이벤트를 보낼 수있는 본 적이

public void LoadInstrument() 
{ 
    for(int i = 0; i < instruments.length; i++) 
    { 
     if(instruments[i].getName() == "Clean Guitar") 
     { 
      instrumentToLoad = instruments[i]; 
     } 
    } 

    drumPatch = instrumentToLoad.getPatch(); 
} 

. 많은 감사.

답변

4

수행 한 후 조금 더 나는 해결책을 발견했습니다 주위에 파고 :

  try 
     { 
      ShortMessage instrumentChange = new ShortMessage(); 

      instrumentChange.setMessage(ShortMessage.PROGRAM_CHANGE, 0, 6,0); 

      //MidiEvent instrumentChange = new MidiEvent(ShortMessage.PROGRAM_CHANGE,drumPatch.getBank(),drumPatch.getProgram()); 
      track.add(new MidiEvent(instrumentChange,0)); 
     } 
     catch(Exception e) 
     { 
      //Handle 
     } 

참고 : .setMessage 방법의 "6"매개 변수입니다 재생 기기의 수.

0

내 생각에 drumPatch.getBank()drumPatch.getProgram()은 현재 재생중인 현재 채널에 동일한 프로그램을 적용합니다. 새 은행 번호와 프로그램 번호를 LoadInstrument() 방법에 전달하여 프로그램 변경 인수로 전달해야합니다.

+0

나는 당신의 대답을 이해할 수 없다. 올바른 도구를 선택하고 패치 변수에 그것을위한 패치를 할당한다. 그런 다음 새 패치 정보가 포함 된 프로그램 변경 사항을 모든 채널에 적용합니다. 저는이 예제를 따르고 있습니다. http://www.informit.com/articles/article.aspx?p=20457 저자가 볼 수 있듯이 트랙을 직접 사용하는 반면 저자는 채널을 직접 사용합니다. –