libpd API完全手册核心函数与参数详解【免费下载链接】libpdPure Data embeddable audio synthesis library项目地址: https://gitcode.com/gh_mirrors/li/libpdlibpd是一款强大的嵌入式音频合成库基于Pure Data开发能够帮助开发者轻松实现音频合成、MIDI处理等功能。本手册将详细介绍libpd的核心API函数、参数说明及使用方法让你快速掌握这个音频处理利器。一、初始化与基础设置1.1 PdBase类初始化PdBase是libpd的核心类所有功能都通过它实现。初始化时需要指定输入输出声道数、采样率等关键参数pd::PdBase pd; bool success pd.init(2, 2, 44100); // 2输入2输出44100采样率参数说明numInChannels输入声道数0-8numOutChannels输出声道数0-8sampleRate采样率通常44100或48000queued是否启用消息队列默认false 小贴士若出现音频卡顿可尝试增加ticks参数如pd.init(2,2,44100,4)提高缓冲区大小1.2 添加搜索路径加载外部音频文件或抽象补丁时需要设置搜索路径pd.addToSearchPath(/path/to/patches); pd.addToSearchPath(/path/to/samples);相关函数addToSearchPath(const std::string path)添加搜索路径clearSearchPath()清除所有搜索路径二、补丁加载与管理2.1 打开补丁文件使用openPatch函数加载Pd补丁文件pd::Patch patch pd.openPatch(synth.pd, /path/to/patches); if (!patch.isValid()) { std::cerr 无法加载补丁文件! std::endl; }参数说明patch补丁文件名带.pd扩展名path补丁文件所在目录2.2 关闭补丁pd.closePatch(patch); // 通过补丁对象关闭 // 或通过补丁名关闭 pd.closePatch(synth);三、音频处理3.1 启动/停止音频处理pd.computeAudio(true); // 启动音频处理 pd.computeAudio(false); // 停止音频处理3.2 音频缓冲区处理根据数据类型不同提供多种处理函数// 处理float类型缓冲区 bool processFloat(int ticks, const float *inBuffer, float *outBuffer); // 处理short类型缓冲区 bool processShort(int ticks, const short *inBuffer, short *outBuffer); // 处理double类型缓冲区 bool processDouble(int ticks, const double *inBuffer, double *outBuffer);参数说明ticks处理的PD块数量每个块64样本inBuffer输入音频缓冲区outBuffer输出音频缓冲区四、消息发送与接收4.1 基本消息发送支持多种消息类型发送// 发送bang消息 pd.sendBang(trigger); // 发送float值 pd.sendFloat(volume, 0.75f); // 发送symbol pd.sendSymbol(preset, piano);4.2 复合消息发送通过流接口构建复杂消息pd pd::StartMessage() note 60 100 pd::FinishMessage(midi, noteon);4.3 消息接收设置消息接收器class MyReceiver : public pd::PdReceiver { void receiveBang(const std::string source) override { std::cout 收到bang: source std::endl; } void receiveFloat(const std::string source, float value) override { std::cout 收到float: source value std::endl; } }; MyReceiver receiver; pd.setReceiver(receiver);五、MIDI处理5.1 发送MIDI消息libpd支持完整的MIDI消息发送// 发送Note On pd.sendNoteOn(0, 60, 100); // 通道0音高60力度100 // 发送控制变化 pd.sendControlChange(0, 10, 127); // 通道0控制器10值127 // 发送程序变化 pd.sendProgramChange(0, 5); // 通道0程序55.2 MIDI接收设置MIDI接收器class MyMidiReceiver : public pd::PdMidiReceiver { void receiveNoteOn(int channel, int pitch, int velocity) override { std::cout MIDI Note On: channel , pitch , velocity std::endl; } }; MyMidiReceiver midiReceiver; pd.setMidiReceiver(midiReceiver);六、数组操作6.1 读取数组std::vectorfloat buffer; pd.readArray(waveform, buffer); // 读取整个数组 // 读取部分数组 pd.readArray(envelope, buffer, 1024, 512); // 从512偏移读取1024个样本6.2 写入数组std::vectorfloat data(1024); // 填充数据... pd.writeArray(filter_coeffs, data); // 写入整个数组 // 写入部分数组 pd.writeArray(delay_line, data, 512, 256); // 从256偏移写入512个样本七、多实例支持从0.13版本开始libpd支持多实例功能需编译时定义PDINSTANCEpd::PdBase pd1, pd2; pd1.init(2, 2, 44100); pd2.init(2, 2, 44100); pd1.openPatch(synth.pd, /patches); pd2.openPatch(effect.pd, /patches);八、实用工具函数8.1 基本信息查询int blockSize pd::PdBase::blockSize(); // 获取PD块大小固定64 int numInstances pd::PdBase::numInstances(); // 获取实例数量 bool isInited pd.isInited(); // 检查是否初始化8.2 调试与日志pd::PdBase::setVerbose(true); // 启用详细日志 bool verbose pd::PdBase::isVerbose(); // 检查日志状态九、示例代码以下是一个简单的音频合成示例#include PdBase.hpp #include vector int main() { pd::PdBase pd; if (!pd.init(0, 2, 44100)) { std::cerr 初始化失败! std::endl; return 1; } pd.addToSearchPath(./patches); pd::Patch patch pd.openPatch(simple_synth.pd, ./patches); if (!patch.isValid()) { std::cerr 无法加载补丁! std::endl; return 1; } pd.computeAudio(true); // 发送音符 pd.sendNoteOn(0, 60, 100); // 中音C sleep(1); // 播放1秒 pd.sendNoteOn(0, 60, 0); // 停止音符 pd.closePatch(patch); return 0; }通过本手册你已经了解了libpd的核心API功能。更多高级用法和详细说明请参考源代码中的头文件核心API定义cpp/PdBase.hpp类型定义cpp/PdTypes.hpp接收者接口cpp/PdReceiver.hppMIDI接收者接口cpp/PdMidiReceiver.hpp开始你的音频合成之旅吧【免费下载链接】libpdPure Data embeddable audio synthesis library项目地址: https://gitcode.com/gh_mirrors/li/libpd创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考