goofi v3.0.0

Nodes

Explore 188 documented node types, from core tools to specialist bundles.

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 Nodes

Start with signal processing, audio, and graphics. Audio includes the compiled-in device nodes.

signal 47 nodes python + rust

Frames of array data: the sources, the analyses, and the arithmetic that reshapes, combines and routes them.

AudioIn rs

The audio plane crossing into the signal plane. A stream has no frame of its own — a tap hands over whatever the last blocks held — so `mode` is the framing the analysis asks for rather than the one the clock happened to give: the samples as they came, a window of a fixed length, or one level per fixed run of them.

input out
transform 6 params
Autocorrelation rs

How much a signal resembles itself shifted by each lag. The frame as handed is the window: a `Buffer` in front sets how much is seen. Each lane along `axis` becomes its autocorrelation over `lags` lags, so a periodic signal peaks again at its period.

input out
transform 7 params
Buffer rs

A rolling window along one axis. Keeps the most recent `size` entries; an axis past the rank is a new one.

input out
transform 6 params
Clock rs

A steady tick, in beats a minute, hertz or seconds. `pulse` is one on an update a tick landed in, `phase` where it is inside the current tick, and `count` the ticks since the last reset.

pulsephasecount
generatorcontrol 8 params
Constant rs

A number, given a shape. How a scalar becomes an array of the size a node downstream wants.

out
generator 5 params
Delay rs

The stream as it was a moment ago, counted in samples, seconds or updates.

input out
transform 7 params
Drawing rs

A drawing widget's picture, as a frame. Every stroke a `paint` widget holds — a hand's or `control paint`'s — as an [H, W, 4] RGBA frame spanning 0..1. Feed `graphics:SignalIn` with it to put the drawing on the GPU.

out
imageinput 4 params
Eigen py

The eigenvalues and eigenvectors of a square symmetric matrix. Or of its Laplacian, which reads the matrix as a graph instead.

input valuesvectors
analysisconnectivity 5 params
Emd rs

Pull a frame apart into the oscillations it is made of, fastest first.

input out
transform 6 params
Fft rs

The spectrum, both ways. Samples into one-sided bins, and those bins back into samples.

input out
analysis 7 params
Filter rs

Keep one band of the spectrum. Zero-phase, so nothing is shifted in time, or causal, so nothing waits.

input out
transform 10 params
FmSignal py

Generate a sinusoidal FM signal in real-time sample blocks. Carrier and modulator are frequencies in Hz. Index sets phase deviation: zero gives a sine wave; increasing it adds sidebands around the carrier. Carrier and modulator phases persist between blocks and parameter changes. Output is a float32 array in [-1, 1] with sampling-rate metadata. Connect it to Buffer, Psd, or Peaks to inspect the spectrum. Choose output/sfreq high enough for the sidebands; this source does not prevent aliasing.

out
generator 7 params
Format rs

Several strings become one, joined in order or placed into a template.

input out
transformtext 6 params
FreqShift rs

Move a signal up or down the spectrum. By a fixed number of hertz, without changing its speed.

input out
transform 6 params
FromJson rs

The first object in a piece of text becomes a table.

input out
transformtext 3 params
Function rs

One elementwise function over the frame, chosen by name. Shape and metadata are untouched.

input out
transform 4 params
GraphicsIn rs

The graphics plane crossing into the signal plane. A render is more numbers than the rest of a patch wants to carry, so `size` bounds each picture axis and the frame still says what it was rendered from. `mode` is what a picture is usually wanted for: its texels, its brightness, or the profile that brightness draws across the frame or down it.

input out
transform 5 params
Hilbert rs

A signal's envelope, phase and instantaneous frequency. How big its swing is, where in its cycle it stands, and how fast that is turning.

input envelopephasefrequency
analysis 4 params
Hold rs

Sample and hold: the value the last `take` caught. It glides to a newly caught value over `ramp`. Shape and metadata are the input's.

input out
control 5 params
Join rs

Lay several frames end to end, or stack them. Along one axis, or onto a new axis named after their senders.

input out
transform 5 params
LFO rs

A low-frequency oscillator. One sample per update to modulate a param, or a block of samples to feed a signal.

out
generator 12 params
LslIn py

Receive an LSL stream: [channels, samples] per tick, with its labels and rate.

out
input 5 params
LslOut py

Publish a frame as an LSL stream, with the labels and rate it arrived with.

input
output 5 params
Math rs

Scale and shift every value, then remap the range. `bound` says what happens to a value that lands outside it. Shape and metadata are untouched.

input out
transform 11 params
Meta rs

Write the sample rate or the channel names onto a frame. For a source that does not carry its own.

input out
transform 6 params
MidiIn py

Receive MIDI: every held note, every controller, the pitch wheel and aftertouch.

ccnotesbendpressure
inputmidi 5 params
MidiOut py

Send MIDI: note-on for a number that appears, note-off for one that goes.

notesvalue
outputmidi 7 params
Noise rs

Uniform, normal or pink noise, one independent stream per channel.

out
generator 10 params
Normalize rs

Put a signal on a common scale, from statistics over a window of its own past.

input out
transform 9 params
Operation rs

Combine several frames into one. Arithmetic folded left with numpy broadcasting, a matrix product, or a correlation.

input out
transform 6 params
OscIn py

Receive OSC messages: one table entry per address, the latest value each.

out
input 6 params
OscOut py

Send a table as OSC messages, one address per entry.

input
output 7 params
Psd rs

How much power sits at each frequency, in Hz, over the last axis.

input out
analysis 12 params
Quantize rs

Pull every pitch onto the nearest note of a scale. A value is a frequency in Hz, or volts per octave with C4 at 0 V. `index` says which degree of the scale each one landed on. Shape and metadata are the input's.

input outindex
transform 7 params
Reduce rs

Collapse one axis to a single value. One value per position on the other axes: a mean, a spread, an extreme or a total.

