【问题标题】:MIDI instrument not working for javax.sound.midi.MidiChannelMIDI 乐器不适用于 javax.sound.midi.MidiChannel
【发布时间】:2019-03-01 13:45:32
【问题描述】:

我目前正在开发一个应用程序来使用不同的乐器演奏一些 MIDI。我为此使用了 javax.sound.midi.MidiChannel,它适用于吉他(索引 25)和贝司(索引 32)。现在我想添加一个曼陀林频道;根据 synthesizer.getDefaultSoundbank().getInstruments(),这是索引 215。但是使用下面的代码,Mandolin 通道的程序设置为 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);

【问题讨论】:

    标签: java midi javasound synthesizer


    【解决方案1】:

    理论上您需要使用补丁的.getBank() 方法并将银行编号和程序编号提供给.programChange()

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

    【讨论】:

    • 银行的提示正是我所需要的。在调试视图中,我可以看到,instruments[215] 的银行编号为 2048。所以我将此编号添加到 programChange 方法调用中并且它起作用了:mandolinChannel.programChange(2048,instruments[215].getPatch().getProgram() );
    • 如果代码打算在其他系统上运行,那么请使用getBank() 查找该数字 - 无法保证它始终是 2048。
    【解决方案2】:

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

    在 Wikipedia 上有所有可用的 midi 乐器的列表,您可能会在那里找到与您所寻找的非常接近的东西。

    【讨论】:

    • “Wikipedia 上有所有可用的 midi 乐器列表” Java Sound API 可以提供自己的list of instruments
    猜你喜欢
    • 2011-12-10
    • 1970-01-01
    • 2018-08-16
    • 2015-06-30
    • 1970-01-01
    • 2014-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多