Более новая версия JRE не загружает звуковой банк, но более старая версия делает

У меня есть следующий код, который пытается загрузить звуковой банк. Я протестировал код на Windows 7 с JRE 1.6.03 и 1.6.43. Старая версия JRE (1.6.03) работает нормально, но новая версия вызывает исключение. В чем дело?

public Main() {
    try {
        Synthesizer synth = MidiSystem.getSynthesizer();
        synth.open();
        BufferedInputStream soundBankStream = new BufferedInputStream(
                getClass().getClassLoader().getResourceAsStream(
                        "soundbank.gm"));
        synth.loadAllInstruments(MidiSystem.getSoundbank(soundBankStream));
    } catch (MidiUnavailableException e) {
        e.printStackTrace();
    } catch (InvalidMidiDataException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

,

F:\>java -version
java version "1.6.0_03"
Java(TM) SE Runtime Environment (build 1.6.0_03-b05)
Java HotSpot(TM) 64-Bit Server VM (build 1.6.0_03-b05, mixed mode)

F:\>java -jar Test2.jar

F:\>"C:\Program Files\Java\jre6\bin\java.exe" -version
java version "1.6.0_43"
Java(TM) SE Runtime Environment (build 1.6.0_43-b01)
Java HotSpot(TM) 64-Bit Server VM (build 20.14-b01, mixed mode)

F:\>"C:\Program Files\Java\jre6\bin\java.exe" -jar Test2.jar
javax.sound.midi.InvalidMidiDataException: cannot get soundbank from stream
        at javax.sound.midi.MidiSystem.getSoundbank(Unknown Source)
        at com.gulshansingh.test.Main.<init>(Main.java:24)
        at com.gulshansingh.test.Main.main(Main.java:14)

Вы можете скачать Soundbanks отсюда: http://www.oracle.com/technetwork/java/soundbanks-135798.html

2 ответа

Копирование-вставка из Java Sound API: страница Soundbanks

Java Sound API

На этой странице представлены различные звуковые блоки, которые вы можете скачать и использовать с Java Sound. Soundbanks необходимы для правильной работы внутреннего программного синтезатора, который поставляется с Java Sound. По умолчанию версия J2RE для Windows не поставляется со звуковым банком, поэтому вам необходимо установить его вручную, чтобы использовать MIDI-движок Java Sound. Java Sound имеет резервный механизм, который использует аппаратный порт MIDI, если нет банка звуковых файлов, но он препятствует надежному и согласованному воспроизведению MIDI, поэтому для Java Sound рекомендуется установить банк звуков.

Как видите, Java Sound API требует установки, поэтому, если вы установили более новый JDK, вам придется повторить установку.

Кажется, ошибка рядом с вашей проблемой: 4887447, обходной путь существует, но не в том случае, если банкзон находится в JAR

У меня возникла та же проблема, и из того, что я нашел, последние версии java (1.7+), звуковые блоки GM больше не поддерживаются

http://www.oracle.com/technetwork/java/javase/compatibility-417013.html

Реализация программного синтезатора в пакете Java Sound была заменена версией с открытым исходным кодом. В результате замены были потеряны следующие функции: поддержка звукового банка GM, поддержка воспроизведения файлов RMF, поддержка OSS (Open Sound System) на платформе Linux. Новая реализация синтезатора поддерживает звуковые банки в форматах DLS и SoundFont (SF2).

Как он говорит, он поддерживает форматы Soundbank DLS и SF2 (что я пробовал с тем, что вы делали, и это работало). Посмотрите в Интернете эти файлы, например, здесь: http://www.ronimusic.com/smp_ios_dls_files.htm

Другие вопросы по тегам