import math, wave, struct SR=48000 HARM=(1.00, 0.85, 0.10, 0.02) # mesmo timbre medido nas referencias ATTACK=0.004 def note(f, dur, tau): 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*min(1.0,t/ATTACK)*math.exp(-t/tau)) return o def peak_rms(x, win=int(SR*0.01)): return max(math.sqrt(sum(v*v for v in x[i:i+win])/win) for i in range(0,len(x)-win,win)) def write(name, buf, target): g=target/max(1e-9,peak_rms(buf)) pk=max(abs(s*g) for s in buf) if pk>0.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('