我已经制作了一个java程序,它使用java声音API中的MIDI包合成声音,但是,当我将它导出到.jar文件时,播放的声音与我在eclipse中运行它时的声音完全不同。有谁知道它为什么这样做或如何解决这个问题?
可在此处找到这些工具列表:http://www.hittrax.com.au/images/artists/gmgs.pdf
以下是我的代码的一部分
try {
Synthesizer synth = MidiSystem.getSynthesizer();
synth.open();
MidiChannel[] channels = synth.getChannels();
channels[0].programChange(123); // Set the instrument to be played (integer between 0 and 127)
channels[0].noteOn(60, 80); // Play Middle C
Thread.sleep(duration);
channels[0].noteOff(60);
Thread.sleep(500);
synth.close();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (MidiUnavailableException e) {
e.printStackTrace();
}
下面的图片显示我录制时的音频,第一个是eclipse上的声音,第二个是导出到.jar时的声音
答案 0 :(得分:1)
正如您刚刚发现Java在eclipse之外运行jar文件时返回不同的默认合成器。
这可能是由类路径中的javax.sound.midi.Synthesizer
属性或sound.properties
文件引起的。
作为一种解决方法,您可以在eclipse中运行应用程序时打印属性值并手动设置,以便jar文件使用相同的合成器。
修改强>
如果您想使用com.sun.media.sound.MixerSynth
作为默认值,请创建属性
javax.sound.midi.Synthesizer=com.sun.media.sound.MixerSynth
示例:
Properties props = System.getProperties();
props.setProperty("javax.sound.midi.Synthesizer", "com.sun.media.sound.MixerSynth");
Synthesizer synth = MidiSystem.getSynthesizer();
....
更多信息:http://docs.oracle.com/javase/7/docs/api/javax/sound/midi/MidiSystem.html)