cpython/Mac/Demo/sound/morselib.py

189 lines
3.3 KiB
Python

"""Translate text strings to Morse code"""
FRAMERATE = 22050
SAMPWIDTH = 2
BASEFREQ = 441
OCTAVE = 2
DOT = 30
DAH = 80
morsetab = {
'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': '----.',
',': '--..--',
'.': '.-.-.-',
'?': '..--..',
';': '-.-.-.',
':': '---...',
"'": '.----.',
'-': '-....-',
'/': '-..-.',
'(': '-.--.-',
')': '-.--.-', # XXX same as code for '(' ???
'_': '..--.-',
' ': ' '
}
def morsecode(s):
from string import lower
m = ''
for c in s:
c = lower(c)
if morsetab.has_key(c):
c = morsetab[c] + ' '
else:
c = '? '
m = m + c
return m
class BaseMorse:
"base class for morse transmissions"
def __init__(self):
"constructor"
self.dots = DOT
self.dahs = DAH
def noise(self, duration):
"beep for given duration"
pass
def pause(self, duration):
"pause for given duration"
pass
def dot(self):
"short beep"
self.noise(self.dots)
def dah(self):
"long beep"
self.noise(self.dahs)
def pdot(self):
"pause as long as a dot"
self.pause(self.dots)
def pdah(self):
"pause as long as a dah"
self.pause(self.dahs)
def sendmorse(self, s):
for c in s:
if c == '.': self.dot()
elif c == '-': self.dah()
else: self.pdah()
self.pdot()
def sendascii(self, s):
self.sendmorse(morsecode(s))
def send(self, s):
self.sendascii(s)
import Audio_mac
class MyAudio(Audio_mac.Play_Audio_mac):
def _callback(self, *args):
if hasattr(self, 'usercallback'): self.usercallback()
apply(Audio_mac.Play_Audio_mac._callback, (self,) + args)
class MacMorse(BaseMorse):
"Mac specific class to play Morse code"
def __init__(self):
BaseMorse.__init__(self)
self.dev = MyAudio()
self.dev.setoutrate(FRAMERATE)
self.dev.setsampwidth(SAMPWIDTH)
self.dev.setnchannels(1)
self.dev.usercallback = self.usercallback
sinewave = ''
n = int(FRAMERATE / BASEFREQ)
octave = OCTAVE
from math import sin, pi
for i in range(n):
val = int(sin(2 * pi * i * octave / n) * 0x7fff)
sample = chr((val >> 8) & 255) + chr(val & 255)
sinewave = sinewave + sample[:SAMPWIDTH]
self.sinewave = sinewave
self.silence = '\0' * (n*SAMPWIDTH)
self.morsequeue = ''
def __del__(self):
self.close()
def close(self):
self.dev = None
def pause(self, duration):
self.dev.writeframes(self.silence * duration)
def noise(self, duration):
self.dev.writeframes(self.sinewave * duration)
def sendmorse(self, s):
self.morsequeue = self.morsequeue + s
self.dev.usercallback()
self.dev.usercallback()
self.dev.usercallback()
def usercallback(self):
if self.morsequeue:
c, self.morsequeue = self.morsequeue[0], self.morsequeue[1:]
if c == '.': self.dot()
elif c == '-': self.dah()
else: self.pdah()
self.pdot()
def test():
m = MacMorse()
while 1:
try:
line = raw_input('Morse line: ')
except (EOFError, KeyboardInterrupt):
break
m.send(line)
while m.morsequeue: pass
test()