2011-01-22 118 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(); 
} 

我已經看到了你可以發送跟蹤PROGRAM_CHANGE事件表示儀器正在改變,但我不知道如何去創建對象來保存必要的信息並將其添加到軌道。 非常感謝。

回答

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法「」參數的儀器發揮的數量。

0

我的猜測是drumPatch.getBank()drumPatch.getProgram()會將當前播放的同一個節目應用到當前頻道。您應該將新的銀行和程序編號傳遞給LoadInstrument()方法,並將其傳遞給程序更改參數。

+0

對不起,我不明白你的答案,我選擇正確的樂器,然後將它分配給補丁變量。然後我將這個程序更改與新的補丁信息一起應用到所有通道。我遵循這個例子http://www.informit.com/articles/article.aspx?p=20457,正如你可以看到作者直接使用頻道,而我正在使用一個曲目。 – 2011-01-23 18:38:36