首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Python语言实现libPD (纯数据包装器)

用Python语言实现libPD (纯数据包装器)
EN

Stack Overflow用户
提问于 2013-07-04 00:56:51
回答 3查看 1.9K关注 0票数 7

我用Python语言创建了一个简单的基于文本的房间游戏,目的是嵌入一个纯数据补丁(通过libPd),以便为我的每个不同的房间播放不同的声音文件(稍后将用生成音乐的算法替换)。

我目前使用的python代码取自libPD github中的一个示例。详情如下:

代码语言:javascript
复制
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文件,然而结果输出听起来就像它已经被位压碎了一样。我猜问题是与块大小有关,但不确定。

如果有人有在Python中嵌入lidPD的经验,我将非常感激,因为我确信我要实现的东西非常简单。

先谢谢你,上尉

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-07-12 23:07:11

我最终使用了一个变通方法,并导入了pygame (而不是pyaudio)来处理音频并初始化补丁。它可以毫无故障地工作。

谢谢你的帮助。

*对于任何遇到类似问题的人,请查看python的libPd github中的"pygame_test.py“。

票数 3
EN

Stack Overflow用户

发布于 2013-07-12 12:53:20

这里有几个部分。

  1. 音频文件的块大小是错误的,因为您将tpb设置为16而不是1。通过将其设置为16,您将块大小设置为16 * 64而不是64。
  2. 采样率可能有问题。您确定声音文件是48000 is而不是44100 is吗?
票数 0
EN

Stack Overflow用户

发布于 2021-08-12 21:54:23

我对上面的示例进行了一些重构:

代码语言:javascript
复制
import pyaudio
from pylibpd import *

class PdAudio:
    def __init__(self):
        self.sample_rate = 44100
        self.num_channel = 2
        self.pd = self.__InitPd(self.num_channel, self.sample_rate)
        self.py_audio = pyaudio.PyAudio()
        self.block_size = libpd_blocksize()
        self.stream = self.__InitAudio(self.num_channel, self.sample_rate,self.block_size)
        self.inbuf = array.array('h', range(self.block_size))
        print("Blocksize: %d" % self.block_size)

    def StartPatchInBackground(self, filename):
        self.patch = libpd_open_patch(filename, '.')

    def IsPlaying(self):
        return self.stream.is_active()

    def __InitAudio(self, num_channels, sample_rate, block_size):
        return self.py_audio.open(format = pyaudio.paInt16,
                                  channels = num_channels,
                                  rate = sample_rate,
                                  input = False,
                                  output = True,
                                  frames_per_buffer = block_size,
                                  stream_callback=self.__AudioCallback)

    def __InitPd(self, num_channels, sample_rate):
        return PdManager(1, num_channels, sample_rate, 1)

    def __AudioCallback(self, in_data,frame_count,time_info,status):
        outp = self.pd.process(self.inbuf)
        return (outp.tobytes(),pyaudio.paContinue)

    def __del__(self):
        self.stream.close()
        self.pd.terminate()
        libpd_release()

pd_audio = PdAudio()
pd_audio.StartPatchInBackground('bloopy.pd')

https://github.com/jkammerl/pylibpd_pyaudio/blob/main/pd_callback_example.py

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17453913

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档