Разбор и воспроизведение Java String из-за ошибки MIDI Synthesizer
Я пытаюсь реализовать механизм воспроизведения Морзе в Java. У меня он работал нормально со строкой, но для реализации функции остановки я пытаюсь заставить его работать с одним символом, который будет доставляться по одному от водителя за раз.
Однако программа, похоже, несколько случайным образом прекращает воспроизведение. Например:
"Привет":.....-...-.. ---
Перед тем как "---" замолкает
"хххх":................
Молчает после первой точки четвертого часа.
"ооооо": --- --- --- --- ---
После четвертого часа замолкает.
Водитель:
Runnable r = new Runnable() {
public void run() {
Morse.play(returnval);
/*
char[] c = returnval.toCharArray();
for (char v : c){
String s = "";
s += v;
System.out.print(s);
Morse.play(s);
}
*/
}
};
new Thread(r).start();
Метод воспроизведения:
public static void play(String morse){
char[] notes = morse.toCharArray();
int unit = 100;
int mult = 0;
try {
Synthesizer synthesizer = MidiSystem.getSynthesizer();
synthesizer.open();
MidiChannel channel = synthesizer.getChannels()[0];
channel.programChange(0, 80);
for (char note : notes) {
switch (note){
case '.':
mult = 1;
break;
case '-':
mult = 3;
break;
case ' ':
mult = -3;
break;
default:
mult = 0;
break;
}
try{
if (mult > 0){
channel.noteOn(60, 30);
Thread.sleep(mult*unit);
}
else {
Thread.sleep(mult*-1*unit);
}
channel.allNotesOff();
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} catch (MidiUnavailableException e) {
e.printStackTrace();
}
}
1 ответ
На самом деле код выглядит нормально и должен работать. Однако могут быть глюки из-за Synthesizer
слишком медленный и выбранный инструмент имеет затухание. Я мог бы улучшить результаты с моей стороны, введя дополнительную задержку в 1000 мс в конце после воспроизведения последовательности кода Морзе, чтобы поток не остановился еще и ресурсы Midi не были закрыты / восстановлены слишком рано. Требуемая задержка может зависеть от системы и выбранного инструмента.