3

我制作了一个使用 java 声音 API 中的 MIDI 包合成声音的 java 程序,但是,当我将它导出到 .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 时的声音

声波

4

1 回答 1

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 )

于 2015-07-01T05:41:10.693 回答