#!/usr/bin/env python3 import wave, array, math, sys SR = 44100 def synth_multi(path, freqs, dur=6.0, amp=0.5, am=0.3, sr=SR): n = int(sr*dur) out = [0.0]*n for f in freqs: for i in range(n): t = i/sr # each tone: carrier + gentle AM (makes it "resonant" for the detector) out[i] += math.sin(2*math.pi*f*t)*(1.0 + am*math.sin(2*math.pi*(f/8.0)*t)) peak = max(abs(v) for v in out) or 1.0 sc = amp/peak a = array.array('h') for i, v in enumerate(out): t = i/sr fade = min(1.0, t/0.05, (dur-t)/0.1) a.append(max(-32767, min(32767, int(v*sc*32767*fade)))) w = wave.open(path, 'wb') w.setnchannels(1); w.setsampwidth(2); w.setframerate(sr) w.writeframes(a.tobytes()) w.close() print("wrote", path, "tones", len(freqs), "amp", amp) if __name__ == '__main__': freqs = [int(f) for f in sys.argv[2].split(',')] synth_multi(sys.argv[1], freqs, dur=float(sys.argv[3]) if len(sys.argv)>3 else 6.0)