我正在使用音轨来播放我的noteOn / noteOff事件,一切都按预期工作,我遇到的问题是我想要更改音轨中使用的乐器。
我想出了下面的代码,它设计了用新乐器调用所有MIDI通道上的“程序更改”命令,我遇到的问题是如何将这个应用到轨道上这样的乐器是不同的。
public void LoadInstrument()
{
for(int i = 0; i < instruments.length; i++)
{
if(instruments[i].getName() == "Clean Guitar")
{
instrumentToLoad = instruments[i];
}
}
drumPatch = instrumentToLoad.getPatch();
}
我已经看到你可以发送Track一个PROGRAM_CHANGE事件来表示仪器正在改变,但我不知道如何创建对象来保存必要的信息并将其添加到Track。 非常感谢。
答案 0 :(得分: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 ”参数是要播放的乐器编号。
答案 1 :(得分:0)
我的猜测是drumPatch.getBank()
和drumPatch.getProgram()
会将当前频道的相同节目应用到当前播放的频道。您应该将新的银行和程序编号传递给LoadInstrument()
方法,并将其传递给程序更改参数。