Существует модуль 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
библиотеки?