Nodes
The 67 types a clone ships, grouped the way the palette groups them. Parsed from the node manifests in the goofi repository, so this page cannot drift from them.
A type id names the family a node belongs to and then the node, as signal:Psd or audio:Osc. The family is the engine it runs on, and
it carries a colour the editor paints on the node's header, so a patch says at a glance
which engine each part of it runs on.
Core
The engines' own node sets. They are built into the binary at goofi's build time, so they are in the palette of every clone with nothing to install.
audio 14 nodes rust
The same node interface at audio rate: oscillators, filters, envelopes, gates and feedback.
An echo, one line per channel, at a delay that may move while it sounds.
An ADSR in [0, 1] over `gate`, one voice per channel of it.
Its input one block late: the one way a loop closes. It runs first each block, reading what its producer left in the last one.
A resonant state-variable filter, low, band or high, at audio-rate cutoff.
Every partial moved by the same number of hertz, which no interval survives.
Its input times `gain`; the wires into `input` sum.
One gain across every channel, so nothing leaves above the ceiling and the picture holds.
Many channels become few, each one placed across the field it lands in.
Noise in [-1, 1], white or pink, on as many channels as are asked for.
An oscillator in [-1, 1], one channel per channel of `pitch`.
A pitch in volts pulled to the nearest note of a scale.
A room around the sound: eight delay lines fed back through each other, out in stereo.
The in-order crossing: a `[C, T]` signal frame with `sfreq` enters as `C` audio channels, resampled to the rate. A frame with no `sfreq` enters one sample per sample, so a control value is held until the next.
Its input with a rate limit: a step becomes a ramp, a gate an envelope, a knob a glide.
signal 38 nodes python + rust
Frames of array data: the sources, the analyses, and the arithmetic that reshapes, combines and routes them.
Rolling window along one axis: keeps the most recent `size` entries, rank unchanged.
A number, given a shape: the way a scalar becomes an array of the size a node downstream wants.
The stream as it was a moment ago, counted in samples, seconds or updates.
The eigenvalues and eigenvectors of a square symmetric matrix, or of its Laplacian.
Pull a frame apart into the oscillations it is made of, fastest first.
The spectrum both ways: samples into one-sided bins, and those bins back into samples.
Keep one band of the spectrum, run both ways so nothing comes out shifted in time.
Several strings become one, joined in order or placed into a template.
Move a signal up or down the spectrum by a fixed number of hertz, without changing its speed.
The first object in a piece of text becomes a table.
One elementwise function over the frame, chosen by name. Shape and metadata are untouched.
How big a signal's swing is, where in its cycle it stands, and how fast that is turning.
Lay several frames end to end along one axis, or stack them onto a new axis named after their senders.
A low-frequency oscillator: one sample per update to modulate a param, or a block of samples to feed a signal.
Receive an LSL stream: [channels, samples] per tick, with its labels and rate.
Publish a frame as an LSL stream, with the labels and rate it arrived with.
Scale and shift every value, then map one range onto another. Shape and metadata are untouched.
Write the sample rate or the channel names onto a frame, for a source that does not carry its own.
Receive MIDI: the velocity of every held note, and the value of every controller.
Send MIDI: note-on for a number that appears, note-off for one that goes.
Uniform, normal or pink noise, one independent stream per channel.
Put a signal on a common scale, from statistics over a window of its own past.
Combine several frames: arithmetic folded left with numpy broadcasting, a matrix product, or a correlation.
Receive OSC messages: one table entry per address, the latest value each.
Send a table as OSC messages, one address per entry.
How much power sits at each frequency, in Hz, over the last axis.
Collapse one axis to a single value per position on the others: a mean, a spread, an extreme or a total.
Change a signal's sample rate, filtering as it goes so nothing folds back.
Reorder the axes of a frame, then re-cut the entries into a new shape.
Keep part of one axis, named by label, by position, or by the coordinate range it carries.
Take the edge off a signal, as a running mean or as an exponential decay.
Let one of several wires through, chosen by number, so a signal can pick the route.
Several wires become one table, each under a key.
One field out of a table, on the output that matches what the field holds.
A string, which an expression can build out of anything else in the patch.
Turn a signal into a decision: one where it is past the level, zero where it is not.
A table becomes JSON text: an object, with arrays as lists and strings as strings.
How a signal's frequencies come and go across the frame, which one spectrum cannot show.
compiled in 3 nodes
Device nodes, compiled into the engine. Each owns an OS handle, so there is no source file to show.
The device's input, as many channels as it has.
The device: what reaches `input` is heard, times `gain`; every AudioOut on the device sums.
A MIDI port as signals: per voice a gate, a pitch in volts per octave (C4 is 0) and a velocity in [0, 1]. A note lands at the start of the next block.
Bundles
Optional packs: a directory of Python nodes and a requirements.txt naming what
they import. They ship with goofi as well, but they depend on those packages, so a node here
is listed unavailable when its packages are missing, and it names them. How a bundle is put together →
complexity 9 nodes python
Nonlinear measures over a window, from the antropy package.
DFA exponent: how far a signal remembers its own past.
Fractal dimension: how much the trace fills the plane, 1 (smooth) to 2 (filling).
Hjorth mobility and complexity: mean frequency, and distance from a sine.
LZ76 complexity: how much a signal repeats itself.
Permutation entropy: disorder in the ORDER of neighbouring samples.
Sample entropy: how rarely a pattern that recurred keeps recurring.
Spectral entropy: how flat the power spectrum is, tone to noise.
SVD entropy: how many independent components the signal's history spans.
Zero crossings: how often the signal changes sign over the window.
eeg 3 nodes python
EEG-specific work: recorded playback, band power, and a FOOOF fit.
What is not here
goofi also hosts VST3 plugins as nodes. An instance scans the plugin directories on the machine it runs on, and each plugin joins the palette as a family of its own under its vendor, with its parameters as node params. Which plugins appear depends on what is installed on that machine, so they are not listed here.
This reference describes goofi 3.1.0(537cd394), generated from a running instance on 2026-09-06.