Morse code
It has been in use for more than 175 years — longer than any other electronic encoding system.



Task

Send a string as audible Morse code to an audio device   (e.g., the PC speaker).



As the standard Morse code does not contain all possible characters,
you may either ignore unknown characters in the file,
or indicate them somehow   (e.g. with a different pitch).




 
/* Sound Morse code via the PC buzzer.           June 2011 */
MORSE: procedure options (main);
   declare (i, j) fixed binary;
   declare buzz character (1) static initial ('07'x);
   declare text character (100) varying,
      c character (1);
   declare alphabet character (36) static initial (
      'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789');
   declare morse_character character(5) varying;
   declare morse_codes(36) character(5) varying static initial (
      /* Letters A-Z */
      '.-',    '-...',   '-.-.',   '-..',    '.',
      '..-.',  '--.',    '....',   '..',     '.---',
      '-.-',   '.-..',   '--',     '-.',     '---',
      '--.-',  '--.-',   '.-.',    '...',    '-',
      '..-',   '...-',   '.--',    '-..-',   '-.--',
      '--..',
      /* Digits 0-9 */
      '-----', '.----',  '..---', '...--',   '....-',
      '.....', '-....',  '--...', '---..',   '----.' );
 
   put skip list ('Please type the text to be transmitted:');
   get edit (text) (L);
 
   do i = 1 to length (text);
      c = substr(text, i, 1);
      j = index(alphabet, uppercase(c));
      if j > 0 then
         do;
            morse_character = morse_codes(j);
            put skip list (morse_character); /* Display the Morse. */
            call send_morse (morse_character);
         end;
   end;
 
send_morse: procedure (morse_character);
   declare morse_character character(*) varying;
   declare i fixed binary;
 
   do i = 1 to length(morse_character);
      if substr(morse_character, 1, 1) = '-' then
         put skip edit (buzz, ' ', buzz) (a(1), A, skip, a(1));
      else
         put skip edit (buzz, ' ') (a(1));
      delay (1000); /* Delay one period. */
   end;
   delay (1000);
      /* Making a delay of 2 periods after each English letter. */
end send_morse;
 
END MORSE;