Stworzyłem prosty tekstowy układ escape gry w Pythonie, z zamiarem osadzenia łatki Pure Data (via libPd) w celu odtworzenia innego pliku dźwiękowego (to zostanie później zastąpiony algorytmem dla muzyki generatywnej) dla każdego z moich różnych pokoi.Implementacja libPD (wrapper Pure Data) w Pythonie
Kod Pythona, z którym obecnie pracuję, został zaczerpnięty z jednego z przykładów w github libPD. To jest następująca -
import pyaudio
import wave
import sys
from pylibpd import *
p = pyaudio.PyAudio()
ch = 2
sr = 48000
tpb = 16
bs = 64
stream = p.open(format = pyaudio.paInt16,
channels = ch,
rate = sr,
input = True,
output = True,
frames_per_buffer = bs * tpb)
m = PdManager(ch, ch, sr, 1)
libpd_open_patch('wavfile.pd')
while 1:
data = stream.read(bs)
outp = m.process(data)
stream.write(outp)
stream.close()
p.terminate()
libpd_release()
Czysty łata dane po prostu odtwarza pre-renderowane wav, jednak Wynikiem brzmi prawie tak, jakby została bitcrushed. Zgaduję, że problem polega na rozmiarze bloku, ale nie jestem pewien.
Jeśli ktoś ma doświadczenie w osadzaniu lidPD w Pythonie, byłbym bardzo doceniony, ponieważ jestem pewien, że to, co próbuję osiągnąć, jest żenująco proste.
Dzięki z góry, Cap
Dzięki za odpowiedź Adama. Miałem wrażenie, że ustawiłem rozmiar bloku na 64 i ustawiając liczbę znaczników na bufor na 16, dałoby to 1024 ramki na bufor. Pierwotnie miałem ustawienie tpb na 1, ale "zgniatanie bitów" było nadal obecne. – CapricornOne
Próbowałem również zarówno plików 44.1k i 48k podczas zmiany próbkowania w ramach kodu bez skutku. Myślę, że ma to coś wspólnego z paInt16, ponieważ zmiana go na paInt32 lub paInt8 zmienia w pewnym stopniu zgnieciony efekt, ale jak już powiedziałem, po prostu wyciągnąłem to z kodu przykładowego i nie wiem, co dokładnie powinien robić. – CapricornOne
Próbowałem także innej trasy w postaci łaty puredata, która po prostu pomijała dźwięk sinusoidalny po wywołaniu w pythonie. Ten sam problem występuje. – CapricornOne