Реализация libPD (оболочка Pure Data) в Python

Я создал простую текстовую игру побега из комнаты на Python с намерением встроить патч Pure Data (через libPd) для воспроизведения другого звукового файла (позже он будет заменен алгоритмом для генеративной музыки) для каждая из моих разных комнат.

Код Python, с которым я сейчас работаю, был взят из одного из примеров на github libPD. Это следующим образом -

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()

Патч чистых данных просто воспроизводит предварительно отрендеренный файл wav, однако результирующий вывод звучит почти так, как если бы он был биткраширован. Я предполагаю, что проблема связана с размером блока, но я не уверен.

Если у кого-то есть опыт встраивания lidPD в Python, я был бы очень признателен, поскольку я уверен, что то, чего я пытаюсь достичь, невероятно просто.

Заранее спасибо, кэп


person CapricornOne    schedule 03.07.2013    source источник


Ответы (3)


В итоге я использовал обходной путь и импортировал pygame (в отличие от pyaudio) для обработки звука и инициализации патча. Работает без сбоев.

Спасибо за вашу помощь.

* Для тех, кто сталкивается с подобной проблемой, проверьте «pygame_test.py» в github libPd для python.

person CapricornOne    schedule 12.07.2013

У меня были похожие проблемы. Использование обратного вызова исправило это для меня.

Вот питон для воспроизведения синусоиды.


    import pyaudio
    from pylibpd import *
    import time

    def callback(in_data,frame_count,time_info,status):
        outp = m.process(data)
        return (outp,pyaudio.paContinue)

    p  = pyaudio.PyAudio()
    bs = libpd_blocksize()

    stream = p.open(format = pyaudio.paInt16,
                    channels = 1,
                    rate = 44100,
                    input = False,
                    output = True,
                    frames_per_buffer = bs,
                    stream_callback=callback)

    m = PdManager(1, 1 , 44100, 1)

    libpd_open_patch('sine.pd')

    data=array.array('B',[0]*bs)

    while stream.is_active():
        time.sleep(.1)

    stream.close()
    p.terminate()
    libpd_release()

и патч "sine.pd"


    #N canvas 647 301 450 300 10;
    #X obj 67 211 dac~;
    #X obj 24 126 osc~ 1000;
    #X obj 16 181 *~ 0.2;
    #X connect 1 0 2 0;
    #X connect 2 0 0 0;

person Paul John Leonard    schedule 12.04.2015
comment
красивый. Это должен быть пример по умолчанию, поставляемый с pylibpd. - person Flint; 02.11.2016

Есть несколько частей к этому.

  1. Размер блока аудиофайла неверен, потому что вы установили tpb = 16 вместо 1. Установив его на 16, вы сделаете размер блока 16 * 64 вместо 64.

  2. Может быть проблема с частотой дискретизации. Вы уверены, что ваш звуковой файл имеет частоту 48000 Гц, а не 44100 Гц?

person Adam Tindale    schedule 12.07.2013
comment
Спасибо за ответ Адам. У меня сложилось впечатление, что я установил размер блока на 64, а установив количество тактов на буфер на 16, я получил бы 1024 кадра на буфер. Первоначально у меня была настройка tpb, равная 1, но дробление битов все еще присутствовало. - person CapricornOne; 12.07.2013
comment
Я также пробовал файлы 44.1k и 48k, изменяя частоту дискретизации в коде безрезультатно. Я думаю, что это как-то связано с paInt16, так как изменение его на paInt32 или paInt8 в некоторой степени меняет эффект дробления, но, как я уже сказал, я просто взял это из примера кода и не уверен, что именно он должен делать. - person CapricornOne; 12.07.2013
comment
Я также попробовал другой маршрут в виде патча puredata, который просто пропускал синусоидальный тон при вызове в python. Возникает та же проблема. - person CapricornOne; 12.07.2013