diff --git a/audio.py b/audio.py
index 3cb059606b3fe8fa6be4887114981c3135623529..1582d22a434109dec9c88c6dfa41a48b4d6cd304 100644
--- a/audio.py
+++ b/audio.py
@@ -4,10 +4,15 @@ import pyaudio
 import sys
 import time
 
-p = pyaudio.PyAudio()
+class Voice:
+    def __init__(self, frame_rate):
+        self.current_frame = 0
+        self.frame_rate = frame_rate
 
-current_frame = 0
-frame_rate = 44100
+    def generate(self, n):
+        data = make_frames(self.current_frame, n, self.frame_rate)
+        self.current_frame += n
+        return data
 
 def square(x, duty = 0.5):
     x1 = x % 1
@@ -26,7 +31,7 @@ def xsin(x):
 def A(t, level = 16384, decay_rate = 3):
     return level * math.exp(-decay_rate * t)
 
-def make_frames(k0, n):
+def make_frames(k0, n, frame_rate):
     f = 440
     T = 1 / frame_rate
     F = f / frame_rate
@@ -39,24 +44,31 @@ def make_frames(k0, n):
                 for k in range(k0, k0 + n))
     return data.tobytes()
 
-def callback(in_data, frame_count, time_info, status):
-    global current_frame
-    data = make_frames(current_frame, frame_count)
-    current_frame += frame_count
-    return (data, pyaudio.paContinue)
+def main():
+    frame_rate = 44100
 
-stream = p.open(format = pyaudio.paInt16,
-                channels = 1,
-                rate = frame_rate,
-                output = True,
-                stream_callback = callback)
+    p = pyaudio.PyAudio()
+    v = Voice(frame_rate)
 
-stream.start_stream()
+    def callback(in_data, frame_count, time_info, status):
+        data = v.generate(frame_count)
+        return (data, pyaudio.paContinue)
 
-while stream.is_active():
-    time.sleep(1)
+    stream = p.open(format = pyaudio.paInt16,
+                    channels = 1,
+                    rate = frame_rate,
+                    output = True,
+                    stream_callback = callback)
 
-stream.stop_stream()
-stream.close()
+    stream.start_stream()
 
-p.terminate()
+    while stream.is_active():
+        time.sleep(1)
+
+    stream.stop_stream()
+    stream.close()
+
+    p.terminate()
+
+if __name__ == '__main__':
+    main()