Простой пример Java MIDI не производит никакого звука

Этот простой код не производит никакого звука на нескольких машинах, которые я использовал для его проверки. Я запускаю код из Eclipse, но я также попытался использовать командную строку безрезультатно.

public static void main(String[] args)
{
    try {
        Synthesizer synthesizer = MidiSystem.getSynthesizer();
        synthesizer.open();

        MidiChannel[] channels = synthesizer.getChannels();

        channels[0].noteOn(60, 60);
        Thread.sleep(200);
        channels[0].noteOff(60);

        synthesizer.close();
    } catch (Exception e)
    {
        e.printStackTrace();
    }
}

Я могу успешно получить звук, получив Sequencer, добавив MIDI-последовательности в последовательность и воспроизведя последовательность, но я пытаюсь сделать некоторые музыкальные эффекты в реальном времени, которые секвенсор не поддерживает.

Любые идеи?

РЕДАКТИРОВАТЬ С РЕШЕНИЕМ: Оказывается, проблема заключается в том, что по умолчанию JRE не имеет звуковой банк (интересно, что использование Sequencer сработало, но с использованием Synthesizer didn "т). Спасибо, thejmc!

Чтобы решить эту проблему, я скачал звуковой банк из java.sun.com и разместил его в (на WinXP). C:\Program Файлы \jre1.6.0_07\lib\audio (должны были сделать аудио-папку).

Ответ 1

В некоторых установках JRE не содержится JavaSound soundbank.gm(чтобы сэкономить место), поэтому ваш код не будет иметь источник звука для запуска на этих машинах.

Проверьте наличие звукового банка на машинах, которые не работают. Вы также можете поместить звуковой банк в тот же каталог, что и ваш .class, и он найдет его.

Можно добавить звуковой банк или обновить Java-установку на этой машине - боль непоследовательности, я знаю:)

Ответ 2

Вы пытались использовать другой канал? Может быть этот обсуждать поможет вам ближе к решению...

Ответ 3

Я тестировал ваш код на своей машине (Windows XP, JRE 1.6), и он воспроизводит заметки. Возможно, всего лишь одна заметка слишком мало, чтобы ее услышать. Попытайтесь добавить больше заметок. Также попробуйте установить громкость громче.

Ответ 4

Просто нужно еще одно действие сна перед закрытым синтезатором:

public static void main(String[] args)
{
    try {
        Synthesizer synthesizer = MidiSystem.getSynthesizer();
        synthesizer.open();

        MidiChannel[] channels = synthesizer.getChannels();

        channels[0].noteOn(60, 60);
        Thread.sleep(200);
        channels[0].noteOff(60);
        Thread.sleep(200);

        synthesizer.close();
    } catch (Exception e)
    {
        e.printStackTrace();
    }
}