Import Upstream version 2.7.18
This commit is contained in:
180
Mac/Demo/sound/morse.py
Normal file
180
Mac/Demo/sound/morse.py
Normal file
@@ -0,0 +1,180 @@
|
||||
import sys, math
|
||||
|
||||
DOT = 30
|
||||
DAH = 80
|
||||
OCTAVE = 2 # 1 == 441 Hz, 2 == 882 Hz, ...
|
||||
SAMPWIDTH = 2
|
||||
FRAMERATE = 44100
|
||||
BASEFREQ = 441
|
||||
QSIZE = 20000
|
||||
|
||||
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': '----.',
|
||||
',': '--..--',
|
||||
'.': '.-.-.-',
|
||||
'?': '..--..',
|
||||
';': '-.-.-.',
|
||||
':': '---...',
|
||||
"'": '.----.',
|
||||
'-': '-....-',
|
||||
'/': '-..-.',
|
||||
'(': '-.--.-',
|
||||
')': '-.--.-',
|
||||
'_': '..--.-',
|
||||
' ': ' '
|
||||
}
|
||||
|
||||
# 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):
|
||||
global sinewave, nowave
|
||||
sinewave = ''
|
||||
n = int(FRAMERATE / BASEFREQ)
|
||||
for i in range(n):
|
||||
val = int(math.sin(2 * math.pi * i * octave / n) * 0x7fff)
|
||||
sample = chr((val >> 8) & 255) + chr(val & 255)
|
||||
sinewave = sinewave + sample[:SAMPWIDTH]
|
||||
nowave = '\0' * (n*SAMPWIDTH)
|
||||
|
||||
mkwave(OCTAVE)
|
||||
|
||||
class BufferedAudioDev:
|
||||
def __init__(self, *args):
|
||||
import audiodev
|
||||
self._base = apply(audiodev.AudioDev, args)
|
||||
self._buffer = []
|
||||
self._filled = 0
|
||||
self._addmethods(self._base, self._base.__class__)
|
||||
def _addmethods(self, inst, cls):
|
||||
for name in cls.__dict__.keys():
|
||||
if not hasattr(self, name):
|
||||
try:
|
||||
setattr(self, name, getattr(inst, name))
|
||||
except:
|
||||
pass
|
||||
for basecls in cls.__bases__:
|
||||
self._addmethods(self, inst, basecls)
|
||||
def writeframesraw(self, frames):
|
||||
self._buffer.append(frames)
|
||||
self._filled = self._filled + len(frames)
|
||||
if self._filled >= QSIZE:
|
||||
self.flush()
|
||||
def wait(self):
|
||||
self.flush()
|
||||
self._base.wait()
|
||||
def flush(self):
|
||||
print 'flush: %d blocks, %d bytes' % (len(self._buffer), self._filled)
|
||||
if self._buffer:
|
||||
import string
|
||||
self._base.writeframes(string.joinfields(self._buffer, ''))
|
||||
self._buffer = []
|
||||
self._filled = 0
|
||||
|
||||
def main(args = sys.argv[1:]):
|
||||
import getopt, string
|
||||
try:
|
||||
opts, args = getopt.getopt(args, 'o:p:')
|
||||
except getopt.error:
|
||||
sys.stderr.write('Usage ' + sys.argv[0] +
|
||||
' [ -o outfile ] [ args ] ...\n')
|
||||
sys.exit(1)
|
||||
dev = None
|
||||
for o, a in opts:
|
||||
if o == '-o':
|
||||
import aifc
|
||||
dev = aifc.open(a, 'w')
|
||||
dev.setframerate(FRAMERATE)
|
||||
dev.setsampwidth(SAMPWIDTH)
|
||||
dev.setnchannels(1)
|
||||
if o == '-p':
|
||||
mkwave(string.atoi(a))
|
||||
if not dev:
|
||||
dev = BufferedAudioDev()
|
||||
dev.setoutrate(FRAMERATE)
|
||||
dev.setsampwidth(SAMPWIDTH)
|
||||
dev.setnchannels(1)
|
||||
dev.close = dev.stop
|
||||
if args:
|
||||
line = string.join(args)
|
||||
else:
|
||||
line = sys.stdin.readline()
|
||||
while line:
|
||||
print line
|
||||
mline = morse(line)
|
||||
print mline
|
||||
play(mline, dev)
|
||||
if hasattr(dev, 'wait'):
|
||||
dev.wait()
|
||||
if not args:
|
||||
line = sys.stdin.readline()
|
||||
else:
|
||||
line = ''
|
||||
dev.close()
|
||||
|
||||
# Convert a string to morse code with \001 between the characters in
|
||||
# the string.
|
||||
def morse(line):
|
||||
res = ''
|
||||
for c in line:
|
||||
try:
|
||||
res = res + morsetab[c] + '\001'
|
||||
except KeyError:
|
||||
pass
|
||||
return res
|
||||
|
||||
# Play a line of morse code.
|
||||
def play(line, dev):
|
||||
for c in line:
|
||||
if c == '.':
|
||||
sine(dev, DOT)
|
||||
elif c == '-':
|
||||
sine(dev, DAH)
|
||||
else:
|
||||
pause(dev, DAH)
|
||||
pause(dev, DOT)
|
||||
|
||||
def sine(dev, length):
|
||||
dev.writeframesraw(sinewave*length)
|
||||
|
||||
def pause(dev, length):
|
||||
dev.writeframesraw(nowave*length)
|
||||
|
||||
if __name__ == '__main__' or sys.argv[0] == __name__:
|
||||
main()
|
||||
188
Mac/Demo/sound/morselib.py
Normal file
188
Mac/Demo/sound/morselib.py
Normal file
@@ -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()
|
||||
45
Mac/Demo/sound/playaiff.py
Normal file
45
Mac/Demo/sound/playaiff.py
Normal file
@@ -0,0 +1,45 @@
|
||||
from Carbon.Sound import *
|
||||
from Carbon import Snd
|
||||
|
||||
import aifc, audioop
|
||||
|
||||
fn = 'f:just samples:2ndbeat.aif'
|
||||
af = aifc.open(fn, 'r')
|
||||
print af.getparams()
|
||||
print 'nframes =', af.getnframes()
|
||||
print 'nchannels =', af.getnchannels()
|
||||
print 'framerate =', af.getframerate()
|
||||
nframes = min(af.getnframes(), 100000)
|
||||
frames = af.readframes(nframes)
|
||||
print 'len(frames) =', len(frames)
|
||||
print repr(frames[:100])
|
||||
frames = audioop.add(frames, '\x80'*len(frames), 1)
|
||||
print repr(frames[:100])
|
||||
|
||||
import struct
|
||||
|
||||
header1 = struct.pack('llhhllbbl',
|
||||
0,
|
||||
af.getnchannels(),
|
||||
af.getframerate(),0,
|
||||
0,
|
||||
0,
|
||||
0xFF,
|
||||
60,
|
||||
nframes)
|
||||
print repr(header1)
|
||||
header2 = struct.pack('llhlll', 0, 0, 0, 0, 0, 0)
|
||||
header3 = struct.pack('hhlll',
|
||||
af.getsampwidth()*8,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0)
|
||||
print repr(header3)
|
||||
header = header1 + header2 + header3
|
||||
|
||||
buffer = header + frames
|
||||
|
||||
chan = Snd.SndNewChannel(5,0x00C0)
|
||||
|
||||
Snd.SndDoCommand(chan, (bufferCmd, 0, buffer), 0)
|
||||
Reference in New Issue
Block a user