From 7aa87cc5b3bf95b310eaebc333600f72da5258fc Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Fri, 10 Mar 1995 14:47:05 +0000 Subject: [PATCH] added morse library (not finished yet) --- Mac/Demo/sound/morselib.py | 188 +++++++++++++++++++++++++++++++++++++ 1 file changed, 188 insertions(+) create mode 100644 Mac/Demo/sound/morselib.py diff --git a/Mac/Demo/sound/morselib.py b/Mac/Demo/sound/morselib.py new file mode 100644 index 00000000000..6f8eed6174c --- /dev/null +++ b/Mac/Demo/sound/morselib.py @@ -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()