goofi v3.0.0

Harmonic Geometry

Turn harmonic ratios into curves, fields, textures, and sound. Meet the nodes, then explore eight ready-to-open patches.

A harmonic trace rendered by Goofi

Start with a chord and see what it can become. Keep the tuning fixed while you explore a shape, or send one changing chord to several views at once. The images below are rendered node outputs.

Start here

Enable the EEG, Biotuner, and Harmonic Geometry bundles. GPU views need the graphics engine.

Open a downloaded .gfi file with Goofi’s patch controls. The Explore tab shows the patch, its viewers, and shared controls together. Point to the canvas and press F to fit the graph.

Start with Breathing lines. Move mix to choose a harmonic state; auto adds motion around that choice. CycleSeconds sets the pace—smaller values move faster. In recipe 03, mix instead blends plate patterns with open waves. Recipe 05 has a mix bus ready for AudioOut.

Recipes 02, 03, 04, and 09 use prerecorded EEG. Biotuner turns its peaks into harmonic ratios; relative alpha power adds visual modulation. For a quick response, try Response at 0.25 seconds. For a slow drift, try CycleSeconds at 45–90 and Response at 3–8 seconds. CycleSeconds controls automatic motion; Response smooths the EEG changes. Adjust EEGDepth to change their strength. Allow two seconds for analysis to start and the selected smoothing window to fill.

Start with recipe 01 ↓ Bundle setup →

Meet the nodes

Twelve nodes belong to Harmonic Geometry. Three companions from Biotuner supply changing ratios and voice controls. Each illustration shows the node’s input and output ports; open its documentation for parameter details.

01 / SIGNAL
HarmonicGeometry py
input
geometry

Turn a chord into a shape

Try it. Keep the chord still and change geometry/method. Compare a trace, a graph, and a field to see how each uses the same intervals.

Good to know

The output is geometry data, not an image. Use GeometryView or GeometryRender to see it. Discrete methods can change suddenly as ratios move.

Inputs: input: ARRAY

Outputs: geometry: ARRAY

02 / SIGNAL
HarmonicModes py
input
target
transition
mix
modes
mapping

Map a chord to plate patterns

Try it. Change the chord in recipe 02, then raise detail to allow higher plate modes. Smooth softens the changes between mapped patterns.

Good to know

Fractional mode coordinates make a smooth visual transition; they are not integer eigenmodes of the original plate.

Inputs: input: ARRAY · target: ARRAY · transition: ARRAY · mix: ARRAY

Outputs: modes: ARRAY · mapping: STRING

03 / SIGNAL
HarmonicTransport py
input
geometry

Let a field guide grains and motion

Try it. Change transport/affinity from positive to negative. Compare where the grains collect, then explore the flow used by HarmonicFlow.

Good to know

Equilibrium grains are freshly sampled positions. Persistent motion comes from the Flow shader, not particle tracking in this node.

Inputs: input: ARRAY

Outputs: geometry: ARRAY

04 / SIGNAL
GeometryBlend py
a
b
mix
geometry

Move between two finished shapes

Try it. Keep both endpoints still and move blend/mix. Compare a field crossfade with the vertex blend in Knot to knot.

Good to know

Meshes need matching faces. Curves are resampled; field domain mode needs matching grids. A smooth blend can still create intersections.

Inputs: a: ARRAY · b: ARRAY · mix: ARRAY

Outputs: geometry: ARRAY

05 / SIGNAL
GeometryMetrics py
input
values

Measure the shape you are seeing

Try it. Open a viewer on the measurements and change the geometry method. Compare which measurements are available for each kind of shape.

Good to know

Undefined measurements remain NaN. A missing value is not zero, and not every measurement applies to every method.

Inputs: input: ARRAY

Outputs: values: ARRAY

06 / SIGNAL
GeometryView py
input
harmonic
metrics
palette
image

See geometry with its context

Try it. Switch display/layout between a labeled dashboard and a transparent image. Keep camera/autofit off when comparing changes in amplitude.

Good to know

This is a rendered image. Keep the original geometry array for coordinates, fields, or later measurements.

Inputs: input: ARRAY · harmonic: ARRAY · metrics: ARRAY · palette: ARRAY

Outputs: image: ARRAY

07 / GRAPHICS
GeometryRender wgsl
geometry
out

Draw geometry directly on the GPU

Try it. Adjust ink/thickness and view/radius to inspect a curve or mesh at a fixed scale.

