Простой пример Java MIDI, не воспроизводящий звук

StackOverflow https://stackoverflow.com/questions/380103

  •  22-08-2019
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Решение

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

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

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

Другие советы

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

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

Просто нужно еще 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();
    }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top