简单的Java MIDI示例不产生任何声音

时间:2008-12-19 04:28:10

标签: java midi

这个简单的代码在我用来测试它的几台机器上没有产生任何声音。我正在运行Eclipse中的代码,但我也尝试使用命令行无济于事。

public static void main(String[] args)
{
    try {
        Synthesizer synthesizer = MidiSystem.getSynthesizer();
        synthesizer.open();

        MidiChannel[] channels = synthesizer.getChannels();

        channels[0].noteOn(60, 60);
        Thread.sleep(200);
        channels[0].noteOff(60);

        synthesizer.close();
    } catch (Exception e)
    {
        e.printStackTrace();
    }
}

我能够通过获取音序器,将MIDI事件添加到序列并播放序列来成功获得声音,但我正在尝试做一些实时音乐效果,音序器不支持。

有什么想法吗?

编辑解决方案:事实证明问题在于,默认情况下,JRE没有声音库(有趣的是,使用Sequencer工作,但使用合成器没有“T)。谢谢,thejmc

要解决这个问题,我downloaded a soundbank from java.sun.com并把它放在(在WinXP上)C:\ Program Files \ jre1.6.0_07 \ lib \ audio(必须制作音频文件夹)。

4 个答案:

答案 0 :(得分:9)

某些安装的JRE不包含JavaSound soundbank.gm(为了节省空间),因此您的代码不会在这些计算机上触发声源。

检查无效机器上是否存在声音库。您也可以将声库放在与.class文件相同的目录中,它会找到它。

可以添加声音库或升级那些机器上的Java安装 - 不一致的痛苦,我知道:)

答案 1 :(得分:0)

你试过使用不同的频道吗? 可能会this discusson让您更接近解决方案......

答案 2 :(得分:0)

我已经在我的机器上测试了你的代码(Windows XP,JRE 1.6)并且它确实发挥了笔记。也许只有一个音符太少听不到。尝试添加更多笔记。另外,尝试设置音量更大。

答案 3 :(得分:0)

在关闭合成器之前只需要再做一次睡眠动作:

public static void main(String[] args)
{
    try {
        Synthesizer synthesizer = MidiSystem.getSynthesizer();
        synthesizer.open();

        MidiChannel[] channels = synthesizer.getChannels();

        channels[0].noteOn(60, 60);
        Thread.sleep(200);
        channels[0].noteOff(60);
        Thread.sleep(200);

        synthesizer.close();
    } catch (Exception e)
    {
        e.printStackTrace();
    }
}