input out
transform 5 params
Resample py

Change the sample rate of a complete window; use Buffer to set its length.

input out
transform 5 params
Reshape rs

Reorder the axes of a frame, then re-cut the entries into a new shape.

input out
transform 5 params
Select rs

Keep part of one axis. Named by label, or by numpy index with keep and drop applied in either order.

input out
transform 8 params
Smooth rs

Take the edge off a signal, as a running mean or as an exponential decay.

input out
transform 8 params
Switch rs

Let one of several wires through, chosen by number. So a signal can pick the route.

input out
control 4 params
Table rs

Several wires become one table, each under a key.

arraysstringstables out
transform 4 params
TableNormalize rs

Put every member of a table on a common scale. Each member is measured against its OWN past, so features in different units become comparable numbers without one of them dominating.

input out
transform 8 params
TableSelect rs

One field out of a table, on the output that matches what the field holds.

input arraystringtable
transform 4 params
Text rs

A string, which an expression can build out of anything else in the patch.

out
generatortext 4 params
Threshold rs

Turn a signal into a decision. One where it is past the level, zero where it is not.

input out
control 9 params
ToJson rs

A table becomes JSON text. An object, with arrays as lists and strings as strings.

input out
transformtext 5 params
Wavelet rs

How a signal's frequencies come and go across the frame. Which one spectrum cannot show.

input outphase
analysis 10 params
audio 21 nodes rust

The same node interface at audio rate: oscillators, filters, envelopes, gates and feedback.

AudioIn rs

The device's input: the channels `channels` names, in order, or all of them.

out
input 2 params
AudioOut rs

The sound device: what reaches `input` is heard, times `gain`. `channels` names the device channels it lands on, the first incoming channel on the first channel named, so two AudioOuts can hold different pairs of one card. Every AudioOut on the device sums.

input
output 3 params
AudioPlayback rs

A WAV file as audio. As many channels as the file holds, resampled to the engine's rate.

out
input 4 params
BandFilter rs

Its input split into bands, each one at its own gain, added back up. The half of a vocoder that speaks: `gains` from a `BandFollow` puts that signal's shape on this one, and a shape is as many bands wide as it says, so the two banks cannot disagree about the count. With nothing behind `gains` every band is open, which is a few dB louder than the input rather than equal to it, because neighbouring bands overlap and add. One voice per channel of the input, so a chord goes through as a chord. In `harmonic` the bands stand on the partials of `pitch` and take its voices in turn, so what passes is a chord rather than a spread.

input out
transform 8 params
BandFollow rs

How loud its input is in each band, one band per channel. The half of a vocoder that listens: wire `out` to `BandFilter.gains` and the shape of this signal lands on that one. Every channel of the input is heard as one signal. In `harmonic` the bands stand on the partials of `pitch` and take its voices in turn, so what it measures is a chord rather than a spread.

input out
analysis 9 params
Delay rs

An echo, one line per channel, at a delay that may move while it sounds.

input out
transform 3 params
Env rs

An ADSR in [0, 1] over `gate`, one voice per channel of it.

out
transform 5 params
Feedback rs

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.

input out
transform 0 params
Filter rs

A resonant state-variable filter, low, band or high, at audio-rate cutoff.

input out
transform 3 params
FreqShift rs

Every partial moved by the same number of hertz, which no interval survives.

input out
transform 2 params
Gain rs

Its input times `gain`; the wires into `input` sum.

input out
transform 1 params
GraphicsIn rs

A texture crossing into the audio plane. Its texels are read in scan order, row 0 first, one sample per texel — so the picture's SIZE is its length, and a frame arrives whole and loops until the next one does. The inbox holds one second of samples, so a picture past about 435 square does not fit and is dropped: this crossing is for a modest one.

input out
control 4 params
Limiter rs

Hold everything under a ceiling. One gain across every channel, so nothing leaves above it and the picture holds.

input out
transform 3 params
MidiIn rs

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.

gatepitchvelocityvoices
inputmidi 3 params
Mixdown rs

Many channels become few, each one placed across the field it lands in.

input out
transform 2 params
Noise rs

Noise in [-1, 1], white or pink, on as many channels as are asked for.

out
generator 2 params
Osc rs

An oscillator in [-1, 1], one channel per channel of `pitch`.

out
generator 2 params
Quantize rs

A pitch in volts per octave pulled to the nearest note of a scale. A named scale is a preset; `custom` builds any scale from a stacked generator, the harmonic series, or a chosen subset of an equal division, read from any of its modes.

input out
transform 7 params
Reverb rs

A room around the sound. Eight delay lines fed back through each other, out in stereo.

input out
transform 6 params
SignalIn rs

A signal frame crossing into the audio plane. As a `waveform`, a `[C, T]` frame with `sfreq` enters as `C` audio channels, resampled to the rate; one with no `sfreq` enters one sample per sample. The newest frame loops until the next one takes over at its end, so frames on time play back to back and a late one never leaves a gap. With `mix`, the `C` rows play together as one channel, their mean. `low..high` are the values that are full scale, and `smoothing` crossfades one frame into the next. As an `oscillator`, an `[n]` frame is n sines at those pitches, Hz or volts per octave by `pitch`, and a `[2, n]` frame n sines at row 0 with row 1 as their phase in radians; their mean is one channel.

input out
control 6 params
Slew rs

Its input with a rate limit. A step becomes a ramp, a gate an envelope, a knob a glide.

input out
transform 2 params
graphics 27 nodes python + wgsl

Textures on the GPU, each node a WGSL shader: sources and gradients, blurs, displacements, levels and composites, cellular automata and reaction fields, and the doors that carry a signal frame in and a window out.

AudioIn wgsl

