midi键盘无法在所有平台上运行

Joh*_*ane 18 java audio midi

我不久前制作了一个键盘应用程序,它将midi音库作为jar中的资源,并使用它来获取音库中包含的乐器名称.这似乎在使用带有suns java 6的Windows 7和使用suns java 6的linux中的机器上工作正常.但是,这似乎不适用于使用相同版本的java的windows xp的机器.似乎正在发生的getInstrumentName()是调用方法时尚未加载仪器阵列.仪器数组将填充在DefaultControl类的构造函数中(第二个代码示例).有人可以帮助我理解为什么会出现这种情况,为什么它似乎依赖于机器?

我得到这样的当前乐器名称:

data.setControls(new DefaultControls());
data.setKeyboard(new KeyboardPanel(data.getPressed()));
data.getKeyboard().setInstrumentName(data.getControls().getInstrumentName());
Run Code Online (Sandbox Code Playgroud)

我得到并加载这样的音库:

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

this.instrument=synth.getAvailableInstruments();
this.channels=synth.getChannels();
Run Code Online (Sandbox Code Playgroud)

这是调用加载名称的方法是这样的:

public String getInstrumentName(){
    return instrument[selected_instrument].getName();
}
Run Code Online (Sandbox Code Playgroud)

vla*_*ien 1

Java 中的 MIDI 声音库受到许可证限制,并且默认情况下不会为所有平台提供 ( http://java.sun.com/products/java-media/sound/soundbanks.html ),并且需要单独下载和安装多步骤设置才能工作。

答案:格维尔

http://java.net/projects/gervill/pages/Home

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

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