我之前做了一个keyboard application,它从jar中获取一个midi音库作为资源,并使用它来获取包含在音库中的乐器名称。这似乎在使用带有suns java6的windows7和使用sunsjava6的linux的机器上工作得很好,但是在使用相同版本的java的使用windows xp的机器上,这似乎不起作用。似乎正在发生的情况是,在调用getInstrumentName()
方法时尚未加载仪器数组。仪器数组被填充到DefaultControl
类的构造函数中(第二个代码示例)。有人能帮我解释一下为什么会这样吗?为什么它看起来是依赖于机器的?
我得到当前的仪器名称如下:
data.setControls(new DefaultControls());
data.setKeyboard(new KeyboardPanel(data.getPressed()));
data.getKeyboard().setInstrumentName(data.getControls().getInstrumentName());
我像这样获取并加载soundbank:
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();
}
发布于 2011-05-24 08:49:04
在Java中,MIDI声音银行受到许可证限制,并且不是默认为所有平台(http://java.sun.com/products/java-media/sound/soundbanks.html)提供的,并且需要单独下载和多步骤设置才能工作。
The Answer:Gervill
http://java.net/projects/gervill/pages/Home
Java被设计成
的通用合成器。通过将gervill.jar添加到类路径中,您应该能够使用MidiSystem.getSoundBank()加载SoundFonts/DLS文件。而MidiSystem.getSynthesizer()应该返回Gervill合成器的实例。
它是一个开源的100%纯java实现的通用MIDI声音银行。您只需将gervill.jar放在类路径中,就可以了。你的gm声音银行将提供给你的应用程序。
https://stackoverflow.com/questions/5703788
复制相似问题