mirror of
https://github.com/python/cpython.git
synced 2024-11-24 18:34:43 +08:00
added morse library (not finished yet)
This commit is contained in:
parent
b7a38354f4
commit
7aa87cc5b3
188
Mac/Demo/sound/morselib.py
Normal file
188
Mac/Demo/sound/morselib.py
Normal file
@ -0,0 +1,188 @@
|
||||
"""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()
|
Loading…
Reference in New Issue
Block a user