| """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() |