0

我正在尝试在 Java 中实现莫尔斯播放机制。我让它与字符串一起工作正常,但为了实现停止功能,我试图让它与单个字符一起工作,该字符将一次从驱动程序传递一个。

但是,该程序似乎有点随机停止播放。例如:

“你好”: ... 。.-.. .-.. ---

在“---”之前保持沉默

“呵呵”:…………………………

在第四个 h 的第一个点后静音。

“呜呜”:--- --- --- --- ---

在第四个 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();
    }
}
4

1 回答 1

1

实际上,代码看起来一切正常,应该可以工作。但是,由于Synthesizer速度太慢和所选仪器有衰减,可能会出现故障。我可以通过在播放摩尔斯电码序列后在最后引入 1000 毫秒的额外延迟来改善我的结果,这样线程就不会停止,Midi 资源也不会过早关闭/回收。所需的延迟可能取决于系统和所选仪器。

于 2014-11-23T17:55:03.990 回答