Python 如何在pygame中连续播放声音样本?
我想播放一个连续的正弦波(暂时),它根据鼠标指针的位置(暂时)改变频率(暂时)。因此,我生成并播放一帧长的波形(下面代码中为1/2)。由此产生的声音在声音中有很小的间隙,足以引起注意。增加单个声音的持续时间没有帮助,更改缓冲区大小没有帮助,使用dtick代替dt没有帮助 有没有办法通过这种方式获得连续的声音?还是其他方式 多谢各位 版本:Python 3.9.3、pygame 2.0.1 最小(仍然很长)代码:Python 如何在pygame中连续播放声音样本?,python,pygame,Python,Pygame,我想播放一个连续的正弦波(暂时),它根据鼠标指针的位置(暂时)改变频率(暂时)。因此,我生成并播放一帧长的波形(下面代码中为1/2)。由此产生的声音在声音中有很小的间隙,足以引起注意。增加单个声音的持续时间没有帮助,更改缓冲区大小没有帮助,使用dtick代替dt没有帮助 有没有办法通过这种方式获得连续的声音?还是其他方式 多谢各位 版本:Python 3.9.3、pygame 2.0.1 最小(仍然很长)代码: 您可以在播放时直接修改声音数据,无需在每一帧调用.play() def gen_so
您可以在播放时直接修改
声音
数据,无需在每一帧调用.play()
def gen_sound(buf, freq):
buf[:, 0] = (
0.25
* max_sample
* np.sin(2 * np.pi * freq[0] * np.arange(n_samples) / sample_rate)
)
buf[:, 1] = (
0.25
* max_sample
* np.sin(2 * np.pi * freq[1] * np.arange(n_samples) / sample_rate)
)
总的来说:
def main(argv: list = None):
# ...
clock = pygame.time.Clock()
buf = np.zeros((n_samples, 2), dtype=np.int16)
sound = pygame.sndarray.make_sound(buf)
buf = pygame.sndarray.samples(sound) # This is required because make_sound copies the array, but we want a reference
gen_sound(buf, (440, 440))
sound.play(loops=-1, fade_ms=0)
# ...
# event loop
while True:
# ...
freq = mpos if mpos else (440, 440)
gen_sound(buf, freq)
pygame.display.update()
dtick = clock.tick(FPS)
请注意,这将遇到描述和解决的问题,例如,正弦波转换不平滑。但就我所知,这超出了这个问题的范围。您可能希望对生成的波形使用缓存,以便在频率和持续时间没有更改的情况下不重新构建波形。此外,如果声音在后台播放,您希望在声音停止时更新它(除非播放器中内置了声音队列,这很可能是。),而不是程序的每个循环。这就是我一直在寻找的技巧。我怀疑这是可能的,但不知道如何动态写入同一个缓冲区。是的,相位不匹配是另一个话题,谢谢链接。但在某些频率下,我会得到一种以前无法获得的连续声音。
def main(argv: list = None):
# ...
clock = pygame.time.Clock()
buf = np.zeros((n_samples, 2), dtype=np.int16)
sound = pygame.sndarray.make_sound(buf)
buf = pygame.sndarray.samples(sound) # This is required because make_sound copies the array, but we want a reference
gen_sound(buf, (440, 440))
sound.play(loops=-1, fade_ms=0)
# ...
# event loop
while True:
# ...
freq = mpos if mpos else (440, 440)
gen_sound(buf, freq)
pygame.display.update()
dtick = clock.tick(FPS)