Make gen_sound work under python3
[naja.git] / tools / gen_sound.py
index 6efc05ebff69587062fe13d326db171a9b28ab5a..db37d8267325d187ed9ffdfce8ec5c861e8be35a 100644 (file)
@@ -1,5 +1,5 @@
 # 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
@@ -11,44 +11,60 @@ import math
 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
+    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')
+    output = open(filename, 'wb')
     # This is correct because OUTPUT_RATE = CDDA rate / 4 and we repeat
     # the samples 4 times, so this works out to CDDA rate
     for x in range(int(freq * secs)):
-        output.write(''.join(data))
+        output.write(b''.join(data))
     output.close()
-    print 'Wrote output to %s' % filename
+    print ('Wrote output to %s' % filename)
 
 
 def usage():
-    print 'Unexpected input'
-    print 'Usage gen_sound <freq> [<length>]'
-    print ' where <freq> is the frequency in Hz (int)'
-    print ' and [<length>] is the time in seconds (float) - default 0.25'
+    print ('Unexpected input')
+    print ('Usage gen_sound <freq> [<length>] [<volume>]')
+    print (' where <freq> is the frequency in Hz (int)')
+    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
-    except Exception, exc:
-       usage()
-       print 'Error was', exc
-       sys.exit(1)
-
-    gen_sine(freq, secs)
-      
+        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 as exc:
+        usage()
+        print ('Error was: %s' % 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, volume)