在音轨播放期间更改乐器 - MIDI / Java

时间:2011-01-22 22:47:25

标签: java audio instruments midi

我正在使用音轨来播放我的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。 非常感谢。

2 个答案:

答案 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()方法,并将其传递给程序更改参数。