mirror of
				https://github.com/python/cpython.git
				synced 2025-11-03 23:21:29 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			188 lines
		
	
	
	
		
			3.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			188 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()
 |