Good to know

Reads the indexed geometry array directly. It provides a visual rendering, while the original array retains the geometry data.

Inputs: geometry: ARRAY

Outputs: out: TEXTURE

08 / GRAPHICS
HarmonicLissajous wgsl
harmonics
out

Draw three components as a moving trace

Try it. Hold the tuning still and change camera/yaw. Then change trace/duration to compare short and long exposures.

Good to know

Only three selected components drive the axes. Higher frequencies or longer exposures need more samples to remain clear.

Inputs: harmonics: ARRAY

Outputs: out: TEXTURE

09 / GRAPHICS
HarmonicChladni wgsl
modes
harmonics
out

Explore plates and interference

Try it. Move field/approach from 0 to 1 to travel from a plate pattern toward open directional waves.

Good to know

Signed displacement and prepared density are different outputs. Choose the matching input interpretation in the next rendering node.

Inputs: modes: ARRAY · harmonics: ARRAY

Outputs: out: TEXTURE

10 / GRAPHICS
HarmonicInk wgsl
input
geometry
palette
out

Read the same field in different ways

Try it. Change ink/style to compare signed displacement, magnitude, nodal lines, and contours. The field stays the same while its appearance changes.

Good to know

Keep ink/range fixed when comparing field strength. Coverage alpha preserves masked areas instead of painting them as solid corners.

Inputs: input: TEXTURE · geometry: ARRAY · palette: ARRAY

Outputs: out: TEXTURE

11 / GRAPHICS
HarmonicRelief wgsl
input
geometry
out

Give a field a material surface

Try it. Choose material/texture_a and texture_b, then move texture_mix. Try lighting and depth separately from the chord controls.

Good to know

Material texture changes the rendering, not the source ratios. Match form/input_kind to signed field or prepared density.

Inputs: input: TEXTURE · geometry: ARRAY

Outputs: out: TEXTURE

12 / GRAPHICS
HarmonicFlow wgsl
flow
out

Give the picture a memory

Try it. Set motion/rate to 0 to freeze the ink. Use seed/reset to reseed it, then release reset and raise the rate to resume.

Good to know

This shader stores state between frames. With seed/injection at 0, diffusion can gradually smooth away the texture.

Inputs: flow: ARRAY

Outputs: out: TEXTURE

13 / SIGNAL · BIOTUNER
RatioSequence py
clock
transition

Move through a list of ratios

Try it. Change sequence/seconds to slow the journey. Adjust sequence/glide to spend more or less time moving between steps.

Good to know

This Biotuner companion sends paired endpoints and transition metadata. Feed its transition to both HarmonicMorph and HarmonicModes for coordinated motion.

Inputs: clock: ARRAY

Outputs: transition: ARRAY

14 / SIGNAL · BIOTUNER
HarmonicMorph py
a
b
ampsA
ampsB
phasesA
phasesB
mix
transition
harmonic

Share one changing chord across media

Try it. Enter two ratio lists in source/ratios_a and ratios_b, then move morph/mix. Branch harmonic to geometry, shaders, and voices.

Good to know

Pairs components by sorted rank rather than tracking individual peaks. Wired empty inputs mean silence; amplitude arrays must belong to the same components.

Inputs: a: ARRAY · b: ARRAY · ampsA: ARRAY · ampsB: ARRAY · phasesA: ARRAY · phasesB: ARRAY · mix: ARRAY · transition: ARRAY

Outputs: harmonic: ARRAY

15 / SIGNAL · BIOTUNER
HarmonicVoices py
input
pitch
gain

Let the same chord become sound

Try it. Follow the pitch and gain columns into the native voices in recipe 05. Change sound/level to adjust the shared voice level.

Good to know

This Biotuner companion emits control arrays, not an audio waveform. Recipe 05 ends at a stereo mix bus; connect AudioOut and start at a low level to listen.

Inputs: input: ARRAY

Outputs: pitch: ARRAY · gain: ARRAY

Eight patch recipes

RECIPE 01

Breathing lines

Breathing lines — rendered node output

Start with auto on. Major and minor harmonic structures move through a fixed exposure. Turn auto off, then move mix slowly. Change phase while mix stays still: the tuning is unchanged, but the drawing turns inside itself.

Download patch

HarmonicMorph → HarmonicGeometry → GeometryView · HarmonicMorph → HarmonicLissajous