the audio plane as a running picture The door in from a stream, which has a history where a frame has none: every render leaves a column standing and the picture walks left. `audio/mode` says what a column holds — the band its samples span, the frame itself stacked down it, or, on a trace that fades instead of walking, two channels against each other. Set common/width and height, or it is 1024 square.

input out
imagegenerator 7 params
Blur wgsl

soften an image or spread it along a path Gaussian weights the center; box averages a square; disk averages a circle. Directional follows angle in degrees (0 is horizontal). Radial rotates about center x/y; zoom moves toward and away from that center. Radius is the maximum offset as a fraction of image height, or a fraction of a turn for radial, or a scale change for zoom. Gaussian uses radius as three standard deviations. Quality sets 5, 9, or 17 samples per axis or path; higher quality reduces gaps at large radii but costs more GPU time. Frame edges are extended. Colors are averaged with alpha weights; radius zero passes the input through.

input out
imagetransform 8 params
Composite wgsl

two textures into one A is the foreground and B is the background. Under puts B over A. Subtract is B - A; divide is B / A (zero divisors give zero). Minimum and maximum compare each RGB channel. In keeps A inside B's alpha; out keeps A outside it; atop keeps B's alpha; xor keeps non-overlapping parts. Color modes blend where the inputs overlap and use source-over alpha. RGB is not clamped, except in color dodge/burn. Blend fades the result back to B with alpha-correct interpolation.

ab out
imagetransform 4 params
Constant wgsl

one colour everywhere The simplest source there is: every texel takes the four channels below.

out
imagegenerator 6 params
Displace wgsl

push the input around by a map The map's red and green channels are the two directions, with 0.5 as no push.

inputmap out
imagetransform 3 params
Elementary wgsl

Wolfram's one-dimensional automaton, drawn as it scrolls One row of cells, one rule number from 0 to 255, and every generation pushed down the screen. 30 makes noise out of one cell; 110 is a computer.

out
imagegeneratorsimulation 6 params
Feedback wgsl

the previous tick's input The one node a loop closes through: it reads its input as the last tick left it, so a chain can build on what it drew.

input out
imagetransform 2 params
Ising wgsl

magnets that agree with their neighbours, against the heat Drag temperature through about 2.27 and the whole grid changes character: ordered below it, noise above, and long tangled domains right at it.

out
imagegeneratorsimulation 7 params
Lenia wgsl

a continuous cellular automaton Life's smooth relative: a ring-shaped neighbourhood and a growth curve instead of a birth rule. Rings is the kernel's own shape and the widest knob here — one ring gives worms, three gives stars and cells. Radius is the ring as a fraction of the frame, so the creatures are the same size at any resolution. At full density the frame is a soup; lower it and separate colonies grow into the black, some of which die.

out
imagegeneratorsimulation 10 params
Level wgsl

brightness, contrast and gamma Gain scales, offset shifts, gamma curves, and invert flips what comes out. Alpha is left alone.

input out
imagetransform 6 params
Life wgsl

a cellular automaton that keeps its own grid The rule decides what lives; density and seed set the first generation. The grid is the node's own size, so a small one gives large cells.

out
imagegeneratorsimulation 5 params
Lookup wgsl

recolour through a palette One channel of the input reads across the palette, left to right.

inputpalette out
imagetransform 3 params
Math wgsl

Scale and shift texture channels, then remap their range. The order is (input + pre_add) * multiply + post_add, followed by range mapping. RGB leaves alpha unchanged; alpha leaves RGB unchanged; RGBA applies the same math to all four channels. A zero-width source range gives to_low. Reversed ranges are supported. Bounds use the sorted target endpoints: clamp holds values at the edges; wrap repeats the range; fold halves or doubles positive values into a positive range, as in signal Math. Fold ranges narrower than an octave can leave values outside. Values are not clamped unless clamp is selected.

input out
imagetransform 11 params
NeuralCA wgsl

a cellular automaton whose rule is a small network Twelve channels per cell. Each one sees itself, the slope around it and the curvature, and a learned two-layer rule says what to become. Train one against a folder of images with `training/style_ca.py` and wire the `[1, N, 4]` weights it writes into `weights`; the hidden width is read from the array's own length. With nothing wired it draws its own rule from `seed`, which is a texture nobody trained.

weights out
imagegeneratorsimulationml 10 params
Noise wgsl

noise, in four kinds Period is how far apart the peaks are, harmonics how many finer layers ride on top of them, and roughness how loud those layers are. Speed drifts the field, x and y pan across it. Brightness and contrast are Level's job.

out
imagegenerator 15 params
Ramp wgsl

a gradient between two colours The angle turns the gradient: 0 runs left to right, 90 top to bottom.

out
imagegenerator 9 params
Reaction wgsl

two chemicals that spread and eat each other The Turing pattern: spots, stripes, worms and mitosis, all out of the same two numbers. Feed and kill are the pair worth dragging.

out
imagegeneratorsimulation 10 params
Sandpile wgsl

grains pile up until the pile knocks itself over Self-organized criticality: nothing tunes it, and it settles by itself at the point where one grain can start an avalanche of any size.

out
imagegeneratorsimulation 6 params
Shape wgsl

one shape on transparent black Size is the width across as a fraction of the frame, and soft is how far the edge fades.

out
imagegenerator 8 params
SignalIn wgsl

a signal frame as a texture The door in from the signal plane. `signal/mode` says what the frame becomes: its own texels — [N] is one row, [H, W] is gray, [H, W, C] keeps the channels it has — or the line plot or the trajectory a viewer draws of it, on transparent ground so it composites. A texel is the value on the range, through the colormap where the frame has one channel. A [C, N] frame is C series; a trajectory pairs the channels, one against the other. Set common/width and height, or the texture is the frame's own size.

input out
imagegenerator 11 params
Tessellate wgsl

