在音轨播放期间更改乐器 - MIDI/Java
Posted
技术标签:
【中文标题】在音轨播放期间更改乐器 - MIDI/Java【英文标题】:Changing instrument during Track playback - MIDI/Java 【发布时间】:2011-01-22 22:47:25 【问题描述】:我正在使用轨道来播放我的 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。 非常感谢。
【问题讨论】:
【参考方案1】:经过一番挖掘后,我找到了解决方案:
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”参数是要演奏的乐器的编号。
【讨论】:
【参考方案2】:我的猜测是drumPatch.getBank()
和drumPatch.getProgram()
将把相同的节目应用到当前正在播放的频道。您可能应该将新的银行和程序编号传递给您的 LoadInstrument()
方法,然后将其传递给程序更改参数。
【讨论】:
对不起,我不明白你的答案,我选择了正确的仪器,然后将它的补丁分配给补丁变量。然后,我将带有新补丁信息的程序更改应用到所有通道。我正在关注这个例子informit.com/articles/article.aspx?p=20457,你可以看到作者直接使用频道,而我使用的是轨道。以上是关于在音轨播放期间更改乐器 - MIDI/Java的主要内容,如果未能解决你的问题,请参考以下文章