1 # Generate imperfect sine waves
3 # Design notes. Produces ~= (user requested) s of raw audio
4 # We're aiming for an 8-bit'ish effect, so we're going with
5 # 8125 Hz, 8 bit sampling, but faking it out to
6 # CDDA output (44100 Hz, 16 bit signed) for easier conversion to ogg
7 # by multiply the value by 256 (after roundin) and repeating it 4 times.
17 def gen_sine(freq, secs, volume):
18 filename = 'beep%s.pcm' % freq
19 # We generate freq cycles and sample that OUTPUT_RATE times
20 per_cycle = OUTPUT_RATE // freq
22 for x in range(per_cycle):
23 rad = float(x) / per_cycle * 2 * math.pi
24 y = 256 * int(volume * math.sin(rad))
25 data.extend([struct.pack('<i', y)] * 4)
26 output = open(filename, 'wb')
27 # This is correct because OUTPUT_RATE = CDDA rate / 4 and we repeat
28 # the samples 4 times, so this works out to CDDA rate
29 for x in range(int(freq * secs)):
30 output.write(b''.join(data))
32 print ('Wrote output to %s' % filename)
36 print ('Unexpected input')
37 print ('Usage gen_sound <freq> [<length>] [<volume>]')
38 print (' where <freq> is the frequency in Hz (int)')
39 print (' [<length>] is the time in seconds (float) - default 0.25')
40 print (' and [<volume>] is the volume (integer between 0 and 127)'
41 ' - default %s' % DEFAULT_VOL)
44 if __name__ == "__main__":
46 freq = int(sys.argv[1])
48 secs = float(sys.argv[2])
52 volume = int(sys.argv[3])
55 except Exception as exc:
57 print ('Error was: %s' % exc)
60 if volume > 128 or volume < 0:
62 print ('Invalid volume: %s' % volume)
65 if freq > 2000 or freq < 100:
67 print ('Invalid freq: %s' % volume)
70 gen_sine(freq, secs, volume)