звуковой модуль pygame для синтеза в реальном времени - PullRequest
1 голос
/ 16 февраля 2020

Существует модуль python sounddevice, который способен синтезировать кадры и блоки аудиосигнала в реальном времени по требованию в зависимости от времени текущего кадра. Пример использования rtd : https://python-sounddevice.readthedocs.io/en/0.3.14/examples.html#play -a-sine-signal

Но я хотел портировать эту функциональность, используя исключительно функциональность из pygame (возможно, с использованием pygame.mixer.Sound). Однако, глядя на документацию, кажется, что Sound модуль хочет использовать python buffers . У меня очень мало опыта с этим и нулевая идея, как начать. Лучшее, что я мог бы придумать, это:

#!/usr/bin/env python3

import pygame as pg
import numpy as np

s_time = 0
def synth(frames = 1024):
    print("Buffer read")
    global s_time
    def frame(i):
        # there are some magic numbers, sorry about that
        return 0.2 * 32767 * np.sin(2.0 * np.pi * 440 * i / 48000)
    arr = np.array([frame(x) for x in range(s_time, s_time + frames)]).astype(np.int16)
    print(arr)
    print(len(arr))
    s_time = s_time + frames
    return arr

running = True

pg.init()
pg.display.set_mode([320, 200])

pg.mixer.init(48000, -16, 1, 1024)
snd = pg.mixer.Sound(buffer=synth())
snd.play(-1)

while running:
    events = pg.event.get()
    for event in events:
        if event.type == pg.KEYDOWN:
            if event.key == pg.K_q:
                print("Key pressed")
            if event.key == pg.K_ESCAPE:
                print("Quitting")
                running = False
        if event.type == pg.KEYUP:
            if event.key == pg.K_q:
                print("Key depressed")

Но это просто зацикливает первые 1024 кадра, а не генерирует их в реальном времени.

Существует ли чистый пигментный способ сделать синтез звука в реальном времени, или я должен смириться с использованием souddevice библиотеки?

...