我试图在python中创建一个程序,在按下某个键时播放特定的大键琴音符.我希望它保持响应,这样你就可以继续播放更多的音符(有点像普通的电钢琴.)但是,因为存储音符的wav文件长约7-10秒,我遇到了一些问题.我每秒至少可以按10键.因此,在一个音符的持续时间内,我可以同时播放大约100个不同的wav文件.我试图使用winsound,但它无法一次播放多个wav文件.然后我转移到PyAudio,它有点像.我发现完成我想要的唯一方法是:
from msvcrt import getch import pyaudio import wave import multiprocessing as mp #This function is just code for playing a sound in PyAudio def playNote(filename): CHUNK = 1024 wf = wave.open(filename, 'rb') p = pyaudio.PyAudio() stream = p.open(format=p.get_format_from_width(wf.getsampwidth()), channels=wf.getnchannels(), rate=wf.getframerate(), output=True) data = wf.readframes(CHUNK) while data != '': stream.write(data) data = wf.readframes(CHUNK) stream.stop_stream() stream.close() p.terminate() if __name__ == "__main__": while True: #If the 'a' key is pressed: start a new process that calls playNote #and pass in the file name for a note. if ord(getch()) == 97: #a mp.Process(target=playNote, args=("F:\Project Harpsichord\The wavs\A1.wav",)).start() #If the 's' key is pressed: start a new process that calls playNote #and pass in the file name for another note. if ord(getch()) == 115: #s mp.Process(target=playNote, args=("F:\Project Harpsichord\The wavs\A0.wav",)).start()
基本上每当我想玩新的wav时,我都必须启动一个运行playNote函数中代码的新进程.正如我已经说过的那样,我可以同时进行多达100次这样的比赛.可以这么说,所有一次运行的python解释器的一百份副本几乎撞坏了我的计算机.我也尝试过类似的多线程方法,但遇到了同样的问题.
这篇文章展示了一种方法将多个wav文件混合在一起,以便它们可以同时播放,但由于我的程序不一定同时启动声音,我不确定这是否有效.我需要一种有效的方法来同时播放多个音符.无论是以另一个图书馆的形式出现,还是以其他语言形式出现,我都不在乎.
我按照JF Sebastian的建议检查了pygame。最终正是我所需要的。我将pygame.mixer.Sound()与pygame.mixer.set_num_channels()结合使用。这是我想出的。
import pygame as pg import time pg.mixer.init() pg.init() a1Note = pg.mixer.Sound("F:\Project Harpsichord\The wavs\A1.wav") a2Note = pg.mixer.Sound("F:\Project Harpsichord\The wavs\A0.wav") pg.mixer.set_num_channels(50) for i in range(25): a1Note.play() time.sleep(0.3) a2Note.play() time.sleep(0.3)