6efc05ebff69587062fe13d326db171a9b28ab5a
[naja.git] / tools / gen_sound.py
1 # Generate imperfect sine waves
2
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.
8
9 import sys
10 import math
11 import struct
12
13 OUTPUT_RATE = 8125
14 MAX = 95
15
16 def gen_sine(freq, secs):
17     filename = 'beep%s.pcm' % freq
18     # We generate freq cycles and sample that OUTPUT_RATE times
19     per_cycle = OUTPUT_RATE / freq
20     data = []
21     for x in range(per_cycle):
22         rad = float(x) / per_cycle * 2 * math.pi
23         y = 256 * int(MAX * math.sin(rad))
24         data.extend([struct.pack('<i', y)] * 4)
25     output = open(filename, 'w')
26     # This is correct because OUTPUT_RATE = CDDA rate / 4 and we repeat
27     # the samples 4 times, so this works out to CDDA rate
28     for x in range(int(freq * secs)):
29         output.write(''.join(data))
30     output.close()
31     print 'Wrote output to %s' % filename
32
33
34 def usage():
35     print 'Unexpected input'
36     print 'Usage gen_sound <freq> [<length>]'
37     print ' where <freq> is the frequency in Hz (int)'
38     print ' and [<length>] is the time in seconds (float) - default 0.25'
39
40
41 if __name__ == "__main__":
42     try:
43        freq = int(sys.argv[1])
44        if len(sys.argv) > 2:
45           secs = float(sys.argv[2])
46        else:
47           secs = 0.25
48     except Exception, exc:
49        usage()
50        print 'Error was', exc
51        sys.exit(1)
52
53     gen_sine(freq, secs)
54