导出到.jar文件时,MIDI乐器声音不同

时间:2015-07-01 04:32:16

标签: java eclipse audio javax.sound.midi midi-instrument

我已经制作了一个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时的声音

Sound Waves

1 个答案:

答案 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