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