import portaudio BUFFER_SIZE = 1024 wf = wave.open(sys.argv[1], 'rb') atexit.register(wf.close) nchannels, sampwidth, framerate, nframes, comptype, compname = wf.getparams() def callback(in_list, out_list, time_info, user_data): frames = wf.readframes(len(out_list) / nchannels) if len(frames) < len(out_list): return portaudio.COMPLETE if sampwidth == 1: values = struct.unpack('%dB' % (len(frames) / nchannels), frames) elif sampwidth == 2: values = struct.unpack('%dh' % (len(frames) / nchannels), frames) for i in range(len(out_list)): out_list[i] = values[i] return portaudio.CONTINUE portaudio.initialize() atexit.register(portaudio.terminate) stream = portaudio.open_default_stream(0, nchannels, portaudio.INT16, framerate, BUFFER_SIZE, callback, None) stream.start() while stream.is_active(): time.sleep(1)
saw_wave = lambda x: x % 2 - 1 sine_wave = lambda x: sin(x * pi) square_wave = lambda x: int(x % 2) * 2 - 1 white_noise = lambda x: random() def callback(in_list, out_list, time_info, user_data): if user_data[0] < NOTE_FREQUENCY: func = saw_wave elif user_data[0] < NOTE_FREQUENCY * 2: func = sine_wave elif user_data[0] < NOTE_FREQUENCY * 3: func = square_wave else: func = white_noise for i in range(0, len(out_list), 2): user_data[0] += NOTE_FREQUENCY / SAMPLE_RATE out_list[i] = func(user_data[0]) out_list[i+1] = func(user_data[0]) return portaudio.CONTINUE portaudio.initialize() register(portaudio.terminate) stream = portaudio.open_default_stream(0, 2, portaudio.FLOAT32, SAMPLE_RATE, BUFFER_SIZE, callback, [0.0]) stream.start() sleep(4) stream.abort()