]>
Commit | Line | Data |
---|---|---|
4710c53d | 1 | #! /usr/bin/env python\r |
2 | \r | |
3 | # DAH should be three DOTs.\r | |
4 | # Space between DOTs and DAHs should be one DOT.\r | |
5 | # Space between two letters should be one DAH.\r | |
6 | # Space between two words should be DOT DAH DAH.\r | |
7 | \r | |
8 | import sys, math, audiodev\r | |
9 | \r | |
10 | DOT = 30\r | |
11 | DAH = 3 * DOT\r | |
12 | OCTAVE = 2 # 1 == 441 Hz, 2 == 882 Hz, ...\r | |
13 | \r | |
14 | morsetab = {\r | |
15 | 'A': '.-', 'a': '.-',\r | |
16 | 'B': '-...', 'b': '-...',\r | |
17 | 'C': '-.-.', 'c': '-.-.',\r | |
18 | 'D': '-..', 'd': '-..',\r | |
19 | 'E': '.', 'e': '.',\r | |
20 | 'F': '..-.', 'f': '..-.',\r | |
21 | 'G': '--.', 'g': '--.',\r | |
22 | 'H': '....', 'h': '....',\r | |
23 | 'I': '..', 'i': '..',\r | |
24 | 'J': '.---', 'j': '.---',\r | |
25 | 'K': '-.-', 'k': '-.-',\r | |
26 | 'L': '.-..', 'l': '.-..',\r | |
27 | 'M': '--', 'm': '--',\r | |
28 | 'N': '-.', 'n': '-.',\r | |
29 | 'O': '---', 'o': '---',\r | |
30 | 'P': '.--.', 'p': '.--.',\r | |
31 | 'Q': '--.-', 'q': '--.-',\r | |
32 | 'R': '.-.', 'r': '.-.',\r | |
33 | 'S': '...', 's': '...',\r | |
34 | 'T': '-', 't': '-',\r | |
35 | 'U': '..-', 'u': '..-',\r | |
36 | 'V': '...-', 'v': '...-',\r | |
37 | 'W': '.--', 'w': '.--',\r | |
38 | 'X': '-..-', 'x': '-..-',\r | |
39 | 'Y': '-.--', 'y': '-.--',\r | |
40 | 'Z': '--..', 'z': '--..',\r | |
41 | '0': '-----', ',': '--..--',\r | |
42 | '1': '.----', '.': '.-.-.-',\r | |
43 | '2': '..---', '?': '..--..',\r | |
44 | '3': '...--', ';': '-.-.-.',\r | |
45 | '4': '....-', ':': '---...',\r | |
46 | '5': '.....', "'": '.----.',\r | |
47 | '6': '-....', '-': '-....-',\r | |
48 | '7': '--...', '/': '-..-.',\r | |
49 | '8': '---..', '(': '-.--.-',\r | |
50 | '9': '----.', ')': '-.--.-',\r | |
51 | ' ': ' ', '_': '..--.-',\r | |
52 | }\r | |
53 | \r | |
54 | nowave = '\0' * 200\r | |
55 | \r | |
56 | # If we play at 44.1 kHz (which we do), then if we produce one sine\r | |
57 | # wave in 100 samples, we get a tone of 441 Hz. If we produce two\r | |
58 | # sine waves in these 100 samples, we get a tone of 882 Hz. 882 Hz\r | |
59 | # appears to be a nice one for playing morse code.\r | |
60 | def mkwave(octave):\r | |
61 | sinewave = ''\r | |
62 | for i in range(100):\r | |
63 | val = int(math.sin(math.pi * i * octave / 50.0) * 30000)\r | |
64 | sinewave += chr((val >> 8) & 255) + chr(val & 255)\r | |
65 | return sinewave\r | |
66 | \r | |
67 | defaultwave = mkwave(OCTAVE)\r | |
68 | \r | |
69 | def main():\r | |
70 | import getopt\r | |
71 | try:\r | |
72 | opts, args = getopt.getopt(sys.argv[1:], 'o:p:')\r | |
73 | except getopt.error:\r | |
74 | sys.stderr.write('Usage ' + sys.argv[0] +\r | |
75 | ' [ -o outfile ] [ -p octave ] [ words ] ...\n')\r | |
76 | sys.exit(1)\r | |
77 | dev = None\r | |
78 | wave = defaultwave\r | |
79 | for o, a in opts:\r | |
80 | if o == '-o':\r | |
81 | import aifc\r | |
82 | dev = aifc.open(a, 'w')\r | |
83 | dev.setframerate(44100)\r | |
84 | dev.setsampwidth(2)\r | |
85 | dev.setnchannels(1)\r | |
86 | if o == '-p':\r | |
87 | wave = mkwave(int(a))\r | |
88 | if not dev:\r | |
89 | import audiodev\r | |
90 | dev = audiodev.AudioDev()\r | |
91 | dev.setoutrate(44100)\r | |
92 | dev.setsampwidth(2)\r | |
93 | dev.setnchannels(1)\r | |
94 | dev.close = dev.stop\r | |
95 | dev.writeframesraw = dev.writeframes\r | |
96 | if args:\r | |
97 | source = [' '.join(args)]\r | |
98 | else:\r | |
99 | source = iter(sys.stdin.readline, '')\r | |
100 | for line in source:\r | |
101 | mline = morse(line)\r | |
102 | play(mline, dev, wave)\r | |
103 | if hasattr(dev, 'wait'):\r | |
104 | dev.wait()\r | |
105 | dev.close()\r | |
106 | \r | |
107 | # Convert a string to morse code with \001 between the characters in\r | |
108 | # the string.\r | |
109 | def morse(line):\r | |
110 | res = ''\r | |
111 | for c in line:\r | |
112 | try:\r | |
113 | res += morsetab[c] + '\001'\r | |
114 | except KeyError:\r | |
115 | pass\r | |
116 | return res\r | |
117 | \r | |
118 | # Play a line of morse code.\r | |
119 | def play(line, dev, wave):\r | |
120 | for c in line:\r | |
121 | if c == '.':\r | |
122 | sine(dev, DOT, wave)\r | |
123 | elif c == '-':\r | |
124 | sine(dev, DAH, wave)\r | |
125 | else: # space\r | |
126 | pause(dev, DAH + DOT)\r | |
127 | pause(dev, DOT)\r | |
128 | \r | |
129 | def sine(dev, length, wave):\r | |
130 | for i in range(length):\r | |
131 | dev.writeframesraw(wave)\r | |
132 | \r | |
133 | def pause(dev, length):\r | |
134 | for i in range(length):\r | |
135 | dev.writeframesraw(nowave)\r | |
136 | \r | |
137 | if __name__ == '__main__':\r | |
138 | main()\r |