the plane divided, and the picture that divides it One tessellation, in four geometries. Wallpaper folds the plane by one of the seventeen periodic symmetry groups. Kaleido folds it by a triangle of mirrors, and the three angles decide whether the tiling lives on a sphere, on a plane or in Escher's circle limit — sweep them and the curvature sweeps with them. Quasi lays n grids across each other: two or three of them cross into a lattice, and five never repeat. Mosaic hands the picture its own cells and moves them, one relaxation step a frame, until they sit where the edges, the colours or a wired guide say they should. Escher is the page that turns a division into a creature: a displacement field the group carries with it, so the tiles interlock however far they are pushed. Fit blends that field into the picture's own gradient, so the outline learns the image. Morph makes the field drift across the frame and the tiles change shape as they go, still interlocking, which is what a parquet deformation is. Gestalt is where the pattern stops being geometry: figure trades the two hands of a tile, flatten takes each tile's one colour, contour draws the seam and tint tells the tiles apart. Amount holds the tiling exact on one harmonic however far it is pushed. On several, past about three quarters it begins to fold tiles through each other, which is a look and not an error.

inputguide out
imagetransform 34 params
Threshold wgsl

brightness to black and white Soft widens the step into a ramp around the level.

input out
imagetransform 4 params
Transform wgsl

move, turn and scale the input Outside the frame it is transparent black, or the frame repeats when tile is on.

input out
imagetransform 7 params
Upscale wgsl

Enlarge an SDR image on the GPU. Set common/width and common/height to the output size. FSR 1 and NIS preserve edges and sharpen existing detail. They do not reconstruct detail with AI. Input RGB must be in 0..1. Alpha uses linear sampling. Smaller output dimensions use linear sampling.

input out
imagetransform 4 params
Wave wgsl

a membrane that rings The wave equation on a grid: ripples spread, meet, interfere and fade. It keeps two frames of history, because a wave needs to know where it was going.

out
imagegeneratorsimulation 8 params
Window wgsl

show this texture in a window on the machine goofi runs on The window is the frame's own size — set common/width and height to resize it. It stays a normal node: its output is the same texture, so a viewer or another node can read it too.

input out
imageoutput 2 params
Camera py

Frames from a capture device or a video file.

out
inputimage 8 params

Bundles

Bundles collect nodes for a particular task, such as EEG analysis, image generation, or simulation. Enable the bundles you need in Goofi. Some require extra packages or models. Learn about bundles →

eeg 8 nodes python

EEG-specific work: recorded playback, band power, and a FOOOF fit.

Connectivity py

A connectivity matrix over channels. Phase, amplitude and plain statistical couplings, all as `[C, C]`.

data matrix
analysiseegconnectivity 7 params
EegPlayback py

Replay an EEG recording at its own rate, as if it were live.

out
inputeeg 4 params
EegPowerBands py

Band power per channel, delta to gamma. Absolute, or as a share of the whole spectrum.

psd power
analysiseeg 6 params
EegPreprocess py

Filter fresh EEG chunks continuously before the rolling PSD buffer. Preserves channel labels, units and sample rate. Uses a causal fourth-order Butterworth bandpass and Q=30 mains notch, retaining SOS state across chunks. Startup is initialized from the first sample and withheld for two seconds. Wire directly from LslIn, never from an overlapping rolling buffer. No clipping, normalization or automatic rereferencing is applied.

input out
3 params
Epoch py

Capture each window once; use Buffer to set the window length.

datatrigger erplatestcount
analysiseeg 4 params
Fooof py

FOOOF: the aperiodic 1/f slope and the peaks that rise above it.

psd aperiodicpeaks
analysiseeg 6 params
GraphMetrics py

Clustering, path length, centrality and assortativity of a connectivity matrix. Threshold it with `density` first: a complete graph has nothing to say.

matrix clusteringpathefficiencybetweennessdegreeassortativitytransitivity
analysiseegconnectivity 3 params
Reference py

Re-reference an EEG frame. Average, median, one electrode, a neighbour-difference Laplacian, or a bipolar chain.

datamontage data
transformeeg 4 params
complexity 10 nodes python

Nonlinear measures over a window, from the antropy package.

biotuner 22 nodes python + rust

A signal’s spectral peaks read as a tuning: the ratios between them, their harmonicity and consonance, and what a scale becomes as rhythm, colour or synth control.

BioFilter rs

A dynamic EQ whose bands are a signal's own spectral peaks. Wire `Peaks` in through a SignalIn: raised by `shift` octaves the peaks are where the bands sit, and left alone they are how fast the bands sweep.

inputpeaksamps out
transform 11 params
PaletteView py

Show an RGB palette as exact swatches, hex labels, and a blended ribbon. Connect BioColors.rgb, or any normalized [colors, 3] RGB array, to input. The display shows up to 16 finite colors. The ribbon interpolates between them; it does not change the swatches. Output is a normalized RGB image.

input image
imagetransform 4 params
RatioSequence py

Emit successive ratios, with an independent hold and glide in each step. Sequence order is retained. A glide occupies the end of each step and joins its ratio to the next in log frequency. The loop joins the last to the first. Ping-pong reverses without repeating its endpoints. Pause holds the current position; reset returns to the first step. Editing ratios or direction also restarts. A clock source change or backward clock jump re-anchors at step one. Keep anchor ratios outside the moving range to avoid component crossings in downstream nodes that sort or merge equal frequencies. transition contains the two endpoint ratio rows and their eased mix in metadata. Connect it to HarmonicModes.transition for smooth plate mode motion. chord.state selects a single ratio or the full anchor chord; its endpoint amplitudes are uniform and phases are zero.

clock transition
generatormusic 11 params
HarmonicMorph py

Morph tunings, phases, and component counts; share the result across media.

abampsAampsBphasesAphasesBmixtransition harmonic
generatortransform 21 params
HarmonicVoices py

Keep component fades when one harmonic frame drives sound and geometry.

input pitchgain
transformmusic 3 params
BioColors py

