Skip to content

音频编程与 Faust

音频编程语言对比

Pure Data (PD)

  • 开发者:Miller Puckette(1996年)
  • 许可证:开源(BSD)
  • 编程范式:数据流可视化编程
  • 优势:免费、跨平台、社区活跃、教育友好
  • 劣势:界面简陋、复杂 patch 可能不稳定

Max/MSP

  • 开发者:Cycling '74(1990年)
  • 许可证:商业软件($399)
  • 编程范式:数据流可视化编程
  • 优势:专业级、界面精美、Ableton Live 集成
  • 劣势:价格昂贵、仅 Windows/macOS

Faust

  • 开发者:GRAME,法国(2004年)
  • 许可证:开源(GPL)
  • 编程范式:函数式编程
  • 优势:代码简洁、高性能、多平台部署、版本控制友好
  • 劣势:学习曲线陡峭、社区较小

对比总结

特性Pure DataMax/MSPFaust
编程方式可视化 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 上实现了基本的音频直通处理:

  1. 初始化 Faust DSP 引擎
  2. 配置 I2S 音频输入输出
  3. 在主循环中持续复制音频数据

学习路线

  1. 学习函数式编程基础概念
  2. 掌握 Faust 基本语法规则
  3. 理解数字信号处理原理
  4. 熟悉 Faust 标准库(fi., si., os. 等)
  5. 学习不同编译目标(VST、Web Audio、嵌入式)
  6. 掌握高级编程技巧