import math, random, wave, struct SR=48000; random.seed(11) 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): """Instrumento 2: golpe grave com queda de tom. Da impacto no ataque e morre em 90ms — engorda sem alongar.""" 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 air(dur, amp, cutoff=5000): """Instrumento 3: sopro curto de ruido filtrado. Brilho no inicio, sem cauda.""" n=int(SR*dur) y=0.0; a=1-math.exp(-2*math.pi*cutoff/SR); o=[] for i in range(n): t=i/SR y += a*(random.uniform(-1,1)-y) o.append(y*amp*min(1.0,t/0.008)*math.exp(-t/(dur*0.22))) 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('