/Mac/Demo/sound/morselib.py

http://unladen-swallow.googlecode.com/ · Python · 188 lines · 156 code · 31 blank · 1 comment · 17 complexity · d32c311d9098664eecc5bb6603bd8165 MD5 · raw file

  1. """Translate text strings to Morse code"""
  2. FRAMERATE = 22050
  3. SAMPWIDTH = 2
  4. BASEFREQ = 441
  5. OCTAVE = 2
  6. DOT = 30
  7. DAH = 80
  8. morsetab = {
  9. 'a': '.-',
  10. 'b': '-...',
  11. 'c': '-.-.',
  12. 'd': '-..',
  13. 'e': '.',
  14. 'f': '..-.',
  15. 'g': '--.',
  16. 'h': '....',
  17. 'i': '..',
  18. 'j': '.---',
  19. 'k': '-.-',
  20. 'l': '.-..',
  21. 'm': '--',
  22. 'n': '-.',
  23. 'o': '---',
  24. 'p': '.--.',
  25. 'q': '--.-',
  26. 'r': '.-.',
  27. 's': '...',
  28. 't': '-',
  29. 'u': '..-',
  30. 'v': '...-',
  31. 'w': '.--',
  32. 'x': '-..-',
  33. 'y': '-.--',
  34. 'z': '--..',
  35. '0': '-----',
  36. '1': '.----',
  37. '2': '..---',
  38. '3': '...--',
  39. '4': '....-',
  40. '5': '.....',
  41. '6': '-....',
  42. '7': '--...',
  43. '8': '---..',
  44. '9': '----.',
  45. ',': '--..--',
  46. '.': '.-.-.-',
  47. '?': '..--..',
  48. ';': '-.-.-.',
  49. ':': '---...',
  50. "'": '.----.',
  51. '-': '-....-',
  52. '/': '-..-.',
  53. '(': '-.--.-',
  54. ')': '-.--.-', # XXX same as code for '(' ???
  55. '_': '..--.-',
  56. ' ': ' '
  57. }
  58. def morsecode(s):
  59. from string import lower
  60. m = ''
  61. for c in s:
  62. c = lower(c)
  63. if morsetab.has_key(c):
  64. c = morsetab[c] + ' '
  65. else:
  66. c = '? '
  67. m = m + c
  68. return m
  69. class BaseMorse:
  70. "base class for morse transmissions"
  71. def __init__(self):
  72. "constructor"
  73. self.dots = DOT
  74. self.dahs = DAH
  75. def noise(self, duration):
  76. "beep for given duration"
  77. pass
  78. def pause(self, duration):
  79. "pause for given duration"
  80. pass
  81. def dot(self):
  82. "short beep"
  83. self.noise(self.dots)
  84. def dah(self):
  85. "long beep"
  86. self.noise(self.dahs)
  87. def pdot(self):
  88. "pause as long as a dot"
  89. self.pause(self.dots)
  90. def pdah(self):
  91. "pause as long as a dah"
  92. self.pause(self.dahs)
  93. def sendmorse(self, s):
  94. for c in s:
  95. if c == '.': self.dot()
  96. elif c == '-': self.dah()
  97. else: self.pdah()
  98. self.pdot()
  99. def sendascii(self, s):
  100. self.sendmorse(morsecode(s))
  101. def send(self, s):
  102. self.sendascii(s)
  103. import Audio_mac
  104. class MyAudio(Audio_mac.Play_Audio_mac):
  105. def _callback(self, *args):
  106. if hasattr(self, 'usercallback'): self.usercallback()
  107. apply(Audio_mac.Play_Audio_mac._callback, (self,) + args)
  108. class MacMorse(BaseMorse):
  109. "Mac specific class to play Morse code"
  110. def __init__(self):
  111. BaseMorse.__init__(self)
  112. self.dev = MyAudio()
  113. self.dev.setoutrate(FRAMERATE)
  114. self.dev.setsampwidth(SAMPWIDTH)
  115. self.dev.setnchannels(1)
  116. self.dev.usercallback = self.usercallback
  117. sinewave = ''
  118. n = int(FRAMERATE / BASEFREQ)
  119. octave = OCTAVE
  120. from math import sin, pi
  121. for i in range(n):
  122. val = int(sin(2 * pi * i * octave / n) * 0x7fff)
  123. sample = chr((val >> 8) & 255) + chr(val & 255)
  124. sinewave = sinewave + sample[:SAMPWIDTH]
  125. self.sinewave = sinewave
  126. self.silence = '\0' * (n*SAMPWIDTH)
  127. self.morsequeue = ''
  128. def __del__(self):
  129. self.close()
  130. def close(self):
  131. self.dev = None
  132. def pause(self, duration):
  133. self.dev.writeframes(self.silence * duration)
  134. def noise(self, duration):
  135. self.dev.writeframes(self.sinewave * duration)
  136. def sendmorse(self, s):
  137. self.morsequeue = self.morsequeue + s
  138. self.dev.usercallback()
  139. self.dev.usercallback()
  140. self.dev.usercallback()
  141. def usercallback(self):
  142. if self.morsequeue:
  143. c, self.morsequeue = self.morsequeue[0], self.morsequeue[1:]
  144. if c == '.': self.dot()
  145. elif c == '-': self.dah()
  146. else: self.pdah()
  147. self.pdot()
  148. def test():
  149. m = MacMorse()
  150. while 1:
  151. try:
  152. line = raw_input('Morse line: ')
  153. except (EOFError, KeyboardInterrupt):
  154. break
  155. m.send(line)
  156. while m.morsequeue: pass
  157. test()