189 lines
3.3 KiB
Python
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()
|