ยปCore Development>Code coverage>Mac/Demo/sound/morse.py

Python code coverage for Mac/Demo/sound/morse.py

#countcontent
1n/aimport sys, math
2n/a
3n/aDOT = 30
4n/aDAH = 80
5n/aOCTAVE = 2 # 1 == 441 Hz, 2 == 882 Hz, ...
6n/aSAMPWIDTH = 2
7n/aFRAMERATE = 44100
8n/aBASEFREQ = 441
9n/aQSIZE = 20000
10n/a
11n/amorsetab = {
12n/a 'A': '.-', 'a': '.-',
13n/a 'B': '-...', 'b': '-...',
14n/a 'C': '-.-.', 'c': '-.-.',
15n/a 'D': '-..', 'd': '-..',
16n/a 'E': '.', 'e': '.',
17n/a 'F': '..-.', 'f': '..-.',
18n/a 'G': '--.', 'g': '--.',
19n/a 'H': '....', 'h': '....',
20n/a 'I': '..', 'i': '..',
21n/a 'J': '.---', 'j': '.---',
22n/a 'K': '-.-', 'k': '-.-',
23n/a 'L': '.-..', 'l': '.-..',
24n/a 'M': '--', 'm': '--',
25n/a 'N': '-.', 'n': '-.',
26n/a 'O': '---', 'o': '---',
27n/a 'P': '.--.', 'p': '.--.',
28n/a 'Q': '--.-', 'q': '--.-',
29n/a 'R': '.-.', 'r': '.-.',
30n/a 'S': '...', 's': '...',
31n/a 'T': '-', 't': '-',
32n/a 'U': '..-', 'u': '..-',
33n/a 'V': '...-', 'v': '...-',
34n/a 'W': '.--', 'w': '.--',
35n/a 'X': '-..-', 'x': '-..-',
36n/a 'Y': '-.--', 'y': '-.--',
37n/a 'Z': '--..', 'z': '--..',
38n/a '0': '-----',
39n/a '1': '.----',
40n/a '2': '..---',
41n/a '3': '...--',
42n/a '4': '....-',
43n/a '5': '.....',
44n/a '6': '-....',
45n/a '7': '--...',
46n/a '8': '---..',
47n/a '9': '----.',
48n/a ',': '--..--',
49n/a '.': '.-.-.-',
50n/a '?': '..--..',
51n/a ';': '-.-.-.',
52n/a ':': '---...',
53n/a "'": '.----.',
54n/a '-': '-....-',
55n/a '/': '-..-.',
56n/a '(': '-.--.-',
57n/a ')': '-.--.-',
58n/a '_': '..--.-',
59n/a ' ': ' '
60n/a}
61n/a
62n/a# If we play at 44.1 kHz (which we do), then if we produce one sine
63n/a# wave in 100 samples, we get a tone of 441 Hz. If we produce two
64n/a# sine waves in these 100 samples, we get a tone of 882 Hz. 882 Hz
65n/a# appears to be a nice one for playing morse code.
66n/adef mkwave(octave):
67n/a global sinewave, nowave
68n/a sinewave = ''
69n/a n = int(FRAMERATE / BASEFREQ)
70n/a for i in range(n):
71n/a val = int(math.sin(2 * math.pi * i * octave / n) * 0x7fff)
72n/a sample = chr((val >> 8) & 255) + chr(val & 255)
73n/a sinewave = sinewave + sample[:SAMPWIDTH]
74n/a nowave = '\0' * (n*SAMPWIDTH)
75n/a
76n/amkwave(OCTAVE)
77n/a
78n/aclass BufferedAudioDev:
79n/a def __init__(self, *args):
80n/a import audiodev
81n/a self._base = apply(audiodev.AudioDev, args)
82n/a self._buffer = []
83n/a self._filled = 0
84n/a self._addmethods(self._base, self._base.__class__)
85n/a def _addmethods(self, inst, cls):
86n/a for name in cls.__dict__.keys():
87n/a if not hasattr(self, name):
88n/a try:
89n/a setattr(self, name, getattr(inst, name))
90n/a except:
91n/a pass
92n/a for basecls in cls.__bases__:
93n/a self._addmethods(self, inst, basecls)
94n/a def writeframesraw(self, frames):
95n/a self._buffer.append(frames)
96n/a self._filled = self._filled + len(frames)
97n/a if self._filled >= QSIZE:
98n/a self.flush()
99n/a def wait(self):
100n/a self.flush()
101n/a self._base.wait()
102n/a def flush(self):
103n/a print 'flush: %d blocks, %d bytes' % (len(self._buffer), self._filled)
104n/a if self._buffer:
105n/a import string
106n/a self._base.writeframes(string.joinfields(self._buffer, ''))
107n/a self._buffer = []
108n/a self._filled = 0
109n/a
110n/adef main(args = sys.argv[1:]):
111n/a import getopt, string
112n/a try:
113n/a opts, args = getopt.getopt(args, 'o:p:')
114n/a except getopt.error:
115n/a sys.stderr.write('Usage ' + sys.argv[0] +
116n/a ' [ -o outfile ] [ args ] ...\n')
117n/a sys.exit(1)
118n/a dev = None
119n/a for o, a in opts:
120n/a if o == '-o':
121n/a import aifc
122n/a dev = aifc.open(a, 'w')
123n/a dev.setframerate(FRAMERATE)
124n/a dev.setsampwidth(SAMPWIDTH)
125n/a dev.setnchannels(1)
126n/a if o == '-p':
127n/a mkwave(string.atoi(a))
128n/a if not dev:
129n/a dev = BufferedAudioDev()
130n/a dev.setoutrate(FRAMERATE)
131n/a dev.setsampwidth(SAMPWIDTH)
132n/a dev.setnchannels(1)
133n/a dev.close = dev.stop
134n/a if args:
135n/a line = string.join(args)
136n/a else:
137n/a line = sys.stdin.readline()
138n/a while line:
139n/a print line
140n/a mline = morse(line)
141n/a print mline
142n/a play(mline, dev)
143n/a if hasattr(dev, 'wait'):
144n/a dev.wait()
145n/a if not args:
146n/a line = sys.stdin.readline()
147n/a else:
148n/a line = ''
149n/a dev.close()
150n/a
151n/a# Convert a string to morse code with \001 between the characters in
152n/a# the string.
153n/adef morse(line):
154n/a res = ''
155n/a for c in line:
156n/a try:
157n/a res = res + morsetab[c] + '\001'
158n/a except KeyError:
159n/a pass
160n/a return res
161n/a
162n/a# Play a line of morse code.
163n/adef play(line, dev):
164n/a for c in line:
165n/a if c == '.':
166n/a sine(dev, DOT)
167n/a elif c == '-':
168n/a sine(dev, DAH)
169n/a else:
170n/a pause(dev, DAH)
171n/a pause(dev, DOT)
172n/a
173n/adef sine(dev, length):
174n/a dev.writeframesraw(sinewave*length)
175n/a
176n/adef pause(dev, length):
177n/a dev.writeframesraw(nowave*length)
178n/a
179n/aif __name__ == '__main__' or sys.argv[0] == __name__:
180n/a main()