Я пытаюсь создать простое приложение, которое считывает данные с миди-порта (аппаратного) и пересылает события на программный синтезатор.В основном это работает, за исключением того, что мягкий синтезатор перестает играть время от времени.Я вижу, как MIDI-сообщения пересылаются в журналах, я могу проследить в отладке и увидеть, что событие достигает собственного кода в приемнике синтезатора, но по какой-то причине синтезатор не воспроизводит ноту.Если вы подождете, затем снова начнется воспроизведение звука, затем остановите, а затем воспроизведите ...
Вот демонстрационное приложение, которое показывает проблему.Если вы удерживаете кнопку ввода в консоли, вы будете слышать заметку несколько раз.Через некоторое время (вероятно, менее чем через минуту) звук прекратится (если вы удерживаете кнопку нажатой), а затем вернется.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import javax.sound.midi.MidiSystem;
import javax.sound.midi.Synthesizer;
public class TestMidi2 {
public static void main( String[] args ) throws Exception {
Synthesizer synth = MidiSystem.getSynthesizer();
synth.open();
BufferedReader in = new BufferedReader( new InputStreamReader( System.in ) );
boolean on = true;
while ( in.readLine() != null ) {
if ( on ) {
synth.getChannels()[0].noteOn( 45, 127 );
} else {
synth.getChannels()[0].noteOff( 45 );
}
on = !on;
}
}
}
Я на MacOS X lion, если это сделатьразница (что, я думаю, так и есть).
Есть идеи?Обходной путь?Я хотел бы попробовать другой программный синтезатор, но не смог найти ни одного.Я также готов попробовать аппаратный миди-синтезатор, если он умеет играть на основном пианино, флейте и гитаре (мне не нужно ничего профессионального, просто приличный звук).
Спасибо!