Простой пример Java MIDI без звука - PullRequest
10 голосов
/ 19 декабря 2008

Этот простой код не производит никакого звука на нескольких машинах, которые я использовал для его тестирования. Я запускаю код из 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();
    }
}

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

Есть идеи?

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

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

Ответы [ 4 ]

9 голосов
/ 14 января 2009

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

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

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

0 голосов
/ 13 апреля 2009

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

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();
    }
}
0 голосов
/ 19 декабря 2008

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

0 голосов
/ 19 декабря 2008

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

...