A palette from a signal's peaks or from a tuning. Inputs: input peaks in Hz, or ratios when `source` is `tuning` amps optional — the amplitudes beside those peaks, as `Peaks` emits them Outputs: rgb one row per degree, red green blue in 0 to 1. Wire this to an `image` viewer lightness per degree, 0 to 1 chroma per degree, how saturated — 0 is grey hue per degree, in degrees around the circle hex the same palette as text, for a viewer or an agent to read

inputamps rgblightnesschromahuehex
transformimage 4 params
BioElements py

Which elements' spectra stand in the same relations as a signal's peaks. Inputs: input peaks in Hz, as `Peaks` emits them amps optional, and read by `method` `tuning` alone Outputs: elements one entry per element kept, its score per row of input scores the same scores as numbers, ranked, for binding or plotting ranked the element names in that order, so a reader can label the scores categories what each ranked element is — a noble gas, a lanthanide — in the same order

inputamps elementsscoresrankedcategories
analysis 9 params
EuclidRhythm py

A scale's intervals as euclidean rhythms. Inputs: input a tuning: ratios inside an octave, as `Tuning` emits them Outputs: patterns one row per rhythm, 1 where an onset falls and 0 where none does steps how many steps each row spans, so a row can be read without counting its padding

input patternssteps
transformmusic 5 params
HarmonicObservatory py

An evolving atlas of power-weighted harmonic activation and history. Activation is supplied by HarmonicSpectrum: kernel times normalized power outer product. Color uses a labelled logarithmic scale with a slowly decaying peak ceiling. Matrix values themselves are never rescaled. Connect HarmonicSpectrum.analysis to analysis. All panels use one window. display/channel selects a named channel, or a row number for unlabeled data. Refresh the channel list after connecting a source or changing its channels. Connect dashboard to graphics:SignalIn in texture mode, or an image viewer.

analysis dashboard
image 3 params
HarmonicSpectrum py

A signal's harmonicity spectrum, peak frequencies, and complexity. Input: input raw time series with sfreq metadata; the last axis is time. Use Buffer for at least int(sfreq / precision) samples per row. Short windows wait; flat or non-finite rows return NaN. Connect peaks to Tuning or Harmonicity. peakValues contains harmonicity scores, not the power in dB used by Tuning's diss_curve method. Outputs: analysis one table with all outputs below from the same input window; connect directly to HarmonicObservatory.analysis spectrum H(f), with frequency labels on the last axis freqs the shared frequency grid in Hz, shape [F] peaks peak frequencies in Hz, shape [..., n_peaks] peakValues H(f) at each detected peak, shape [..., n_peaks] matrix frequency-pair similarity, shape [..., F, F] activation matrix * power[:, None] * power[None, :] power min-subtracted PSD normalized to unit sum, as used by H(f) waveform the exact analysis input window harmonicity mean H(f), one value per input row complexity flatness, entropy, spread in Hz, and Higuchi dimension

input spectrumfreqspeakspeakValuesmatrixharmonicitycomplexityactivationpowerwaveformanalysis
analysis 9 params
Harmonicity py

Harmonic similarity, Tenney height, consonance and subharmonic tension. Inputs: input peaks in Hz, as `Peaks` emits them Outputs: harmsim 0..100, higher is more consonant. The mean harmonic similarity of every pair: how nearly the peaks form a simple whole-number ratio. tenney Tenney height, higher is MORE complex. The log of the ratio's numerator times its denominator, so it grows as the fractions get uglier. cons 0..1, higher is more consonant. The mean consonance of the peak pairs that pass `cons_limit`. subharmTension Higher is more tense. How badly the peaks fail to share a common subharmonic within `delta_lim`.

input harmsimtenneyconssubharmTension
analysis 4 params
MicrotonalKeys py

Play a tuning from a MIDI keyboard: one voice per key, one step per key. Inputs: input a tuning: ratios inside an octave, as `Tuning` emits them notes `signal:MidiIn`'s `notes` — 128 slots, the note number is the INDEX and the velocity the value Outputs: voices the whole keyboard in one wire: pitches then velocities, the layout a plugin's `voice` input reads — cross it with `audio:SignalIn` and that is the only cable pitch volts per octave, zero at C4 — reference this from `voice.pitch` gate 1 while the key is held velocity how hard it was struck, 0 to 1 freq the same pitch in Hz, for reading rather than playing

inputnotes voicespitchgatevelocityfreq
transformmidi 4 params
Peaks py

The dominant spectral peaks of a signal, and their amplitudes. Inputs: input a RAW time series. The last axis is time, and `sfreq` must be in the frame's metadata Outputs: peaks the loudest frequencies, in Hz, `n_peaks` wide and NaN-padded amps each peak's power in dB — normally NEGATIVE, and larger means louder

input peaksamps
analysis 5 params
Polyrhythm py

A scale's degrees as simultaneous cycles on one grid. Inputs: input a tuning: ratios inside an octave, as `Tuning` emits them Outputs: voices one row per degree, 1 where an onset falls and 0 where none does coincidences per grid position, how many voices strike at once labels what each voice is, in the construction's own words cycle how many positions the grid holds, so a player knows the loop length

input voicescoincidenceslabelscycle
transformmusic 4 params
RhythmPlayer py

Walk a rhythm pattern at a tempo and emit its gates. Inputs: input a pattern: `[voices, steps]`, or one `[steps]` row, as the rhythm nodes emit Outputs: gate one row per voice, 1 while its onset sounds and 0 otherwise step which position of the grid is playing, counted from zero phase how far through the current step, 0 to 1, for anything that wants to slide

input gatestepphase
transformmusic 5 params
ScaleForaging py

Hold a tuning, and take a new one only when it is related enough to the last.

input tuningsimilaritychanged
musiccontrol 7 params
TimbreControls py

