Java midi键盘不适用于所有平台

Java midi键盘不适用于所有平台,java,audio,midi,Java,Audio,Midi,不久前,我制作了一个从jar中获取midi声音库作为资源的程序,并使用它获取声音库中包含的乐器名称。在使用Windows7和Sun java 6的机器上,以及在使用Sun java 6的linux上,这似乎都能很好地工作。但是,在使用相同版本java的windows xp的机器上,这似乎不起作用。调用getInstrumentName()方法时,似乎没有加载仪器阵列。仪器阵列填充在DefaultControl类的构造函数中(第二个代码示例)。有人能帮我理解为什么会出现这种情况,为什么它看起来依赖

不久前,我制作了一个从jar中获取midi声音库作为资源的程序,并使用它获取声音库中包含的乐器名称。在使用Windows7和Sun java 6的机器上,以及在使用Sun java 6的linux上,这似乎都能很好地工作。但是,在使用相同版本java的windows xp的机器上,这似乎不起作用。调用
getInstrumentName()
方法时,似乎没有加载仪器阵列。仪器阵列填充在
DefaultControl
类的构造函数中(第二个代码示例)。有人能帮我理解为什么会出现这种情况,为什么它看起来依赖于机器

我得到的当前仪器名称如下:

data.setControls(new DefaultControls());
data.setKeyboard(new KeyboardPanel(data.getPressed()));
data.getKeyboard().setInstrumentName(data.getControls().getInstrumentName());
我获取并加载声音库,如下所示:

this.synth=MidiSystem.getSynthesizer();
synth.open();
synth.loadAllInstruments(
  MidiSystem.getSoundbank(
    getClass().getResourceAsStream("soundbank.gm")));

this.instrument=synth.getAvailableInstruments();
this.channels=synth.getChannels();
这是为加载而调用的方法。名称如下:

public String getInstrumentName(){
    return instrument[selected_instrument].getName();
}

Java中的MIDI音箱受许可证限制,默认情况下并非所有平台都提供(),需要单独下载和多步骤设置才能工作

答案是:格维尔

Gervill被设计成通用的 Java合成器。加入 将gervill.jar添加到您的类路径 应该能够加载SoundFonts/DLS 使用MidiSystem.getSoundBank()的文件。 和MidiSystem.getSynthesizer()应该 Gervill的返回实例 合成器


它是通用MIDI声音库的100%纯java开源实现。您只需将gervill.jar放在类路径中即可。您的gm声音库将可用于您的应用程序。

有例外吗?可能的JDK错误?它是引发的数组索引越界异常。这很奇怪,因为只有在没有抛出错误且声音库成功加载的情况下才会调用get name。这可能与您引用的错误有关。我将对此进行研究。我使用JDK 1.6.024在XP上使用jar外部的声音库对其进行了测试。我不知道有什么不同?我不确定这是否是问题所在。我正在从jar中读取midi声音库作为资源。我没有加载默认系统声音库。在某些操作系统上,这个问题似乎更像是类加载器的问题。当我尝试调用getInstrumentName时,它只在类实例化之后发生(数组应该在构造函数中填充)。这已经在运行同一版本java的不同机器上进行了测试