Follow this route in the patch panel while watching the viewers alongside it.

ControlWhat to explore
autoAdd motion around the mix you choose.
mixBalance the harmonic states. This slider stays active during automatic motion; the endpoints select either state.
CycleSecondsSeconds per automatic motion cycle (2–120). Try 8 for lively motion or 45–90 for a slow drift. This does not slow the EEG itself.
formCompare lateral, rotary, and 3D harmonographs. Compound closes over a frequency-dependent horizon and can change when its smallest component changes.
dampingAdjust this aspect while keeping the other controls fixed.
phaseAdjust this aspect while keeping the other controls fixed.
stretchAdjust this aspect while keeping the other controls fixed.
yawAdjust this aspect while keeping the other controls fixed.

Nodes: GeometryRenderHarmonicLissajousGeometryViewHarmonicGeometryHarmonicMorph

Illustrated notes and patch screenshot →

RECIPE 02

Plate mode walk

Plate mode walk — rendered node output

Let recorded EEG reshape a plate pattern. Biotuner extracts harmonic peaks; short smoothing makes the visual transition fluid.

Download patch

EegPlayback → Select → Buffer → Peaks → Tuning → HarmonicMorph → HarmonicModes → Smooth → HarmonicChladni → HarmonicInk

Follow this route in the patch panel while watching the viewers alongside it.

ControlWhat to explore
autoAdd motion around the mix you choose.
mixBalance the harmonic states. This slider stays active during automatic motion; the endpoints select either state.
CycleSecondsSeconds per automatic motion cycle (2–120). Try 8 for lively motion or 45–90 for a slow drift. This does not slow the EEG itself.
ChannelChannel in the prerecorded EEG. Try O1, O2, or Pz.
EEGDepthStrength of the EEG modulation. Set 0 to compare the picture without that motion.
ResponseEEG smoothing window in seconds (0.05–20). Try 0.25 for a quick response or 3–8 for gentler changes. Longer windows soften movement and add delay; allow the window to fill.
approach0 draws plate modes. 1 draws open waves from the harmonic frame.
detailMaximum mode number. Raise it for finer plate patterns; lower it for broad shapes.
lineWidthChanges the visible zero-displacement band, without changing the field.
symmetryMoves between a cosine product and an antisymmetric swapped-axis form.

Nodes: HarmonicChladniHarmonicInkHarmonicModesHarmonicMorph

Illustrated notes and patch screenshot →

RECIPE 03

Between media

Between media — rendered node output

Move between standing plate patterns and open waves. Recorded EEG changes the tuning, phase, and wave spacing while you choose the balance.

Download patch

EegPlayback → Select → Buffer → Peaks → Tuning → HarmonicMorph → HarmonicModes → Smooth → HarmonicChladni → HarmonicInk

Follow this route in the patch panel while watching the viewers alongside it.

ControlWhat to explore
autoAdd motion around the mix you choose.
mixStanding plate patterns at 0, open interference waves at 1. Try both ends, then blend them.
CycleSecondsSeconds per automatic motion cycle (2–120). Try 8 for lively motion or 45–90 for a slow drift. This does not slow the EEG itself.
ChannelChannel in the prerecorded EEG. Try O1, O2, or Pz.
EEGDepthStrength of the EEG modulation. Set 0 to compare the picture without that motion.
ResponseEEG smoothing window in seconds (0.05–20). Try 0.25 for a quick response or 3–8 for gentler changes. Longer windows soften movement and add delay; allow the window to fill.
periodSpacing of the open waves. Smaller values pack more detail into the picture.
styleCompare fine nodal lines, signed waves, and contours.

Nodes: HarmonicChladniHarmonicInkHarmonicModesHarmonicMorph

Illustrated notes and patch screenshot →

RECIPE 04

Sand and memory

Sand and memory — rendered node output

Watch recorded EEG reshape a field of sand and carry persistent ink through it. Compare the instantaneous field with the memory left by motion.

Download patch

EegPlayback → Select → Buffer → Peaks → Tuning → HarmonicMorph → Smooth → HarmonicGeometry → HarmonicTransport → HarmonicFlow → HarmonicInk

Follow this route in the patch panel while watching the viewers alongside it.

