Bundles
A directory of nodes and the packages they import. Everything goofi ships is one, but three of them are the engines' own and the rest are optional packs.
node-bundles/eeg/
eeg_playback.py eeg_power_bands.py fooof.py lsl_in.py
requirements.txtEvery shipped bundle is built into goofi, so cargo run carries them all without a flag. A type is namespaced by
the plane it runs on, as signal:Psd or audio:Osc, which is why two
bundles can both hold a node called Gain without either shadowing the other.
--extra-nodes adds a root outside the repo the same way. It is a folder of node
files, scanned after the shipped bundles and before the open patch's own workspace. The
extension picks the engine: a .py is a signal node, a .wgsl a
graphics one, and a .rs names its own:
cargo run -- --extra-nodes ~/my-nodesA bundle with Python nodes names the packages they import in a requirements.txt. goofi-init installs every shipped bundle's
requirements, and at startup goofi checks every scanned root's against both interpreters. A terminal is asked before anything is installed, and without one the nodes
are unavailable: greyed in the palette and naming what is missing.
Core, and the rest
A bundle named after an engine is that engine's own node set: signal, audio and graphics today. Those are the core. They
carry no dependency you have to think about, and every clone has them.
The others are packs: nodes for one domain, gathered under a name. Most are
Python and lean on packages named in their requirements.txt, and a node in one
goes unavailable when those are missing and says which. simulation is the exception that shows what the split really is: it is Rust, so
it is always available, and it is still a pack because it is a domain rather than an
engine's own set. Core is what the engine is; a pack is what someone gathered on top of it.
| Bundle | Kind | Nodes | Written in |
|---|---|---|---|
audio | core | 17 | rust |
graphics | core | 27 | python + wgsl |
signal | core | 47 | python + rust |
biotuner | pack | 21 | python + rust |
complexity | pack | 10 | python |
computer-vision | pack | 4 | python |
eeg | pack | 8 | python |
harmonic-geometry | pack | 6 | python |
image | pack | 2 | python |
image-generation | pack | 1 | python |
ml | pack | 4 | python |
simulation | pack | 14 | rust |
Each name goes to that bundle in the node reference, where its nodes are listed with what they do.
Your own
--extra-nodes is repeatable, and a later root wins a type name it shares with an
earlier one. A patch's own workspace is scanned last of all, so a patch can always override
what it was given.