import math import sys def to_littleEndian(zahl,byte): return zahl.to_bytes(byte, 'little', signed=True) def riff_header(samples, channels): header = b"RIFF" header += to_littleEndian(samples*2*channels+44-8, 4) header += b"WAVE" header += b"fmt " # Achtung Leerschlag header += to_littleEndian(16, 4) # restlicher Header header += to_littleEndian(1, 2) # PCM-Format header += to_littleEndian(channels, 2) # 2 Kanal (stereo) header += to_littleEndian(44100, 4) # Samplerate header += to_littleEndian(2*44100*channels, 4) # Bytes/s header += to_littleEndian(2*channels, 2) # Blocksize header += to_littleEndian(16, 2) # Bits/sample header += b'data' header += to_littleEndian(samples*2*channels, 4) # Datenblock return header def sinus(t,f,a): return a*math.sin(math.pi*2*f*t) if len(sys.argv)<3: print("Bitte zwei Frequenzen angegeben!") exit(-1) f1 = float(sys.argv[1]) f2 = float(sys.argv[2]) # Rechts, Links, Links und Rechts zusammen, Beide Frequenzen überlagert und kombiniert. zeiten = [2,2,4,4] dauer = sum(zeiten) with open(f"sinus_{f1}Hz_und_{f2}Hz.wav", "wb") as wav: # b fuer binary file # Header ausgeben wav.write(riff_header(dauer*44100,2)) # i zaehlt die Samples for i in range(dauer*44100): # reale Zeit in Sekunden t = i/44100.0 sample1 = int(sinus(t,f1,15000)) if (tsum(zeiten[0:2])) else 0 sample2 = int(sinus(t,f2,15000)) if (t>zeiten[0]) else 0 if (t>sum(zeiten[0:3])): sample1 = (sample1+sample2)//2 sample2 = sample1 wav.write(to_littleEndian(sample1, 2)) wav.write(to_littleEndian(sample2, 2))