将MIDI乐器导出为.jar文件后,声音会有所不同。

3
我制作了一个使用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后的声音。 声波

channels[0]channels[channel] 是复制粘贴的笔误吗? - Kayaman
是的没错,很好的发现,我会修复它的,谢谢。 - xulo
只是猜测,也许Eclipse正在定义一个“javax.sound.midi.Synthesizer”属性,这会导致getSynthesizer()返回不同的默认合成器? - davidgiga1993
@davidgiga1993 我认为你是对的,我尝试打印数组 synth.getAvailableInstruments(),结果在 Eclipse 和 .jar 中出现了不同(但相似)的乐器名称,这很烦人,因为 Eclipse 的声音要好得多。 - xulo
1个回答

1

正如您刚刚发现的那样,当在eclipse之外运行jar文件时,Java会返回不同的默认合成器。

这可能是由于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

在Eclipse中合成器是'com.sun.media.sound.MixerSynth',而在Java中是'com.sun.media.sound.SoftSynthesizer',我该如何更改它? - xulo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接