Skip to content

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

FeaturePure DataMax/MSPFaust
ProgrammingVisual patchVisual patchText code
CostFree$399Free
Real-timeGoodExcellentExcellent
Plugin DevLimitedLimitedExcellent
Web DeployLimitedLimitedExcellent

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:

  1. Initializes the Faust DSP engine
  2. Configures I2S audio input/output
  3. Continuously copies audio data in the main loop

Learning Path

  1. Learn functional programming fundamentals
  2. Master Faust basic syntax
  3. Understand digital signal processing principles
  4. Explore the Faust standard library (fi., si., os., etc.)
  5. Learn different compilation targets (VST, Web Audio, embedded)
  6. Master advanced programming techniques