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