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:

sh
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:

ts
import { initBiquadNode } from "@maruaudio/dsp/filters/biquad"

Explore the nodes to see its API, available implementations and performance summaries.