10

这个简单的代码在我用来测试它的几台机器上没有产生任何声音。我在 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 有效,但使用 Synthesizer 没有)。谢谢,jmc

为了解决这个问题,我从 java.sun.com 下载了一个音库并将其放在(在 WinXP 上)C:\Program Files\jre1.6.0_07\lib\audio(必须制作音频文件夹)。

4

4 回答 4

9

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

检查不工作的机器上是否存在音库。您还可以将音库与 .class 文件放在同一目录中,它会找到它。

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

于 2009-01-13T21:57:40.957 回答
0

您是否尝试过使用不同的频道?可能这个讨论会让你更接近解决方案......

于 2008-12-19T07:42:12.560 回答
0

我已经在我的机器(Windows XP、JRE 1.6)上测试了你的代码,它确实会播放音符。也许只有一个音符太少听不见。尝试添加更多注释。另外,尝试将音量设置得更大一些。

于 2008-12-19T08:24:48.623 回答
0

在关闭合成器之前只需要 1 个睡眠动作:

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();
    }
}
于 2009-04-13T00:27:16.423 回答