这个简单的代码在我用来测试它的几台机器上没有产生任何声音。我正在运行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(必须制作音频文件夹)。
答案 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();
}
}