2013-07-03 24 views
6

Tôi đã tạo ra một trò chơi phòng đơn giản bằng Python, với ý định nhúng một bản vá Tinh khiết (qua libPd) để phát lại một tệp âm thanh khác. sau đó sẽ được thay thế bằng thuật toán cho nhạc sinh sản) cho mỗi phòng khác nhau của tôi.Thực hiện libPD (Trình bao bọc dữ liệu thuần túy) trong Python

Mã python mà tôi hiện đang làm việc được lấy từ một trong các ví dụ trong github libPD. Đó là như sau -

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

Bản vá dữ liệu thuần túy chỉ phát lại tệp wav được hiển thị trước, tuy nhiên kết quả xuất phát gần giống như đã bị bit. Tôi đoán vấn đề là làm với kích thước khối nhưng không chắc chắn.

Nếu có ai có kinh nghiệm nhúng nắpPD trong Python, tôi sẽ được đánh giá rất cao vì tôi chắc chắn những gì tôi đang cố gắng đạt được thật đơn giản.

Cảm ơn bạn trước, Cap

Trả lời

3

Tôi đã kết thúc bằng cách sử dụng workaround workaround và nhập khẩu (trái ngược với pyaudio) để xử lý âm thanh và khởi tạo bản vá. Nó hoạt động mà không có một xô.

Cảm ơn sự giúp đỡ của bạn.

* Đối với bất kỳ ai gặp phải sự cố tương tự, hãy xem "pygame_test.py" trong libPd github cho python.

0

Có một vài phần trong phần này.

  1. Kích thước khối của tập tin âm thanh là sai bởi vì bạn thiết lập TPB = 16 thay vì 1. Bằng cách đặt nó đến 16 bạn đang làm cho kích thước khối 16 * 64 thay vì 64.

  2. Có có thể là một vấn đề với tỷ lệ mẫu. Bạn có chắc chắn rằng tập tin âm thanh của bạn là 48000Hz và không 44100Hz?

+0

Cảm ơn bạn đã trả lời Adam. Tôi đã được ấn tượng rằng tôi muốn thiết lập kích thước khối đến 64 và bằng cách thiết lập các bọ ve trên mỗi bộ đệm đến 16 nó sẽ cho tôi 1024 khung hình cho mỗi bộ đệm. Ban đầu tôi đã có một thiết lập tpb 1 nhưng sự "nghiền bit" vẫn còn hiện diện. – CapricornOne

+0

Tôi cũng đã thử cả hai tệp 44.1k và 48k trong khi thay đổi mẫu trong mã không có sẵn. Tôi nghĩ rằng nó có liên quan đến paInt16 khi thay đổi nó thành paInt32 hoặc paInt8 thay đổi hiệu ứng nghiền nát ở một mức độ nào đó, nhưng như tôi đã nói, tôi chỉ đơn giản lấy nó từ mã ví dụ và không chắc nó nên làm gì. – CapricornOne

+0

Tôi cũng đã thử một con đường khác trong hình thức của một miếng vá puredata mà chỉ đơn giản là bỏ qua một giai điệu sin khi được gọi trong python. Cùng một vấn đề xảy ra. – CapricornOne

2

Tôi gặp sự cố tương tự. Sử dụng gọi lại đã sửa nó cho tôi.

Đây là con trăn để phát sóng sin.

 

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

và vá "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

đẹp. Đây sẽ là ví dụ mặc định được phân phối với pylibpd – Flint

Các vấn đề liên quan