Java でモールス再生メカニズムを実装しようとしています。文字列で正常に動作していましたが、停止機能を実装するために、ドライバーから一度に1つずつ配信される単一の文字で動作させようとしています。
ただし、プログラムはランダムに再生を停止するようです。例えば:
"こんにちは": ... 。.-.. .-.. ---
「---」の直前で無音になる
「うーん」: .... .... .... ....
4 番目の h の最初のドットの後は無音になります。
「おお」: --- --- --- --- ---
4 番目の o の後に沈黙します。
運転者:
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();
}
}