import math, wave, struct SR=48000 HARM=(1.00, 0.85, 0.10, 0.02) def note(f, dur, tau, amp=1.0): n=int(SR*dur); o=[] for i in range(n): t=i/SR s=sum(a*math.sin(2*math.pi*f*(k+1)*t) for k,a in enumerate(HARM)) o.append(s*amp*min(1.0,t/0.004)*math.exp(-t/tau)) return o def thump(f, dur, amp): n=int(SR*dur); o=[]; ph=0.0 for i in range(n): t=i/SR ph += 2*math.pi*(f*(1+1.2*math.exp(-t/0.02)))/SR o.append(math.sin(ph)*amp*math.exp(-t/(dur*0.30))) return o def mix(layers,total): b=[0.0]*total for off,s in layers: for i,v in enumerate(s): if off+i0.97: g*=0.97/pk with wave.open(name,'w') as w: w.setnchannels(1); w.setsampwidth(2); w.setframerate(SR) w.writeframes(b''.join(struct.pack('