代码之家  ›  专栏  ›  技术社区  ›  David Koelle

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

  •  10
  • David Koelle  · 技术社区  · 16 年前

    这个简单的代码不会在我用来测试它的两台机器上产生任何声音。我在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并没有配音库(有趣的是,使用音序器可以工作,但使用合成器却不行)。谢谢, thejmc !

    为了解决这个问题,我 downloaded a soundbank from java.sun.com 并将其放入(在winxp上)c:\program files\jre1.6.0_07\lib\audio(必须创建audio文件夹)。

    4 回复  |  直到 12 年前
        1
  •  9
  •   thejmc    16 年前

    JRE的一些安装不包括javasundsoundbank.gm(为了节省空间),因此您的代码在这些机器上没有触发的音源。

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

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

        2
  •  0
  •   Dmitry Khalatov    16 年前

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

        3
  •  0
  •   kgiannakakis    16 年前

    我已经在我的计算机(WindowsXP,JRE1.6)中测试了您的代码,它确实会播放注释。也许只有一个音符太少,听不见。尝试添加更多注释。另外,试着把音量调大些。

        4
  •  0
  •   Amanda S    12 年前

    在关闭合成器之前只需要再进行一次睡眠操作:

    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();
        }
    }