gpt4 book ai didi

python - 使用 PyAudio 和 TK 在按键上演奏音符

转载 作者:太空宇宙 更新时间:2023-11-03 15:51:49 24 4
gpt4 key购买 nike

我希望使用 python 在按键上演奏音符。我目前正在实现和修改发现的代码here 。但是,我面临的问题是,按住按键时会重复调用 keydown 函数,导致每次调用 keydown 函数时都会出现音频切入和切出的情况。

我正在寻找一种方法来保持演奏和弦的能力,但通过在同一键上调用 keyup 之前不调用同一键上的 keydown 来消除这种进出剪切。我一直在编写的代码的具体部分如下所示。

提前致谢。

p = pyaudio.PyAudio()
chord = Chord()
gen = NoteGen()

def callback(in_data, frame_count, time_info, status):
wave = chord(frame_count)
data = wave.astype(numpy.float32).tostring()
return (data, pyaudio.paContinue)

stream = p.open(
format=pyaudio.paFloat32,
channels=1,
rate=44100,
output=True,
stream_callback=callback
)

stream.start_stream()


def keydown(event):
k = gen(event.char)
print("add note: " + event.char)
chord.add_note(k)
print [(n.name, n.frequency) for n in chord.notes]


def keyup(event):
k = gen(event.char)
print("remove note: " + event.char)
chord.remove_note(k)
print [n.name for n in chord.notes]


root = Tk()
frame = Frame(root, width=100, height=100)
frame.bind_all("<KeyPress>", keydown)
frame.bind_all("<KeyRelease>", keyup)
frame.pack()
root.mainloop()

stream.stop_stream()
stream.close()
p.terminate()

最佳答案

有一个字典,其中包含作为键的键代码和作为值的该键的状态(例如 bool 值)。

因此,当调用 key down 时,检查按键代码是否在字典中,如果不在,只需添加值 1。然后开始播放音符。如果存在,请检查该键的状态,如果按下则忽略该事件。否则去演奏音符。按下键时将键的状态设置为 0。

而且,不要使用回调来播放音频,中断这样的播放音符会给你带来噩梦。

最好将线程内的注释写入流。

分块写入数据并检查停止标志。

当调用 key up 时,设置标志并执行以下操作:

stream.stop_stream(); stream.start_stream()

准确地切断声音。

将写入部分放入 try-except block 中,这样当您从线程外部强制流停止时,不会发生任何不良情况。

如果您希望有更好的方法来使用 pyaudio 来完成此类事情,这将允许您一次播放多个声音,请在 PyPI 中搜索 SWmixer 模块。你还需要 numpy.然后,您使用 SWMixer 将每个声音加载到其自己的对象中,并根据需要启动和停止它。它的用法与 pygame.mixer 模块非常相似。

顺便说一句,如果您尝试并行使用多个 PyAudio 流,我不确定这将如何工作。

我的意思是,我知道您可以并行使用一个输出和一个输入流,不会产生太大麻烦,但超过 2 个输出流可能会造成一些麻烦。这就是我提到 SWMixer 的原因。我从未尝试过使用多个,所以我可能是错的。

但我确实尝试使用 PyAudio 本身的多个实例。它的工作原理是减少先前调用的音量。这样我的情况也会发生在流中。因此,您会听到最后一个音符比之前开始的音符更大,或者您可能会听到有趣的声音。

关于python - 使用 PyAudio 和 TK 在按键上演奏音符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41212000/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com