107 lines
2.1 KiB
Python
Executable File
107 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)
|