2013-07-03 4 views
6

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

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

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, однако в результате выхода звучит почти как если бы он был bitcrushed. Я предполагаю, что проблема связана с размером блока, но я не уверен.

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

Спасибо заранее, Cap

ответ

3

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

Благодарим за помощь.

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

0

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

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

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

+0

Спасибо за ответ Адам. У меня создалось впечатление, что я установил размер блока 64 и установив отметки на один буфер на 16, он даст мне 1024 кадра на буфер. Первоначально у меня была настройка tpb 1, но «бит дробилки» все еще присутствовал. – CapricornOne

+0

Я также пробовал как файлы 44.1k, так и 48k при изменении выборки в коде безрезультатно. Я думаю, что это имеет какое-то отношение к paInt16, так как изменение его на paInt32 или paInt8 в какой-то степени изменяет измельченный эффект, но, как я уже сказал, я просто вытащил это из примера кода и не уверен, что он должен делать точно. – CapricornOne

+0

Я также пробовал другой маршрут в виде патча puredata, который просто пропускал синус-тон при вызове в python. Такая же проблема возникает. – CapricornOne

2

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

Вот питон, чтобы играть синусоида.

 

    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; 

+0

приятно. Это должен быть пример по умолчанию, поставляемый с pylibpd – Flint

 Смежные вопросы

  • Нет связанных вопросов^_^