ControlWhat to explore
autoAdd motion around the mix you choose.
mixBalance the harmonic states. This slider stays active during automatic motion; the endpoints select either state.
CycleSecondsSeconds per automatic motion cycle (2–120). Try 8 for lively motion or 45–90 for a slow drift. This does not slow the EEG itself.
ChannelChannel in the prerecorded EEG. Try O1, O2, or Pz.
EEGDepthStrength of the EEG modulation. Set 0 to compare the picture without that motion.
ResponseEEG smoothing window in seconds (0.05–20). Try 0.25 for a quick response or 3–8 for gentler changes. Longer windows soften movement and add delay; allow the window to fill.
periodScale of the currents. Compare wide swirls with fine eddies.
affinityPositive collects sand near nodes; negative moves it toward antinodes.
temperatureSpread of the sand. Low values make tighter structures.
flowMixCurl (0) circulates around the field; gradient (1) moves across it.
rateInk motion speed. Try 0.05–0.2 for a slow drift or 1–2 for active currents. Zero freezes the flow.
travelDistance travelled per frame. Raise it for more visible flow.
memoryHow long the previous ink pattern influences the motion.
injectionFresh grain added to the ink. A little keeps detail alive during long runs.
inkStyleContours reveal small movements in the ink; magnitude gives a softer wash.
resetTurn on to reseed the ink, then off to let it flow.

Nodes: HarmonicFlowHarmonicInkGeometryViewHarmonicGeometryHarmonicMorphHarmonicTransport

Illustrated notes and patch screenshot →

RECIPE 05

Knot to knot

Knot to knot — rendered node output

Two rational harmonic knots are built at the same sample count and tube-side count. GeometryBlend moves each vertex to its partner. The triangle list stays fixed. This avoids remapping knot winding numbers on every intermediate tuning.

Download patch

Two HarmonicGeometry meshes → GeometryBlend → GeometryView · same chord endpoints → HarmonicVoices → Osc → Gain → Mixdown

Follow this route in the patch panel while watching the viewers alongside it.

ControlWhat to explore
autoAdd motion around the mix you choose.
mixBalance the harmonic states. This slider stays active during automatic motion; the endpoints select either state.
CycleSecondsSeconds per automatic motion cycle (2–120). Try 8 for lively motion or 45–90 for a slow drift. This does not slow the EEG itself.
yawTurn the camera around the knot in Custom view.
radiusThickness of both knot tubes. Thin tubes make the crossings easier to follow.
viewChoose perspective, front, lateral, or top. Custom uses the yaw and pitch controls.
pitchTilt the camera in Custom view.
zoomZoom in to see crossings or out to see the whole knot.
perspectiveSet depth perspective. Zero gives a flat projection; try it with Top or Lateral.
chordARatios for the first knot and chord. Keep three low-order ratios to retain a clear shape.
chordBRatios for the second knot and chord. Mix follows the same endpoints for shape and sound.
extensionExtra harmonics in the sound; leaves the endpoint meshes unchanged.
levelLevel of the shared sound voices. Connect Mixdown.out to AudioOut to listen.
transposeSound transposition in octaves.
toneChoose sine, triangle, or sawtooth oscillators.

Nodes: GeometryBlendGeometryViewHarmonicGeometryHarmonicMorphHarmonicVoices

Illustrated notes and patch screenshot →

RECIPE 06

Interval garden

Interval garden — rendered node output

Two seven-degree tunings drive a family of interval and recursive drawings. The same scale feeds BioColors and EuclidRhythm. Change form while holding the chord still to compare how each method uses the intervals.

Download patch

HarmonicMorph → HarmonicGeometry → GeometryView · EuclidRhythm → RhythmPlayer → RhythmView

Follow this route in the patch panel while watching the viewers alongside it.

ControlWhat to explore
autoAdd motion around the mix you choose.
mixBalance the harmonic states. This slider stays active during automatic motion; the endpoints select either state.
CycleSecondsSeconds per automatic motion cycle (2–120). Try 8 for lively motion or 45–90 for a slow drift. This does not slow the EEG itself.
formChoose chord or interval graphs, tuning points, times tables, seeded IFS, subharmonic trees, recursive polygons, or pitch lattices.
colorChoose a color mapping for the geometry.
depthRecursion depth for IFS, trees, and recursive polygons. Higher values add branches.
orderPolygon sides and structural order for methods that use them. This does not affect every form.
zoomFrame the whole garden or inspect its center.
lineWidthThickness of graph edges and curves.
pointSizeSize of graph vertices and point clouds.
rhythmModeNormal uses each interval; full also includes its inverse.
rhythmDetailMaximum denominator used to approximate intervals. Higher values make longer patterns.
tempoPlayback speed in beats per minute. One grid step per beat.
playRhythmsPause the playhead while inspecting the colored onset lanes.