A tuning as continuous, bindable synth controls. Inputs: input a tuning: ratios inside an octave, as `Tuning` emits them gate optional scalar or column of gates for the selected partials. Positive values sound a voice; missing input sustains all voices. Outputs: partials the ratios as frequencies over `base_freq`, in Hz amplitudes per partial, 0 to 1, normalized so the loudest is 1 weights per partial, how consonant it is against the rest, 0 to 1 brightness the amplitude-weighted centroid, 0 to 1 across the partial span — the one to bind to a filter cutoff spread how far the degrees sit from simple just ratios, in cents against `spread_span`, 0 to 1: a just scale is 0, a tempered or irrational one higher. Binds to detune, unison or an inharmonic control harmonicity the mean consonance of the whole set, 0 to 1 pitch selected partials in volts per octave, zero at C4; [voices, 1] gain selected amplitudes divided by their sum, then gated; [voices, 1] gate selected voice gates, with unused voices off; [voices, 1] voices pitches followed by gated velocities; [2 * voices, 1], for VST voice Use SignalIn in direct mode for pitch, gain, gate, and voices. A native patch is Osc -> Gain -> Mixdown -> AudioOut, with pitch and gain references. The VST voice cable plays the partials as notes, not as one custom wavetable. Select one analysis row before binding brightness, spread, or harmonicity to a plugin parameter. Those controls are normalized to 0..1; native filter pitch and other physical units need an explicit range mapping.

inputgate partialsamplitudesweightsbrightnessspreadharmonicitypitchgaingatevoices
transform 7 params
Tuning py

The ratios between a signal's peaks, as a scale inside one octave. Inputs: input peaks in Hz, as `Peaks` emits them amps optional, and REQUIRED by `method` `diss_curve` — the amplitudes beside those peaks Outputs: tuning the scale's ratios, NaN-padded to the widest row in the batch

inputamps tuning
analysis 8 params
TuningMatrix py

The pairwise consonance of a scale's degrees. Inputs: input a tuning: ratios inside an octave, as `Tuning` emits them Outputs: matrix the full `[N, N]` grid, symmetric, for a viewer to draw metricPerStep one number per degree — the grid's column means — which is what a param follows when you want each scale degree to drive something of its own metric one number for the whole scale: how consonant this tuning is overall

input matrixmetricPerStepmetric
analysis 2 params
TuningReduction py

The most consonant subset of a scale, as a mode. Inputs: input a tuning: ratios inside an octave, as `Tuning` emits them Outputs: reduced the mode's degrees, always `n_steps` wide and NaN-padded

input reduced
analysis 2 params
VitalPreset py

Export a tuning or explicit partials as a Vital oscillator preset. Inputs: input tuning ratios; use this OR the partials/amplitudes pair partials frequencies in Hz, as TimbreControls emits them amplitudes linear amplitudes aligned with partials, not power in dB signal optional raw biosignal for ensemble, with sfreq metadata Outputs: path last successful preset path, or the ensemble directory files paths of all presets, settings companions, and the ensemble manifest Select a tuning row with preset/row. Each write pulse uses the latest frames. Load the .vital file through Vital's preset browser. It supplies the sound; MIDI or a voice cable must still supply the notes. bell changes the envelope and effects; a periodic wavetable does not retain exact inharmonic pitches.

inputpartialsamplitudessignal pathfiles
output 8 params
BioFilter rs

A dynamic EQ whose bands are a signal's own spectral peaks. Wire `Peaks` in through a SignalIn: raised by `shift` octaves the peaks are where the bands sit, and left alone they are how fast the bands sweep.

inputpeaksamps out
transform 8 params
harmonic-geometry 12 nodes python + wgsl

Harmonic ratios become curves, fields, meshes, and textures. Explore all twelve nodes in the Harmonic Geometry cookbook.

HarmonicGeometry py

Curves, interval graphs, fractals, meshes, plates, and wave fields from one chord. Coordinates retain their physical domain. The sole geometry ARRAY carries the selected method and its connectivity. Changing methods replaces the complete frame.

input geometry
transformimage 27 params
HarmonicModes py

Map harmonic ratios to Chladni modes and interpolate two mode structures. Use separate input/target harmonic frames and mix, or a single transition ARRAY carrying endpoints and mix metadata. RatioSequence.transition supplies the latter so a new step's endpoints and its mix reset remain synchronized. Endpoints map to integer modes first; intermediate coordinates are continuous visual fields. Connecting both input routes reports an error. Fields interpolation keeps endpoint wavenumbers fixed and only blends their weights; this removes the corner-anchored expansion of coordinate motion.

inputtargettransitionmix modesmapping
transform 6 params
HarmonicTransport py

Apply Biotuner transport operators to an existing scalar geometry field.

input geometry
transformimage 10 params
GeometryBlend py

Blend scalar fields, curves, or meshes with matching connectivity.

abmix geometry
transform 5 params
GeometryMetrics py

Measure geometry size, field structure, connectivity, and method-specific features.

input values
analysis 1 params
GeometryView py

Render geometry, camera controls, harmonic components, and measurements.

inputharmonicmetricspalette image
image 16 params
GeometryRender wgsl

GPU rendering of HarmonicGeometry.geometry or GeometryBlend.geometry: curves, points, graphs and triangle meshes. Fixed orthographic view, transparent background, antialiased lines and depth-tested matte surfaces. Coordinates retain their domain: set radius to fit the geometry. Cost scales with pixels times primitives; start at 256 square. Fields use HarmonicInk instead.

geometry out
imagetransform 6 params
HarmonicLissajous wgsl

A projected 3D Lissajous trace from HarmonicMorph.harmonic. The first three selected components drive x, y, z. Frequencies remain continuous over a fixed exposure; the curve need not close. Phase comes from the harmonic frame. Start at 256 square; samples controls fragment cost. A high frequency or long duration needs more samples. No hidden clock drives the geometry.

harmonics out
imagegenerator 11 params
HarmonicChladni wgsl

