mirror of
				https://github.com/python/cpython.git
				synced 2025-10-30 21:21:22 +00:00 
			
		
		
		
	Merged revisions 75337 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk ........ r75337 | georg.brandl | 2009-10-11 10:18:44 +0200 (So, 11 Okt 2009) | 1 line Update morse script, avoid globals, use iterators. ........
This commit is contained in:
		
							parent
							
								
									7bb0497336
								
							
						
					
					
						commit
						e63514b0e3
					
				
					 1 changed files with 128 additions and 0 deletions
				
			
		
							
								
								
									
										128
									
								
								Demo/scripts/morse.py
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										128
									
								
								Demo/scripts/morse.py
									
										
									
									
									
										Executable file
									
								
							|  | @ -0,0 +1,128 @@ | ||||||
|  | #! /usr/bin/env python | ||||||
|  | 
 | ||||||
|  | # DAH should be three DOTs. | ||||||
|  | # Space between DOTs and DAHs should be one DOT. | ||||||
|  | # Space between two letters should be one DAH. | ||||||
|  | # Space between two words should be DOT DAH DAH. | ||||||
|  | 
 | ||||||
|  | import sys, math, aifc | ||||||
|  | from contextlib import closing | ||||||
|  | 
 | ||||||
|  | DOT = 30 | ||||||
|  | DAH = 3 * DOT | ||||||
|  | OCTAVE = 2                              # 1 == 441 Hz, 2 == 882 Hz, ... | ||||||
|  | 
 | ||||||
|  | morsetab = { | ||||||
|  |         'A': '.-',              'a': '.-', | ||||||
|  |         'B': '-...',            'b': '-...', | ||||||
|  |         'C': '-.-.',            'c': '-.-.', | ||||||
|  |         'D': '-..',             'd': '-..', | ||||||
|  |         'E': '.',               'e': '.', | ||||||
|  |         'F': '..-.',            'f': '..-.', | ||||||
|  |         'G': '--.',             'g': '--.', | ||||||
|  |         'H': '....',            'h': '....', | ||||||
|  |         'I': '..',              'i': '..', | ||||||
|  |         'J': '.---',            'j': '.---', | ||||||
|  |         'K': '-.-',             'k': '-.-', | ||||||
|  |         'L': '.-..',            'l': '.-..', | ||||||
|  |         'M': '--',              'm': '--', | ||||||
|  |         'N': '-.',              'n': '-.', | ||||||
|  |         'O': '---',             'o': '---', | ||||||
|  |         'P': '.--.',            'p': '.--.', | ||||||
|  |         'Q': '--.-',            'q': '--.-', | ||||||
|  |         'R': '.-.',             'r': '.-.', | ||||||
|  |         'S': '...',             's': '...', | ||||||
|  |         'T': '-',               't': '-', | ||||||
|  |         'U': '..-',             'u': '..-', | ||||||
|  |         'V': '...-',            'v': '...-', | ||||||
|  |         'W': '.--',             'w': '.--', | ||||||
|  |         'X': '-..-',            'x': '-..-', | ||||||
|  |         'Y': '-.--',            'y': '-.--', | ||||||
|  |         'Z': '--..',            'z': '--..', | ||||||
|  |         '0': '-----',           ',': '--..--', | ||||||
|  |         '1': '.----',           '.': '.-.-.-', | ||||||
|  |         '2': '..---',           '?': '..--..', | ||||||
|  |         '3': '...--',           ';': '-.-.-.', | ||||||
|  |         '4': '....-',           ':': '---...', | ||||||
|  |         '5': '.....',           "'": '.----.', | ||||||
|  |         '6': '-....',           '-': '-....-', | ||||||
|  |         '7': '--...',           '/': '-..-.', | ||||||
|  |         '8': '---..',           '(': '-.--.-', | ||||||
|  |         '9': '----.',           ')': '-.--.-', | ||||||
|  |         ' ': ' ',               '_': '..--.-', | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | nowave = b'\0' * 200 | ||||||
|  | 
 | ||||||
|  | # If we play at 44.1 kHz (which we do), then if we produce one sine | ||||||
|  | # wave in 100 samples, we get a tone of 441 Hz.  If we produce two | ||||||
|  | # sine waves in these 100 samples, we get a tone of 882 Hz.  882 Hz | ||||||
|  | # appears to be a nice one for playing morse code. | ||||||
|  | def mkwave(octave): | ||||||
|  |     sinewave = bytearray() | ||||||
|  |     for i in range(100): | ||||||
|  |         val = int(math.sin(math.pi * i * octave / 50.0) * 30000) | ||||||
|  |         sinewave.extend([(val >> 8) & 255, val & 255]) | ||||||
|  |     return bytes(sinewave) | ||||||
|  | 
 | ||||||
|  | defaultwave = mkwave(OCTAVE) | ||||||
|  | 
 | ||||||
|  | def main(): | ||||||
|  |     import getopt | ||||||
|  |     try: | ||||||
|  |         opts, args = getopt.getopt(sys.argv[1:], 'o:p:') | ||||||
|  |     except getopt.error: | ||||||
|  |         sys.stderr.write('Usage ' + sys.argv[0] + | ||||||
|  |                          ' [ -o outfile ] [ -p octave ] [ words ] ...\n') | ||||||
|  |         sys.exit(1) | ||||||
|  |     wave = defaultwave | ||||||
|  |     outfile = 'morse.aifc' | ||||||
|  |     for o, a in opts: | ||||||
|  |         if o == '-o': | ||||||
|  |             outfile = a | ||||||
|  |         if o == '-p': | ||||||
|  |             wave = mkwave(int(a)) | ||||||
|  |     with closing(aifc.open(outfile, 'w')) as fp: | ||||||
|  |         fp.setframerate(44100) | ||||||
|  |         fp.setsampwidth(2) | ||||||
|  |         fp.setnchannels(1) | ||||||
|  |         if args: | ||||||
|  |             source = [' '.join(args)] | ||||||
|  |         else: | ||||||
|  |             source = iter(sys.stdin.readline, '') | ||||||
|  |         for line in source: | ||||||
|  |             mline = morse(line) | ||||||
|  |             play(mline, fp, wave) | ||||||
|  | 
 | ||||||
|  | # Convert a string to morse code with \001 between the characters in | ||||||
|  | # the string. | ||||||
|  | def morse(line): | ||||||
|  |     res = '' | ||||||
|  |     for c in line: | ||||||
|  |         try: | ||||||
|  |             res += morsetab[c] + '\001' | ||||||
|  |         except KeyError: | ||||||
|  |             pass | ||||||
|  |     return res | ||||||
|  | 
 | ||||||
|  | # Play a line of morse code. | ||||||
|  | def play(line, fp, wave): | ||||||
|  |     for c in line: | ||||||
|  |         if c == '.': | ||||||
|  |             sine(fp, DOT, wave) | ||||||
|  |         elif c == '-': | ||||||
|  |             sine(fp, DAH, wave) | ||||||
|  |         else:                   # space | ||||||
|  |             pause(fp, DAH + DOT) | ||||||
|  |         pause(fp, DOT) | ||||||
|  | 
 | ||||||
|  | def sine(fp, length, wave): | ||||||
|  |     for i in range(length): | ||||||
|  |         fp.writeframesraw(wave) | ||||||
|  | 
 | ||||||
|  | def pause(fp, length): | ||||||
|  |     for i in range(length): | ||||||
|  |         fp.writeframesraw(nowave) | ||||||
|  | 
 | ||||||
|  | if __name__ == '__main__': | ||||||
|  |     main() | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Georg Brandl
						Georg Brandl