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

时间:2011-04-18 13:42:58

标签: java audio midi

我前一段时间制作了keyboard application,它将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());

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

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();
}

1 个答案:

答案 0 :(得分:1)

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

答案:Gervill

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

  

Gervill被设计为通用的   适用于Java的合成器。通过增加   gervill.jar到你的classpath你   应该能够加载SoundFonts / DLS   使用MidiSystem.getSoundBank()的文件。   并且MidiSystem.getSynthesizer()应该   返回Gervill的实例   合成

这是一般的MIDI声音库的开源100%纯java实现。你只需在类路径中删除gervill.jar就可以了。您的gm声音库将可供您的应用使用。

相关问题