音频编程与 Faust
音频编程语言对比
Pure Data (PD)
- 开发者:Miller Puckette(1996年)
- 许可证:开源(BSD)
- 编程范式:数据流可视化编程
- 优势:免费、跨平台、社区活跃、教育友好
- 劣势:界面简陋、复杂 patch 可能不稳定
Max/MSP
- 开发者:Cycling '74(1990年)
- 许可证:商业软件($399)
- 编程范式:数据流可视化编程
- 优势:专业级、界面精美、Ableton Live 集成
- 劣势:价格昂贵、仅 Windows/macOS
Faust
- 开发者:GRAME,法国(2004年)
- 许可证:开源(GPL)
- 编程范式:函数式编程
- 优势:代码简洁、高性能、多平台部署、版本控制友好
- 劣势:学习曲线陡峭、社区较小
对比总结
| 特性 | Pure Data | Max/MSP | Faust |
|---|---|---|---|
| 编程方式 | 可视化 patch | 可视化 patch | 文本代码 |
| 费用 | 免费 | $399 | 免费 |
| 实时性能 | 良好 | 优秀 | 优秀 |
| 插件开发 | 有限 | 有限 | 优秀 |
| Web 部署 | 有限 | 有限 | 优秀 |
Faust 代码示例
低通滤波器
dsp
import("stdfaust.lib");
// 简单的低通滤波器
// 参数:
// - freq: 截止频率 (20Hz - 20000Hz)
// - q: 品质因数 (0.1 - 30)
freq = hslider("Cutoff Frequency", 1000, 20, 20000, 1) : si.smoo;
q = hslider("Q Factor", 1, 0.1, 30, 0.1) : si.smoo;
// 使用二阶低通滤波器
lowpass_filter = fi.lowpass(2, freq);
// 另一种选择:使用共振低通滤波器
// lowpass_resonant = fi.resonlp(freq, q, 1);
// 主处理函数
process = lowpass_filter;
// 如果需要立体声处理,可以使用:
// process = lowpass_filter, lowpass_filter;这个 Faust 程序实现了一个二阶低通滤波器,参数包括:
- 截止频率(Cutoff Frequency):20Hz - 20000Hz,默认 1000Hz
- 品质因数(Q Factor):0.1 - 30,默认 1
ESP32 基础音频直通
ino
/**
* @file streams-i2s-faust_guitarix-i2s.ino
* @author Phil Schatzmann
* @brief Example how to use Faust when Faust expects input and provides kitput
* @version 0.1
* @date 2022-04-22
*
* @copyright Copyright (c) 2022
*
*/
#include "AudioTools.h"
#include "AudioTools/AudioLibs/AudioBoardStream.h"
#include "AudioTools/AudioLibs/AudioFaust.h"
#include "low-pass-faust.h"
AudioBoardStream kit(AudioKitEs8388V1);
FaustStream<mydsp> faust(kit); // final output of Faust is kit
StreamCopy copier(faust, kit); // copy data from kit to faust
// Arduino Setup
void setup(void) {
// Open Serial
Serial.begin(115200);
AudioToolsLogger.begin(Serial, AudioToolsLogLevel::Warning);
// Setup Faust
auto cfg = faust.defaultConfig();
faust.begin(cfg);
// start I2S
auto cfg_i2s = kit.defaultConfig(RXTX_MODE);
cfg_i2s.sample_rate = cfg.sample_rate;
cfg_i2s.channels = cfg.channels;
cfg_i2s.bits_per_sample = cfg.bits_per_sample;
cfg_i2s.input_device = ADC_INPUT_LINE2;
kit.begin(cfg_i2s);
}
// Arduino loop - copy sound to kit
void loop() {
copier.copy();
}这个 Arduino 程序在 ESP32 AudioKit 上实现了基本的音频直通处理:
- 初始化 Faust DSP 引擎
- 配置 I2S 音频输入输出
- 在主循环中持续复制音频数据
学习路线
- 学习函数式编程基础概念
- 掌握 Faust 基本语法规则
- 理解数字信号处理原理
- 熟悉 Faust 标准库(
fi.,si.,os.等) - 学习不同编译目标(VST、Web Audio、嵌入式)
- 掌握高级编程技巧