MIDI 乐器不适用于 javax.sound.midi.MidiChannel

MIDI instrument not working for javax.sound.midi.MidiChannel

我目前正在开发一个使用不同乐器播放 MIDI 的应用程序。我为此使用了 javax.sound.midi.MidiChannel,它适用于吉他(索引 25)和贝斯(索引 32)。现在我想添加一个曼陀林通道;根据 synthesizer.getDefaultSoundbank().getInstruments(),这是索引 215。但是使用下面的代码,曼陀林通道的程序设置为 25(与吉他通道相同)。根据文档,programChange() 方法只允许使用 0 到 127 之间的值... 我有什么想法可以配置我的频道以使用曼陀林作为乐器吗?

        Synthesizer synthesizer = MidiSystem.getSynthesizer();
        synthesizer.open();

        final Instrument[] instruments = synthesizer.getDefaultSoundbank().getInstruments();

        MidiChannel guitarChannel = synthesizer.getChannels()[0];
        guitarChannel.programChange(instruments[25].getPatch().getProgram());

        MidiChannel bassChannel = synthesizer.getChannels()[1];
        bassChannel.programChange(instruments[32].getPatch().getProgram());

        MidiChannel mandolinChannel = synthesizer.getChannels()[2];
        mandolinChannel.programChange(instruments[215].getPatch().getProgram());

        mandolinChannel.noteOn(note, 100);

General MIDI 中总共只有 128 个乐器程序,因此您将无法使用可能不存在的乐器 215。

维基百科上列出了所有可用的 MIDI 乐器,您也许可以在那里找到与您所寻找的非常接近的东西。

理论中,您需要使用补丁的.getBank()方法并将库号和程序号提供给.programChange()

实际上,当我尝试自己复制您的问题时,默认的 com.sun.media.sound.SoftSynthesizer 似乎根本不支持银行更改。