Make effects¶
This section is for anyone, human or coding agent, designing a new sound, adding an effect or changing an existing one. To use the effects as they are, download them instead.
Two ways in:
- No install: the effect designer builds an effect from blocks in your browser and writes the Faust code for you.
- The full toolchain: build from source, then follow How it works and Adding an effect.
The rest of this section is the reference. AGENTS.md in the repository is the short checklist. These pages explain the same rules in more depth. To get a change merged, see CONTRIBUTING.md. To report a vulnerability, see SECURITY.md.
- How it works: what DSP and Faust are, and how one
.dspfile becomes LV2, VST3 and CLAP plugins plus measurements. Start here if you are new to either. - Designing new sounds: the project's aim, the three kinds of effect, and how to write design notes for an original one.
- Designing for feel: the mechanisms behind how an effect responds to the playing, how to build them in Faust and how to measure them.
- Adding an effect: from notes to DSP, tests and docs.
- Shared library: the oversampler, clippers and safety limiter in
pedalkit.lib. - Tests and measurements: the render harness, the Python helpers and what every effect must check.
- Playing feel, CPU and stability: the latency and CPU budgets, smoothing, settings recall, and the checks every effect gets automatically.
- Schematics: how to draw an effect's reference circuit in KiCad, and how it reaches this site.
- Linting and CI: pre-commit hooks, GitHub Actions and how this site is published.
- Releasing: cutting a release and how the release workflow builds portable plugins.
- Agent skill: a Claude Code skill (
pedalkit-effect) that walks an agent through the whole effect workflow, from notes to PR.
Ground rules¶
- Clean-room only. Anything taken from existing hardware or software comes from public schematics, circuit analyses, measurements, reviews and manuals. Never decompile, disassemble or copy a proprietary plugin, binary or firmware, and don't use one as a reference to match against. Original designs invent rather than imitate.
- No trademarks. Plugin names,
declare name, UI labels, URIs and file names must be neutral. A manufacturer's product name may appear in the docs only to identify reference or inspiring hardware, never as branding. Theno-trademarkspre-commit hook enforces this against the deny-list intools/trademarks.txt(see Linting and CI). - British English in all documentation, comments and UI text: colour, behaviour, modelling, analyse, centre.
- Say when you're unsure, and why a value is what it is. Every constant in the DSP is documented, reported, inferred or chosen. The design or circuit notes say which, with a link for anything sourced and the intent behind anything chosen.
- Judge sound by measurement. Describe results in terms of harmonics, frequency response, aliasing and levels, and list the parameters a human should tune by ear.
- Open formats and machine-readable licensing. Every file carries an SPDX header or has an entry in
REUSE.toml. Committed audio is FLAC. Schematics are KiCad.kicad_sch, redrawn from the sources.
Build mechanics¶
faust2lv2andfaust2jaqtbuild in the current directory, so each effect is staged inbuild/<name>/withsrc/lib/*.libcopied next to the.dsp. The bundle ends up inbuild/<name>.lv2.- After
faust2lv2, the Makefile runstools/fix-ttl.pyon the bundle's TTL.faust2lv2writes the licence as a string and cannot expresslv2:minorVersion,lv2:microVersionor a plugin class, solv2lintfails without the fix-up. faust2lv2needs the Boost headers, even for effects without MIDI.- VST3. No Faust script builds VST3, and
faust2jucegoes through JUCE (AGPL or commercial), sotools/vst3/faust-vst3.cppis this repository's own architecture, written against the MIT VST3 SDK. It is a single-component effect with no GUI. Each Faust control becomes a parameter in UI order, and a bargraph tagged[lv2:reportsLatency]becomes the latency report.tools/vst3-meta.pywrites the name, vendor, version, category and class ID from thedeclarelines, andtools/vst3/CMakeLists.txtbuildsbuild/<name>.vst3. The SDK is cloned at a pinned tag (VST3_SDK_TAGin the Makefile) intobuild/vst3sdk. - CLAP.
faust2claphard-codes the plugin ID, implements no latency extension and needs headers that Arch'sfaustpackage does not install, sotools/clap/faust-clap.cppis the repository's own architecture, written against the plain CLAP C API. It mirrors the VST3 one: no GUI, parameters in UI order, latency from the tagged bargraph, parameter events applied at their sample offset.tools/clap-meta.pywrites the metadata, and the compiler linksbuild/<name>.clapdirectly. The headers are cloned at a pinned tag (CLAP_TAG) intobuild/clap. - Identity. The VST3 class ID is
uuid5(NAMESPACE_DNS, "pedalkit.<name>")and the CLAP ID ispedalkit.<name>, matching the LV2 URIurn:pedalkit/<name>. None of them may change for a released effect. Parameter IDs and saved state follow the order of the controls (the[n]prefixes), so append new controls at the end. make describewrites a format-neutral description of each effect.faust -jsongivesbuild/<name>/<name>.dsp.json(every control's label, unit, range and default), andfaust -svggives the block diagram inbuild/<name>/<name>-svg/.- Generated files only ever go in
build/andtests/out/, and are never committed.