# Generate imperfect sine waves
-#
+#
# Design notes. Produces ~= (user requested) s of raw audio
# We're aiming for an 8-bit'ish effect, so we're going with
# 8125 Hz, 8 bit sampling, but faking it out to
import struct
OUTPUT_RATE = 8125
-MAX = 95
+DEFAULT_VOL = 95
-def gen_sine(freq, secs):
+
+def gen_sine(freq, secs, volume):
filename = 'beep%s.pcm' % freq
# We generate freq cycles and sample that OUTPUT_RATE times
per_cycle = OUTPUT_RATE / freq
data = []
for x in range(per_cycle):
rad = float(x) / per_cycle * 2 * math.pi
- y = 256 * int(MAX * math.sin(rad))
+ y = 256 * int(volume * math.sin(rad))
data.extend([struct.pack('<i', y)] * 4)
output = open(filename, 'w')
# This is correct because OUTPUT_RATE = CDDA rate / 4 and we repeat
def usage():
print 'Unexpected input'
- print 'Usage gen_sound <freq> [<length>]'
+ print 'Usage gen_sound <freq> [<length>] [<volume>]'
print ' where <freq> is the frequency in Hz (int)'
- print ' and [<length>] is the time in seconds (float) - default 0.25'
+ print ' [<length>] is the time in seconds (float) - default 0.25'
+ print (' and [<volume>] is the volume (integer between 0 and 127)'
+ ' - default %s' % DEFAULT_VOL)
if __name__ == "__main__":
try:
- freq = int(sys.argv[1])
- if len(sys.argv) > 2:
- secs = float(sys.argv[2])
- else:
- secs = 0.25
+ freq = int(sys.argv[1])
+ if len(sys.argv) > 2:
+ secs = float(sys.argv[2])
+ else:
+ secs = 0.25
+ if len(sys.argv) > 3:
+ volume = int(sys.argv[3])
+ else:
+ volume = DEFAULT_VOL
except Exception, exc:
- usage()
- print 'Error was', exc
- sys.exit(1)
+ usage()
+ print 'Error was', exc
+ sys.exit(1)
+
+ if volume > 128 or volume < 0:
+ usage()
+ print 'Invalid volume: %s' % volume
+ sys.exit(1)
+
+ if freq > 2000 or freq < 100:
+ usage()
+ print 'Invalid freq: %s' % volume
+ sys.exit(1)
- gen_sine(freq, secs)
-
+ gen_sine(freq, secs, volume)