mirror of
				https://github.com/python/cpython.git
				synced 2025-10-30 21:21:22 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			106 lines
		
	
	
	
		
			2.1 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			106 lines
		
	
	
	
		
			2.1 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable file
		
	
	
	
	
| import audio
 | |
| 
 | |
| RATE = 8192
 | |
| 
 | |
| # Initialize the audio stuff
 | |
| audio.setrate(3)
 | |
| audio.setoutgain(100)	# for speaker
 | |
| 
 | |
| play = audio.write
 | |
| 
 | |
| def samp(n):
 | |
| 	savegain = audio.getoutgain()
 | |
| 	try:
 | |
| 		audio.setoutgain(0)
 | |
| 		x = raw_input('Hit Enter to sample ' + `n` + ' seconds: ')
 | |
| 		return audio.read(n*RATE)
 | |
| 	finally:
 | |
| 		audio.setoutgain(savegain)
 | |
| 
 | |
| def echo(s, delay, gain):
 | |
| 	return s[:delay] + audio.add(s[delay:], audio.amplify(s, gain, gain))
 | |
| 
 | |
| def save(s, file):
 | |
| 	f = open(file, 'w')
 | |
| 	f.write(s)
 | |
| 
 | |
| def load(file):
 | |
| 	return loadfp(open(file, 'r'))
 | |
| 
 | |
| def loadfp(fp):
 | |
| 	s = ''
 | |
| 	while 1:
 | |
| 		buf = fp.read(16*1024)
 | |
| 		if not buf: break
 | |
| 		s = s + buf
 | |
| 	return s
 | |
| 
 | |
| def unbias(s):
 | |
| 	if not s: return s
 | |
| 	a = audio.chr2num(s)
 | |
| 	sum = 0
 | |
| 	for i in a: sum = sum + i
 | |
| 	bias = (sum + len(a)/2) / len(a)
 | |
| 	print 'Bias value:', bias
 | |
| 	if bias:
 | |
| 		for i in range(len(a)):
 | |
| 			a[i] = a[i] - bias
 | |
| 		s = audio.num2chr(a)
 | |
| 	return s
 | |
| 
 | |
| # Stretch by a/b.
 | |
| # Think of this as converting the sampling rate from a samples/sec
 | |
| # to b samples/sec.  Or, if the input is a bytes long, the output
 | |
| # will be b bytes long.
 | |
| #
 | |
| def stretch(s, a, b):
 | |
| 	y = audio.chr2num(s)
 | |
| 	m = len(y)
 | |
| 	out = []
 | |
| 	n = m * b / a
 | |
| 	# i, j will walk through y and out (step 1)
 | |
| 	# ib, ja are i*b, j*a and are kept as close together as possible
 | |
| 	i, ib = 0, 0
 | |
| 	j, ja = 0, 0
 | |
| 	for j in range(n):
 | |
| 		ja = ja+a
 | |
| 		while ib < ja:
 | |
| 			i = i+1
 | |
| 			ib = ib+b
 | |
| 		if i >= m:
 | |
| 			break
 | |
| 		if ib == ja:
 | |
| 			out.append(y[i])
 | |
| 		else:
 | |
| 			out.append((y[i]*(ja-(ib-b)) + y[i-1]*(ib-ja)) / b)
 | |
| 	return audio.num2chr(out)
 | |
| 
 | |
| def sinus(freq): # return a 1-second sine wave
 | |
| 	from math import sin, pi
 | |
| 	factor = 2.0*pi*float(freq)/float(RATE)
 | |
| 	list = range(RATE)
 | |
| 	for i in list:
 | |
| 		list[i] = int(sin(float(i) * factor) * 127.0)
 | |
| 	return audio.num2chr(list)
 | |
| 
 | |
| def softclip(s):
 | |
| 	if '\177' not in s and '\200' not in s:
 | |
| 		return s
 | |
| 	num = audio.chr2num(s)
 | |
| 	extremes = (-128, 127)
 | |
| 	for i in range(1, len(num)-1):
 | |
| 		if num[i] in extremes:
 | |
| 			num[i] = (num[i-1] + num[i+1]) / 2
 | |
| 	return audio.num2chr(num)
 | |
| 
 | |
| def demo():
 | |
| 	gday = load('gday')[1000:6000]
 | |
| 	save(gday, 'gday0')
 | |
| 	gg = [gday]
 | |
| 	for i in range(1, 10):
 | |
| 		for g in gg: play(g)
 | |
| 		g = stretch(gday, 10, 10-i)
 | |
| 		save(g, 'gday' + `i`)
 | |
| 		gg.append(g)
 | |
| 	while 1:
 | |
| 		for g in gg: play(g)
 | 