Nodes: GeometryMetricsGeometryViewHarmonicGeometryHarmonicMorph

Illustrated notes and patch screenshot →

RECIPE 09

Jade resonance

Jade resonance — rendered node output

Give an EEG-driven harmonic field a carved material surface. Explore depth, symmetry, and the blend of two textures.

Download patch

EegPlayback → Select → Buffer → Peaks → Tuning → HarmonicMorph → HarmonicModes → Smooth → HarmonicChladni → HarmonicRelief

Follow this route in the patch panel while watching the viewers alongside it.

ControlWhat to explore
autoAdd motion around the mix you choose.
mixBalance the harmonic states. This slider stays active during automatic motion; the endpoints select either state.
CycleSecondsSeconds per automatic motion cycle (2–120). Try 8 for lively motion or 45–90 for a slow drift. This does not slow the EEG itself.
ChannelChannel in the prerecorded EEG. Try O1, O2, or Pz.
EEGDepthStrength of the EEG modulation. Set 0 to compare the picture without that motion.
ResponseEEG smoothing window in seconds (0.05–20). Try 0.25 for a quick response or 3–8 for gentler changes. Longer windows soften movement and add delay; allow the window to fill.
textureAFirst surface material. Compare jade, silk, and stone.
textureBSecond surface material. Blend it into the first with textureMix.
textureMixBlend the two materials. Either endpoint holds one material; auto adds motion around an intermediate blend.
goldSeamAdjust this aspect while keeping the other controls fixed.
patinaAdjust this aspect while keeping the other controls fixed.
reliefAdjust this aspect while keeping the other controls fixed.
symmetryAdjust this aspect while keeping the other controls fixed.

Nodes: HarmonicChladniHarmonicInkHarmonicReliefHarmonicModesHarmonicMorph

Illustrated notes and patch screenshot →

RECIPE 10

Living ratios

Living ratios — rendered node output

Each ratio replaces one voice in an anchor chord. HarmonicModes uses Biotuner chord_to_int_modes and the pairwise builder to map the complete endpoint chords. Fixed mode frequencies keep the plate still while their weights blend. The field node then applies exp(-w²/σ²) and the notebook’s D4 maximum over density. Both endpoints and the blend travel together. The default takes four seconds per transition. Texture motion starts off; nodalLines shows the same density without surface detail.

Download patch

RatioSequence → HarmonicMorph + HarmonicModes → HarmonicChladni → HarmonicRelief

Follow this route in the patch panel while watching the viewers alongside it.

ControlWhat to explore
runningAdjust this aspect while keeping the other controls fixed.
stepSecondsSeconds per ratio step (0.5–60). Try 15–30 with Glide near 1 for long, flowing transitions.
glideAdjust this aspect while keeping the other controls fixed.
textureAAdjust this aspect while keeping the other controls fixed.
textureBAdjust this aspect while keeping the other controls fixed.
textureMixBalance the two surface materials. Either end keeps one material; the middle adds a gentle blend.
bandWidthAdjust this aspect while keeping the other controls fixed.
densityAdjust this aspect while keeping the other controls fixed.

Nodes: HarmonicChladniHarmonicInkHarmonicReliefHarmonicModesHarmonicMorphRatioSequence

Illustrated notes and patch screenshot →

Working practice

Separate the chord, shape, and view

Changing ratios changes the source. Rotating the camera changes your view. Changing a material changes its appearance. Keep those controls separate so you can see what caused a difference. Use a fixed camera scale and field range when comparing amplitude changes.

Choose what should stay continuous

Use HarmonicMorph for components, HarmonicModes for plate coordinates, and GeometryBlend for compatible curves, fields, or meshes. Graph membership and topology can change abruptly. When shapes have unrelated topology, render both and crossfade their images. Compare the transition methods →

Start at preview resolution

The patches start with compact 384 × 384 image views and lighter geometry grids. Increase one resolution at a time. Keep the original geometry array when you need coordinates or measurements; record the rendered image when you want its appearance.

Read the illustrated cookbook → for the searchable atlas of 46 methods, material studies, and detailed working notes.

Sources and survey · All cookbooks