在音轨播放期间更改乐器 - 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的主要内容,如果未能解决你的问题,请参考以下文章

gtp5如何多音轨编曲、、

如何在音轨中找到静音部分

Java MIDI - ControllerEventListener(如何更改乐器)

Kdenlive 不会在音轨上显示红色的音频录制按钮

如何在 C++ 中使用 ffmpeg 动态更改视频的音轨?

如何在播放期间切换音轨