#! /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. import sys, 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. def mkwave(octave): sinewave = '' for i in range(100): val = int(math.sin(math.pi * i * octave / 50.0) * 30000) sinewave += chr((val >> 8) & 255) + chr(val & 255) return sinewave defaultwave = mkwave(OCTAVE) def main(): import getopt try: opts, args = getopt.getopt(sys.argv[1:], 'o:p:') except getopt.error: sys.stderr.write('Usage ' + sys.argv[0] + ' [ -o outfile ] [ -p octave ] [ words ] ...\n') sys.exit(1) dev = None wave = defaultwave for o, a in opts: if o == '-o': import aifc dev = aifc.open(a, 'w') dev.setframerate(44100) dev.setsampwidth(2) dev.setnchannels(1) if o == '-p': wave = mkwave(int(a)) if not dev: import audiodev dev = audiodev.AudioDev() dev.setoutrate(44100) dev.setsampwidth(2) dev.setnchannels(1) dev.close = dev.stop dev.writeframesraw = dev.writeframes if args: source = [' '.join(args)] else: source = iter(sys.stdin.readline, '') for line in source: mline = morse(line) play(mline, dev, wave) if hasattr(dev, 'wait'): dev.wait() dev.close() # Convert a string to morse code with \001 between the characters in # the string. def morse(line): res = '' for c in line: try: res += morsetab[c] + '\001' except KeyError: pass return res # Play a line of morse code. def play(line, dev, wave): for c in line: if c == '.': sine(dev, DOT, wave) elif c == '-': sine(dev, DAH, wave) else: # space pause(dev, DAH + DOT) pause(dev, DOT) def sine(dev, length, wave): for i in range(length): dev.writeframesraw(wave) def pause(dev, length): for i in range(length): dev.writeframesraw(nowave) if __name__ == '__main__': main()
Name | Type | Size | Permission | Actions |
---|---|---|---|---|
.beer.pyo.40009 | File | 703 B | 0644 |
|
.eqfix.pyo.40009 | File | 4.52 KB | 0644 |
|
.fact.pyo.40009 | File | 1.14 KB | 0644 |
|
.find-uname.pyo.40009 | File | 1.47 KB | 0644 |
|
.from.pyo.40009 | File | 749 B | 0644 |
|
.lpwatch.pyo.40009 | File | 2.54 KB | 0644 |
|
.makedir.pyo.40009 | File | 732 B | 0644 |
|
.markov.pyo.40009 | File | 3.93 KB | 0644 |
|
.mboxconvert.pyo.40009 | File | 3.17 KB | 0644 |
|
.morse.pyo.40009 | File | 4.33 KB | 0644 |
|
.newslist.pyo.40009 | File | 7.55 KB | 0644 |
|
.pi.pyo.40009 | File | 921 B | 0644 |
|
.pp.pyo.40009 | File | 2.28 KB | 0644 |
|
.primes.pyo.40009 | File | 921 B | 0644 |
|
.queens.pyo.40009 | File | 2.95 KB | 0644 |
|
.script.pyo.40009 | File | 1.21 KB | 0644 |
|
.unbirthday.pyo.40009 | File | 2.93 KB | 0644 |
|
.update.pyo.40009 | File | 2.69 KB | 0644 |
|
README | File | 1009 B | 0644 |
|
beer.py | File | 459 B | 0755 |
|
beer.pyc | File | 703 B | 0644 |
|
beer.pyo | File | 703 B | 0644 |
|
eqfix.py | File | 6.16 KB | 0755 |
|
eqfix.pyc | File | 4.52 KB | 0644 |
|
eqfix.pyo | File | 4.52 KB | 0644 |
|
fact.py | File | 1.11 KB | 0755 |
|
fact.pyc | File | 1.14 KB | 0644 |
|
fact.pyo | File | 1.14 KB | 0644 |
|
find-uname.py | File | 1.18 KB | 0755 |
|
find-uname.pyc | File | 1.47 KB | 0644 |
|
find-uname.pyo | File | 1.47 KB | 0644 |
|
from.py | File | 874 B | 0755 |
|
from.pyc | File | 749 B | 0644 |
|
from.pyo | File | 749 B | 0644 |
|
lpwatch.py | File | 2.77 KB | 0755 |
|
lpwatch.pyc | File | 2.54 KB | 0644 |
|
lpwatch.pyo | File | 2.54 KB | 0644 |
|
makedir.py | File | 510 B | 0755 |
|
makedir.pyc | File | 732 B | 0644 |
|
makedir.pyo | File | 732 B | 0644 |
|
markov.py | File | 3.51 KB | 0755 |
|
markov.pyc | File | 3.93 KB | 0644 |
|
markov.pyo | File | 3.93 KB | 0644 |
|
mboxconvert.py | File | 3.11 KB | 0755 |
|
mboxconvert.pyc | File | 3.17 KB | 0644 |
|
mboxconvert.pyo | File | 3.17 KB | 0644 |
|
morse.py | File | 4.21 KB | 0755 |
|
morse.pyc | File | 4.33 KB | 0644 |
|
morse.pyo | File | 4.33 KB | 0644 |
|
newslist.doc | File | 2.36 KB | 0755 |
|
newslist.py | File | 11.17 KB | 0755 |
|
newslist.pyc | File | 7.55 KB | 0644 |
|
newslist.pyo | File | 7.55 KB | 0644 |
|
pi.py | File | 888 B | 0755 |
|
pi.pyc | File | 921 B | 0644 |
|
pi.pyo | File | 921 B | 0644 |
|
pp.py | File | 3.73 KB | 0755 |
|
pp.pyc | File | 2.28 KB | 0644 |
|
pp.pyo | File | 2.28 KB | 0644 |
|
primes.py | File | 603 B | 0755 |
|
primes.pyc | File | 921 B | 0644 |
|
primes.pyo | File | 921 B | 0644 |
|
queens.py | File | 2.19 KB | 0755 |
|
queens.pyc | File | 2.95 KB | 0644 |
|
queens.pyo | File | 2.95 KB | 0644 |
|
script.py | File | 962 B | 0755 |
|
script.pyc | File | 1.21 KB | 0644 |
|
script.pyo | File | 1.21 KB | 0644 |
|
unbirthday.py | File | 3.07 KB | 0755 |
|
unbirthday.pyc | File | 2.93 KB | 0644 |
|
unbirthday.pyo | File | 2.93 KB | 0644 |
|
update.py | File | 2.69 KB | 0755 |
|
update.pyc | File | 2.69 KB | 0644 |
|
update.pyo | File | 2.69 KB | 0644 |
|