Chladni displacement and nodal density from Biotuner modes. Wire HarmonicModes.modes to modes and HarmonicMorph.harmonic to harmonics. For the cymatics notebook, select chord pairs in HarmonicModes, symmetry 1 here, output nodal, and density_symmetry d4_max. Whole-chord pairwise cosine products become exp(-w²/σ²), then eight square density transforms are united by maximum or averaged. D4 never changes signed displacement. Sigma is explicit, initially 0.05. approach 1 evaluates open directional waves. Fractional modes and field blends are visual transitions, not closed-plate eigenmodes. Signed output uses normal HarmonicInk; density output needs Ink style density or Relief input_kind density. A displacement buffer adds one graphics frame of latency without accumulation.

modesharmonics out
imagegenerator 10 params
HarmonicInk wgsl

Color and contours for a signed harmonic field. Wire HarmonicChladni.out to input, or HarmonicGeometry/GeometryBlend/HarmonicTransport.geometry directly to geometry. A valid geometry array takes precedence over the texture input. The raw field is unchanged. BioColors.rgb can feed palette directly as an [N,3] array. Alpha preserves domain masks. range is fixed, so morphs do not silently change their contrast.

inputgeometrypalette out
imagetransform 6 params
HarmonicRelief wgsl

Accepts a signed input texture or a canonical field ARRAY on geometry; a valid geometry input takes precedence. Draw a harmonic field as grains, living textures, or sculpted material. Connect HarmonicChladni.out to input. Choose any two textures and morph their surface detail, density, color, and light response. Sand, dunes, lichen, coral, cells, spores, pollen, and plankton join jade, brushed metal, woven silk, and porous stone. Organic textures follow the field with small rough features and restrained highlights. A height-field ray march gives parallax and shadows. Mirrored extension fills the view. This is a stateless visual mapping: grains and cells are procedural features, not tracked particles or a biological simulation. Drive texture_mix separately from upstream mode, phase, or tuning changes. An absent or masked field shows the background.

inputgeometry out
imagetransform 23 params
HarmonicFlow wgsl

Persistent ink carried by a harmonic flow field. Wire HarmonicTransport.geometry to flow. Seeded ink is advected by that vector field and by the curl of its own slow memory. There is no hidden time animation. rate 0 freezes the state; reset seeds while held true. diffusion can eventually smooth the image, so injection is available as an explicit control. Output red is ink, green is memory, blue is departure; use HarmonicInk in magnitude mode to color it.

flow out
imagesimulation 11 params
simulation 24 nodes rust + wgsl

Systems that run on their own and answer to the patch: attractors, coupled oscillators, spiking and neural-mass networks, reservoirs, swarms and populations.

Attractor rs

The classical chaotic systems. Six flows and four maps, each on its own canonical constants — a source of motion that never repeats and never jumps.

out
generatorsimulation 10 params
Attractor wgsl

the orbit a chaotic system draws, on a turning stage The trace a phosphor screen would leave: every point the model reaches is painted and everything already there fades. x across, z up, y into the screen, and `spin` turns the whole figure. Wire the model's `out`; in `value` mode each tick is one dot, and in `block` mode the block is a continuous path.

out out
imagesimulation 6 params
Boolean rs

A random Boolean network, frozen or chaotic on one knob. Every unit reads a few others through a rule drawn once; `activity` says how much of the network is still changing.

stateactivity
generatorsimulation 8 params
Boolean wgsl

the space-time diagram a random Boolean network is judged by One row per unit and one column per tick, oldest at the left. A unit that is on but never changes is grey — the frozen core — and one that keeps flipping burns amber, which is the whole difference between the ordered side of the Kauffman transition and the chaotic one. More units than rows fold into a band each.

state out
imagesimulation 2 params
Branching rs

Avalanches of activity, tuned to the critical point. The neuronal-avalanche model: `avalanche` reports the size of each cascade once it has finished, and at a branching ratio of 1 those sizes follow a power law.

drive stateactivityavalanche
generatorsimulationeeg 9 params
Branching wgsl

the cascades a branching network throws, and how big they got One row per unit and one column per tick, oldest at the left, with every column carrying the colour of the avalanche running through it — dim red for a small one, pale yellow for a network-wide storm. The activity profile runs along the bottom. Wire `state`, `activity` and `avalanche`.

stateactivityavalanche out
imagesimulation 4 params
Hopfield rs

An associative memory that completes what it is shown. Store patterns, cue it with a fragment, and `overlap` says which memory it settled into.

patternscue stateoverlapenergy
generatorsimulationml 9 params
Hopfield wgsl

an associative memory's state as the picture it is The state vector folded back into a grid of cells, cool for -1 and warm for +1, with the overlap against each stored memory as a strip of bars underneath. Wire `state`, and `overlap` for the strip. `columns` is 0 for as square a grid as the width allows.

stateoverlap out
imagesimulation 4 params
Kuramoto rs

Coupled phase oscillators that fall into step. Each runs at its own natural frequency and is pulled towards the others; `order` says how synchronised they are, from 0 to 1.

frequenciescoupling phaseswaveformsorder
generatorsimulationconnectivity 10 params
Kuramoto wgsl

the phase circle a ring of oscillators is read off One dot per oscillator at its own phase, counter-clockwise from the right, and the order vector out of the middle: its length is how synchronised they are and its heading is the mean phase. Wire the model's `phases`; a `block` frame is read at its newest step. Past 256 oscillators the picture samples them.

phases out
imagesimulation 4 params
NeuralMass rs

Neural populations, wired into a network. Each is a whole population as one variable; a connectome on the `connectivity` input makes the set a whole-brain model.

inputconnectivity out
generatorsimulationeegconnectivity 11 params
Oscillator rs

Nonlinear oscillators with an amplitude of their own. Five models on one set of knobs — a limit cycle, an excitable neuron, a normal form, a double well and a driven pendulum.

