Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/jenkins/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在pygame中连续播放声音样本?_Python_Pygame - Fatal编程技术网

Python 如何在pygame中连续播放声音样本?

Python 如何在pygame中连续播放声音样本?,python,pygame,Python,Pygame,我想播放一个连续的正弦波(暂时),它根据鼠标指针的位置(暂时)改变频率(暂时)。因此,我生成并播放一帧长的波形(下面代码中为1/2)。由此产生的声音在声音中有很小的间隙,足以引起注意。增加单个声音的持续时间没有帮助,更改缓冲区大小没有帮助,使用dtick代替dt没有帮助 有没有办法通过这种方式获得连续的声音?还是其他方式 多谢各位 版本:Python 3.9.3、pygame 2.0.1 最小(仍然很长)代码: 您可以在播放时直接修改声音数据,无需在每一帧调用.play() def gen_so

我想播放一个连续的正弦波(暂时),它根据鼠标指针的位置(暂时)改变频率(暂时)。因此,我生成并播放一帧长的波形(下面代码中为1/2)。由此产生的声音在声音中有很小的间隙,足以引起注意。增加单个声音的持续时间没有帮助,更改缓冲区大小没有帮助,使用dtick代替dt没有帮助

有没有办法通过这种方式获得连续的声音?还是其他方式

多谢各位

版本:Python 3.9.3、pygame 2.0.1

最小(仍然很长)代码:


您可以在播放时直接修改
声音
数据,无需在每一帧调用
.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)