+++ /dev/null
-#! /usr/bin/env python\r
-\r
-# DAH should be three DOTs.\r
-# Space between DOTs and DAHs should be one DOT.\r
-# Space between two letters should be one DAH.\r
-# Space between two words should be DOT DAH DAH.\r
-\r
-import sys, math, audiodev\r
-\r
-DOT = 30\r
-DAH = 3 * DOT\r
-OCTAVE = 2 # 1 == 441 Hz, 2 == 882 Hz, ...\r
-\r
-morsetab = {\r
- 'A': '.-', 'a': '.-',\r
- 'B': '-...', 'b': '-...',\r
- 'C': '-.-.', 'c': '-.-.',\r
- 'D': '-..', 'd': '-..',\r
- 'E': '.', 'e': '.',\r
- 'F': '..-.', 'f': '..-.',\r
- 'G': '--.', 'g': '--.',\r
- 'H': '....', 'h': '....',\r
- 'I': '..', 'i': '..',\r
- 'J': '.---', 'j': '.---',\r
- 'K': '-.-', 'k': '-.-',\r
- 'L': '.-..', 'l': '.-..',\r
- 'M': '--', 'm': '--',\r
- 'N': '-.', 'n': '-.',\r
- 'O': '---', 'o': '---',\r
- 'P': '.--.', 'p': '.--.',\r
- 'Q': '--.-', 'q': '--.-',\r
- 'R': '.-.', 'r': '.-.',\r
- 'S': '...', 's': '...',\r
- 'T': '-', 't': '-',\r
- 'U': '..-', 'u': '..-',\r
- 'V': '...-', 'v': '...-',\r
- 'W': '.--', 'w': '.--',\r
- 'X': '-..-', 'x': '-..-',\r
- 'Y': '-.--', 'y': '-.--',\r
- 'Z': '--..', 'z': '--..',\r
- '0': '-----', ',': '--..--',\r
- '1': '.----', '.': '.-.-.-',\r
- '2': '..---', '?': '..--..',\r
- '3': '...--', ';': '-.-.-.',\r
- '4': '....-', ':': '---...',\r
- '5': '.....', "'": '.----.',\r
- '6': '-....', '-': '-....-',\r
- '7': '--...', '/': '-..-.',\r
- '8': '---..', '(': '-.--.-',\r
- '9': '----.', ')': '-.--.-',\r
- ' ': ' ', '_': '..--.-',\r
-}\r
-\r
-nowave = '\0' * 200\r
-\r
-# If we play at 44.1 kHz (which we do), then if we produce one sine\r
-# wave in 100 samples, we get a tone of 441 Hz. If we produce two\r
-# sine waves in these 100 samples, we get a tone of 882 Hz. 882 Hz\r
-# appears to be a nice one for playing morse code.\r
-def mkwave(octave):\r
- sinewave = ''\r
- for i in range(100):\r
- val = int(math.sin(math.pi * i * octave / 50.0) * 30000)\r
- sinewave += chr((val >> 8) & 255) + chr(val & 255)\r
- return sinewave\r
-\r
-defaultwave = mkwave(OCTAVE)\r
-\r
-def main():\r
- import getopt\r
- try:\r
- opts, args = getopt.getopt(sys.argv[1:], 'o:p:')\r
- except getopt.error:\r
- sys.stderr.write('Usage ' + sys.argv[0] +\r
- ' [ -o outfile ] [ -p octave ] [ words ] ...\n')\r
- sys.exit(1)\r
- dev = None\r
- wave = defaultwave\r
- for o, a in opts:\r
- if o == '-o':\r
- import aifc\r
- dev = aifc.open(a, 'w')\r
- dev.setframerate(44100)\r
- dev.setsampwidth(2)\r
- dev.setnchannels(1)\r
- if o == '-p':\r
- wave = mkwave(int(a))\r
- if not dev:\r
- import audiodev\r
- dev = audiodev.AudioDev()\r
- dev.setoutrate(44100)\r
- dev.setsampwidth(2)\r
- dev.setnchannels(1)\r
- dev.close = dev.stop\r
- dev.writeframesraw = dev.writeframes\r
- if args:\r
- source = [' '.join(args)]\r
- else:\r
- source = iter(sys.stdin.readline, '')\r
- for line in source:\r
- mline = morse(line)\r
- play(mline, dev, wave)\r
- if hasattr(dev, 'wait'):\r
- dev.wait()\r
- dev.close()\r
-\r
-# Convert a string to morse code with \001 between the characters in\r
-# the string.\r
-def morse(line):\r
- res = ''\r
- for c in line:\r
- try:\r
- res += morsetab[c] + '\001'\r
- except KeyError:\r
- pass\r
- return res\r
-\r
-# Play a line of morse code.\r
-def play(line, dev, wave):\r
- for c in line:\r
- if c == '.':\r
- sine(dev, DOT, wave)\r
- elif c == '-':\r
- sine(dev, DAH, wave)\r
- else: # space\r
- pause(dev, DAH + DOT)\r
- pause(dev, DOT)\r
-\r
-def sine(dev, length, wave):\r
- for i in range(length):\r
- dev.writeframesraw(wave)\r
-\r
-def pause(dev, length):\r
- for i in range(length):\r
- dev.writeframesraw(nowave)\r
-\r
-if __name__ == '__main__':\r
- main()\r