import pyaudio, math, struct, random
amp = 20000.0
dcoffset = 32768.0
chunk = 2048
decay = 0.99985
srate = 44100
p = pyaudio.PyAudio()
stream = p.open(format = pyaudio.paInt16,
channels = 2,
rate = srate,
output = True)
seq = [0.5, 0, 0, 0, 8, 0, 0, 0.5, 0, 0.5, 0, 0, 8, 0, 0, 0]
seqstep = 0
seq2 = [0.8, 0.1, 0.3, 0.2, 1, 0.4, 0.3, 0.1 ,0.8, 0.2, 0.3, 0.2, 1, 0.2, 0.3, 1]
seq2dec = [0.995,0.995,0.995,0.995, 0.9995,0.995,0.995,0.995, 0.995,0.995,0.995,0.995, 0.9995,0.995,0.995,0.995]
seq3 = [1, 0, 0, 0, 0.5, 0, 0, 1, 0, 0.9, 0, 0, 0.5, 0, 0, 0.2]
delaylen = chunk * 3 * 3
delay = [0] * delaylen
delaylev = 0.35
delayfeed = 0.35
delaypos = 0
notes = [130.81, 155.56, 196.00, 261.63, 311.13, 392.00]
notesseq = [0,0,1,2]
notesstep = 0
notesbank = [
[130.81, 155.56, 196.00, 261.63, 311.13, 392.00],
[98.00, 116.54, 146.83, 196.00, 233.08, 293.66],
[110.00, 130.81, 164.81, 220.00, 261.63, 329.63]
]
def calc_frq(r):
global srate
return (2*math.pi*r)/srate
def get_freq():
global seqstep
if seq[seqstep] == 0:
r = notes[random.randint(0,len(notes)-1)]
else:
r = notes[0] * seq[seqstep]
fr = calc_frq(r)
return fr
def square(val):
if val > 0:
return 1
return -1
def saw(val):
val = math.fmod(val, math.pi)
val = (math.pi - val) / (math.pi /2) - 1
return val
hhtamp = 0
def hht(i, cycle):
global hhtamp,seqstep
if i==0 and cycle==0:
hhtamp = amp * seq2[seqstep] * 1.4
hhtamp = hhtamp * seq2dec[seqstep]
return random.random()*hhtamp
ddrmamp = 0
ddrmfreq = 0
ddrmpos = 0
def ddrm(i, cycle):
global ddrmamp,ddrmfreq,ddrmpos,seqstep
if i==0 and cycle==0:
ddrmamp = amp * seq3[seqstep]
ddrmpos = 0
ddrmfreq = calc_frq(240)
ddrmamp = ddrmamp * 0.9987
ddrmfreq = ddrmfreq * 0.995
ddrmpos = ddrmpos + ddrmfreq
return square(math.sin(ddrmpos))*ddrmamp
try:
a = 0
b = 0
c = 0
cycle = 0
inc = get_freq()
inc2 = inc * 0.25
inc3 = calc_frq(16)
portam = inc
portam2 = inc2
camp = amp
while True:
data = ''
if cycle == 3:
print seqstep,
if seqstep == 0:
notes = notesbank[notesseq[notesstep]]
notesstep = (notesstep + 1) % len(notesseq)
seqstep = seqstep + 1
seqstep = seqstep % len(seq)
camp = amp
inc = get_freq()
inc2 = inc * 0.25
cycle = 0
for i in range(chunk):
portam = (portam * 0.9985 + inc * 0.0015)
portam2 = (portam2 * 0.9985 + inc2 * 0.0015)
a = a + portam
b = b + portam2
c = c + inc3
osc1 = math.sin(a)*camp
osc2 = square(math.sin(a))
osc3 = osc2 + saw(b)*camp
noise = hht(i, cycle)
drm = ddrm(i, cycle)
dry = noise + drm + osc1 #+ osc3*0.4
sample = delay[delaypos] + dry
delay[delaypos] = delay[delaypos]*delayfeed + osc1*delaylev
delaypos = (delaypos + 1)%delaylen
#clipping
if sample > 32767:
sample = 32767
if sample < -32767:
sample = -32767
sample = struct.pack('h', sample)
data = data + sample + sample
camp = camp * decay
stream.write(data)
cycle = cycle + 1
except KeyboardInterrupt:
print 'end..?'
finally:
stream.close()
p.terminate()