Audio Programming & Faust
Audio Programming Language Comparison
Pure Data (PD)
- Developer: Miller Puckette (1996)
- License: Open source (BSD)
- Paradigm: Dataflow visual programming
- Strengths: Free, cross-platform, active community, education-friendly
- Weaknesses: Basic UI, complex patches may be unstable
Max/MSP
- Developer: Cycling '74 (1990)
- License: Commercial ($399)
- Paradigm: Dataflow visual programming
- Strengths: Professional-grade, polished UI, Ableton Live integration
- Weaknesses: Expensive, Windows/macOS only
Faust
- Developer: GRAME, France (2004)
- License: Open source (GPL)
- Paradigm: Functional programming
- Strengths: Concise code, high performance, multi-platform deployment, VCS-friendly
- Weaknesses: Steep learning curve, smaller community
Comparison Summary
| Feature | Pure Data | Max/MSP | Faust |
|---|---|---|---|
| Programming | Visual patch | Visual patch | Text code |
| Cost | Free | $399 | Free |
| Real-time | Good | Excellent | Excellent |
| Plugin Dev | Limited | Limited | Excellent |
| Web Deploy | Limited | Limited | Excellent |
Faust Code Examples
Low-Pass Filter
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;This Faust program implements a second-order low-pass filter with parameters:
- Cutoff Frequency: 20Hz - 20000Hz, default 1000Hz
- Q Factor: 0.1 - 30, default 1
ESP32 Basic Audio Passthrough
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();
}This Arduino sketch implements basic audio passthrough on the ESP32 AudioKit:
- Initializes the Faust DSP engine
- Configures I2S audio input/output
- Continuously copies audio data in the main loop
Learning Path
- Learn functional programming fundamentals
- Master Faust basic syntax
- Understand digital signal processing principles
- Explore the Faust standard library (
fi.,si.,os., etc.) - Learn different compilation targets (VST, Web Audio, embedded)
- Master advanced programming techniques