我前一段时间制作了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();
}
答案 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声音库将可供您的应用使用。