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()