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 键盘不适用于所有平台的主要内容,如果未能解决你的问题,请参考以下文章

Java 从 MIDI 键盘获取输入

iPad替代midi键盘

windowSoftInputMode:当键盘提示文本时,adjustResize 不适用于数字键盘

为啥虚拟键盘不适用于 Qt 中的 QDialog 文本框?

NumberPicker 不适用于键盘

onKeyLongPress 不适用于键盘键