| 
									
										
										
										
											1990-10-13 19:23:40 +00:00
										 |  |  | 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 | 
					
						
							| 
									
										
										
										
											1992-01-01 19:35:13 +00:00
										 |  |  | 		if ib == ja: | 
					
						
							| 
									
										
										
										
											1990-10-13 19:23:40 +00:00
										 |  |  | 			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) |