Worked patches

Four patches built only from nodes goofi ships. Each diagram is drawn at the editor's own geometry, and every slot name is the one the node declares.

A spectrum, and the bands in it

The signal plane end to end: a live LSL stream, band-limited, transformed, and reduced to one scalar per band. Psd has its viewer open on its out slot, which is what the line viewer draws; EegPowerBands has one on power.

LslIn py
out
Filter rs
input
out
Psd rs
input
out
EegPowerBands py
psd
power

Built from a shell as one batch, so the seven ops are one undo step:

goofi - <<'OPS'
node add signal:LslIn
node add signal:Filter
node add signal:Psd
node add signal:EegPowerBands
link add lslin.out filter.input
link add filter.out psd.input
link add psd.out eegpowerbands.psd
OPS

One buffer, three measures

An output slot feeds as many inputs as you cable to it. The frame travels over shared memory and every consumer reads the same one, so a kHz stream fanned out to three analyses is still one stream with three readers.

EegPlayback py
out
Buffer rs
input
out
LempelZiv py
data
complexity
SpectralEntropy py
data
entropy
Hjorth py
data
mobility
complexity

Buffer is there because each measure works on a window of samples, and one buffer in front of all three means they see the same window.

An audio voice

The audio plane, behind the same node interface. The pins are a different colour because AUDIO is a different data type, and which types may be cabled together is the manager's one link rule; see what feeds what.

Osc rs
out
Filter rs
input
out
Gain rs
input
out
AudioOut rs
input

AudioOut declares no output slot at all. It is a sink: it owns an OS handle and is compiled into the engine, which is why its page shows no source.

Crossing the planes

SignalIn takes an ARRAY and hands back AUDIO, so an analysis result can drive an audio chain. The rule also runs the other way without a node: an AUDIO output feeds an ARRAY input directly, which is what lets an audio chain end in a spectrum or a scope.

LFO rs
out
SignalIn rs
input
out
Filter rs
input
out
AudioOut rs
input

Params, and why there is no CV port

A param has one source at a time: a constant, an expression, or a reference to another value. Because only one is in force, there is no precedence rule between them.

# A param's source is one of three things, and never a precedence between them.
goofi node param edit psd max_frequency --value 10          # a constant
goofi node param edit svf cutoff --expression "200 + 400 * globals.arousal"
goofi node param edit gain level --reference "env.out"      # audio-rate, no CV port

That is why no audio node needs a control-voltage port: control-rate and audio-rate modulation arrive the same way, through the param a node already has.

This reference describes goofi 3.1.0(537cd394), generated from a running instance on 2026-09-06.