MIDI 键盘不适用于所有平台
Posted
技术标签:
【中文标题】MIDI 键盘不适用于所有平台【英文标题】:midi keyboard not working on all platforms 【发布时间】:2011-04-18 13:42:57 【问题描述】:我不久前创建了一个keyboard application,它从一个 jar 中获取一个 midi 音库作为资源,并使用它来获取音库中包含的乐器名称。这似乎在使用带有 suns java 6 的 windows 7 的机器上以及在使用 suns java 6 的 linux 上运行良好。但是,这似乎不适用于使用 windows xp 使用相同版本的 java 的机器。似乎正在发生的事情是在调用 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();
【问题讨论】:
有什么例外吗?可能的JDK错误? bugs.sun.com/bugdatabase/view_bug.do?bug_id=4444193 它是一个数组索引越界异常被抛出。这很奇怪,因为只有在没有引发错误并且声音库加载成功时才会调用 get name。 这可能与您提到的错误有关,我将对此进行调查。 我使用 JDK 1.6.0_24 在 XP 上使用 jar 外的音库对其进行了测试。我想知道有什么不同? 【参考方案1】:Java 中的 MIDI 音色库受许可证限制,默认情况下并非针对所有平台 (http://java.sun.com/products/java-media/sound/soundbanks.html) 提供,并且需要单独下载和多步骤设置才能工作。
答案:格维尔
http://java.net/projects/gervill/pages/Home
Gervill 被设计成通用的 Java的合成器。通过增加 gervill.jar 到你的类路径 应该能够加载 SoundFonts/DLS 使用 MidiSystem.getSoundBank() 的文件。 MidiSystem.getSynthesizer() 应该 返回 Gervill 的实例 合成器。
它是通用 MIDI 音色库的开源 100% 纯 Java 实现。您只需将 gervill.jar 放到类路径中即可。您的 gm 声音库将可供您的应用使用。
【讨论】:
我不太确定这是问题所在。我正在阅读 MIDI 音库作为 jar 中的资源。我没有加载默认系统音库。在某些操作系统上,这个问题似乎更像是一个类加载器问题。当我尝试调用仅在类实例化后发生的 getInstrumentName 时(应在构造函数中填充数组)。这已经在运行相同版本 java 的不同机器上测试过以上是关于MIDI 键盘不适用于所有平台的主要内容,如果未能解决你的问题,请参考以下文章