java - MIDI 乐器在导出到 .jar 文件时听起来不同

标签 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

最佳答案

正如您刚刚发现的,在 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 )

关于java - MIDI 乐器在导出到 .jar 文件时听起来不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31152589/

相关文章:

java - 如何减少Java构造函数的重复性和臃肿性?

java - 在 Eclipse 中关闭 hibernate 日志记录

android - 如何使用索引直接从raw/res文件夹访问音频文件

android - 音频数据有问题

javascript - 如何从Web浏览器录制音频并使用JS下载

java - Mac OS 上的类路径错误

java - 什么是 J2ME 兼容的 WebDAV 库?

java - 如何为不同的eclipse实例分配不同的堆大小?

java - 使用泛型和动态类类型返回类型转换

java - Android TextView - Marquee CPU 负载