Build & publish a DSP node
A node is a focused piece of TypeScript DSP with a manifest a validator can check and a plugin can import. Publishing your own nodes under your handle opens with the node publication contract; until then, every node listed here is Maru’s own, and this page describes the contract a community node will meet.
A node is a leaf
The same shape as every leaf of Maru’s DSP library: free functions over a typed-array state record, with init, one set… per parameter, tick and reset. Block processors follow the Processor contract. A composite node does several jobs in one pass for performance; its sub-paths are its files, not separate nodes. Read DSP fundamentals and the DSP library reference for state, units, controls and the processing contract.
The manifest
A maru.dsp block in the node’s package.json states what the page shows and what a host needs:
- Slug and category
- The node’s name is its category and leaf joined with a hyphen, such as filters-biquad.
- Parameters
- Each setter with its label, type, range, default and units.
- Ports and channels
- Audio, parameter, MIDI and data inputs and outputs, with mono or stereo channels.
- Rate policy
- Whether the node runs at the host’s sample rate or a fixed one.
- Dependencies
- The other nodes it imports, as @owner/slug references, so its page lists them and they list it back.
- License and provenance
- The license, and a notice for every algorithm or source it is derived from.
- Example
- An optional demo the site renders with the real engine for before and after audio.
Check it
The validator runs every check a listing needs and prints the evidence it will attach to the release:
maru dsp check- the manifest schema
- typed numbers: declared storage types, so the compiler lowers state to small native functions
- the realtime claim: the callback allocates nothing, locks nothing and performs no I/O
- a build and a parity check for every target lane
- the public export of the package
Each lane that builds becomes a target on the node’s page; a lane that fails is shown as not lowered, with the diagnostic. Then publish it like any other Maru project.
Import it
A plugin imports a node by its package path, and the toolchain compiles it into the plugin’s Program. Every node page shows its own import line; Maru’s nodes import from @maruaudio/dsp/<category>/<leaf>, as the biquad filter does:
import { initBiquadNode } from "@maruaudio/dsp/filters/biquad"Explore the nodes to see its API, available implementations and performance summaries.