47 lines
1.2 KiB
Plaintext
47 lines
1.2 KiB
Plaintext
let codes = [
|
|
'a', ".-"; 'b', "-..."; 'c', "-.-.";
|
|
'd', "-.."; 'e', "."; 'f', "..-.";
|
|
'g', "--."; 'h', "...."; 'i', "..";
|
|
'j', ".---"; 'k', "-.-"; 'l', ".-..";
|
|
'm', "--"; 'n', "-."; 'o', "---";
|
|
'p', ".--."; 'q', "--.-"; 'r', ".-.";
|
|
's', "..."; 't', "-"; 'u', "..-";
|
|
'v', "...-"; 'w', ".--"; 'x', "-..-";
|
|
'y', "-.--"; 'z', "--.."; '0', "-----";
|
|
'1', ".----"; '2', "..---"; '3', "...--";
|
|
'4', "....-"; '5', "....."; '6', "-....";
|
|
'7', "--..."; '8', "---.."; '9', "----.";
|
|
]
|
|
|
|
let oc = open_out "/dev/dsp"
|
|
|
|
let bip u =
|
|
for i = 0 to pred u do
|
|
let j = sin(0.6 *. (float i)) in
|
|
let k = ((j +. 1.0) /. 2.0) *. 127.0 in
|
|
output_byte oc (truncate k)
|
|
done
|
|
|
|
let gap u =
|
|
for i = 0 to pred u do
|
|
output_byte oc 0
|
|
done
|
|
|
|
let morse =
|
|
let u = 1000 in (* length of one unit *)
|
|
let u2 = u * 2 in
|
|
let u3 = u * 3 in
|
|
let u6 = u * 6 in
|
|
String.iter (function
|
|
| ' ' -> gap u6
|
|
| 'a'..'z' | 'A'..'Z' | '0'..'9' as c ->
|
|
let s = List.assoc c codes in
|
|
String.iter (function
|
|
'.' -> bip u; gap u
|
|
| '-' -> bip u3; gap u
|
|
| _ -> assert false
|
|
) s; gap u2
|
|
| _ -> prerr_endline "unknown char")
|
|
|
|
let () = morse "rosettacode morse"
|