- Guides
Custom DSP (Faust)
Voro ships a power-user authoring path: write a Faust .dsp, run one command, and get a self-contained Voro DSP operator that loads in TouchDesigner alongside the built-in operators. The SDK lives in the package’s voro_dsp_sdk/ folder, and the operators you build land in OP Create → VOP family → Custom group.
Preview And Unstable
Section titled “Preview And Unstable”This authoring path is preview and unstable. The plugin you build today may not load in a future Voro engine, and the usage and licensing terms are still being finalized. Treat it as something to experiment with, not a stable platform to ship against yet. The full caveat is in voro_dsp_sdk/README.md.
What This Is
Section titled “What This Is”This is ahead-of-time (AOT) compilation, not a live, in-TouchDesigner JIT. You compile a .dsp to a DLL on the command line once, then drop it into the package. There is no runtime code compilation inside the engine.
The result is a real Voro operator: it cooks off the frame clock, exposes a parameter page built from your Faust controls, and wires into a patch like any other audio operator.
Prerequisites
Section titled “Prerequisites”- Faust 2.85.5 or newer (default install at
C:\Program Files\Faust). - Visual Studio 2022 Build Tools with the MSVC x64 compiler.
- Windows for this Faust build toolchain. The Voro engine itself also runs on macOS (Apple Silicon); the custom-DSP build flow here is documented for Windows.
What’s In The SDK
Section titled “What’s In The SDK”Inside voro_dsp_sdk/:
examples/— reference DSPs: a sine synth, a mono drive, a quad generator, and a stereo low-pass filter.tools/faust2voro.ps1(and a.shvariant) — the one-command build.validator/— a standalone loader that runs your plugin’s audio processing with no TouchDesigner and no engine, to confirm it built correctly.sdk/— the architecture file and headers your plugin compiles against.README.md— the authoritative reference, including the lower-level details this page intentionally skips.
The Workflow
Section titled “The Workflow”1. Write a Faust .dsp
Section titled “1. Write a Faust .dsp”Operator identity comes from Faust declare metadata; parameters come from your control labels.
declare name "my_fx_v1";declare author "you";declare version "0.1.0";import("stdfaust.lib");
cutoff = hslider("Cutoff [unit:Hz]", 800, 40, 18000, 1) : si.smoo;process = fi.resonlp(cutoff, 1.0, 1.0), fi.resonlp(cutoff, 1.0, 1.0);declare namebecomes the operator’s canonical id (sanitized).- Each
hslider/vsliderleaf label becomes a Voro parameter name. - The
processarity sets the input and output channel counts (the example above is stereo in, stereo out).
2. Build it
Section titled “2. Build it”.\tools\faust2voro.ps1 -Dsp .\examples\voro_stereo_lpf.dspThis produces out\<name>.dll plus an out\<name>.voroplugin.json manifest (name, version, author, license, source hash, and the preview-unstable flag).
3. (Optional) Validate without TouchDesigner
Section titled “3. (Optional) Validate without TouchDesigner”cl /nologo /O2 /EHsc validator\voro_validator.cpp /Isdk\include /Fe:voro_validator.exe.\voro_validator.exe out\<name>.dllAn exit code of 0 means the plugin loaded and its audio processing passed the structural checks — a fast way to confirm a build before bringing it into TouchDesigner.
4. Install it into Voro
Section titled “4. Install it into Voro”- Copy
<name>.dllinto the package’splugins/custom/folder. - In TouchDesigner, run the package’s Refresh to rescan custom plugins.
- Your operator appears in OP Create → VOP family → Custom group.
Place it and wire it like any other operator. Its parameter page is built from your Faust controls.
Note: TouchDesigner keeps a loaded plugin DLL locked. Build to a fresh name or close TouchDesigner before replacing a DLL that is already in use.
Licensing Note
Section titled “Licensing Note”Faust architecture files carry a GPL-with-linking-exception, so the plugin you generate is yours to license. Each .voroplugin.json records the license fields. See voro_dsp_sdk/README.md for the details, and watch that file for the finalized preview terms.
Where To Go Next
Section titled “Where To Go Next”- Overview — the operator groups and how a patch flows.
- Audio FX Chain — how an audio effect sits in a signal path, which is exactly where most authored effects land.