drive out
generatorsimulation 12 params
Physarum rs

Slime-mould agents growing a transport network. Each follows the trail it and the others left; `trail` is a field an image viewer or `SignalIn` draws directly.

attract trailpositions
generatorsimulationimage 13 params
Physarum wgsl

the trail a slime mould leaves, lit the way it is usually shown The field through a ramp with a gamma under it, which is what makes the faint filaments visible at all; the agents themselves ride over it as dots. Wire `trail`, and `positions` for the overlay. The overlay walks at most 512 agents, and a run of more than 8192 does not reach the engine at all.

trailpositions out
imagesimulation 4 params
Population rs

Populations that rise, crash and cycle. Predator and prey, an epidemic running its course, and the map that folds one population into chaos.

out
generatorsimulation 12 params
Quantum rs

A few qubits, simulated exactly, with the patch turning the knobs. `angles` drives every rotation; `probabilities` is what a measurement would find, and `entropy` is how entangled the qubits have become.

angles probabilitiesblochentropy
generatorsimulation 6 params
Quantum wgsl

the two pictures a few qubits are read from A Bloch sphere per qubit — x across, z up, and y into the screen, which warms and widens the head as the vector comes towards you — over the statevector as a bar per basis state. Wire `bloch` and `probabilities`.

blochprobabilities out
imagesimulation 4 params
Readout rs

Trains a linear readout on a live state, one step at a time. Wire a reservoir to `state` and what it should say to `target`; recursive least squares does the rest, and `error` is how wrong it still is.

statetarget predictionerrorweights
transformsimulationml 3 params
Reservoir rs

A pool of randomly wired units that rings when driven. The echo state network: the pool is never trained, only read — wire `Readout` to it to turn what it remembers into a prediction.

inputconnectivity state
generatorsimulationml 12 params
Reservoir wgsl

the activity carpet an echo state network is read from One row per unit and one column per tick, oldest at the left, cool for a unit pushed negative and warm for one pushed positive. A pool with a long memory holds its stripes for many columns; one with a short memory does not. More units than rows fold into a band each.

state out
imagesimulation 2 params
Spiking rs

A spiking network laid out in space, with conduction delays. Neurons wire to their neighbours, a spike takes time to arrive, and `weight` is the knob between silence and a storm.

input potentialsspikesrate
generatorsimulationeeg 19 params
Spiking wgsl

the raster a spiking network is read as, scrolling One row per neuron and one column per tick, oldest at the left: spikes as marks over the membrane potential as heat. The picture is the node's own, built up tick by tick, so a `value` frame is enough — a `block` frame folds to the strongest sample it holds. More neurons than rows fold into a band each.

spikespotentials out
imagesimulation 3 params
Swarm rs

Particles with a rule between every pair. Flocking, alignment, gravity, oscillators that swarm, and asymmetric attraction between colours — one integrator, five rules.

attraction positionsvelocitiesphasesorder
generatorsimulation 16 params
Swarm wgsl

the particles a swarm is made of, where they are and where they are going A dot per particle in the model's own unit box, with a streak along its velocity. Wire `positions`, and `velocities` and `phases` for the streak and the colour. A third column is depth: it shrinks and dims what is far away. Past 512 particles the picture samples them.

positionsvelocitiesphases out
imagesimulation 5 params
computer-vision 5 nodes python + wgsl
ML 4 nodes python
Image Generation 1 nodes python
Image 2 nodes python
inception 5 nodes wgsl
FluidPigments wgsl

Sixteen EEG features drive liquid pigments, morphing and color. Inputs 1-8: normalized LZ; 9-16: normalized Higuchi dimension.

features out
imagesimulation 21 params
FractalJewelry wgsl

Recursive jeweled filigree, from icy spiral lace to enameled paisley. Each recursion level deposits its own ribbon, beads and lace on top of the coarser ones, so the frame fills with nested ornament. topology x fold x symmetry x palette are a combinatorial space of forms; style blends the cold filament look (0) into gold-and-teal enamel (1). Set wander to 0 for a still image.

out
imagegeneratorsimulation 47 params
RibbonSpace wgsl

Inception: living iridescent thought-forms unfolding from within. Inspired by Besant and Leadbeater's Thought-Forms (1901), especially the meditation and music plates. Nested luminous membranes continually bloom, curl and dissolve. Stateful reaction-diffusion bends and illuminates the membranes, with vortices, orbital drift and peristaltic waves. Speed controls metabolism; morph changes the organism; intricacy adds fine ribs; iridescence controls interference colour. Every artistic parameter has its own GPU sine LFO: lfo_rates are Hz and lfo_depths are peak excursions in parameter units; zero depth stops that modulation. Base controls remain editable. Motion speed uses an integrated phase to avoid acceleration from multiplying a changing speed by elapsed time.

out
imagegeneratorsimulation 90 params
ThoughtField wgsl

Six nested scales of local agreement and distant inhibition, drawn in ink. A visual metaphor for thought, not a brain model. Equal rules at geometrically spaced radii create competing domains. Activity advects through its own memory gradient; memory slowly follows. Finite resolution bounds the scale range. The field and its colouring are one node here: the `structure` and `motion` groups shape what happens, and `tone`, `palette` and `texture` decide how it is drawn.

out
generatorsimulationimage 32 params
TimeWarpFbm wgsl

Nested fBm pigments and layered refractive pools. Choose fBm or refractive pools. Nine palettes use the internal warp fields for secondary pigments and iridescent color. Pool brush controls create a moving ripple; optics controls depth, refraction, dispersion, absorption and lighting. Refraction is a layered screen-space approximation. Fractal selects noise basis, octave spacing and folds. Geometry stretches, twists or mirrors the domain. Warping controls the two displacement scales and directions. Structure adds terraces and marble bands. These shape controls also feed the refractive pool.

out
imagegenerator 53 params

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.