Разбор и воспроизведение 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 не были закрыты / восстановлены слишком рано. Требуемая задержка может зависеть от системы и выбранного инструмента.

Другие вопросы по тегам