Pixels2GenAI
Path ii Continuum
M 10 · 10.1.1 · conceptual

10.1.1 Node Networks — The TouchDesigner Paradigm

Shift from sequential Python scripts to continuously-cooking node networks. Learn the four operator families (TOP, CHOP, SOP, DAT), the meaning of cooking, and why your NumPy mental model carries over almost unchanged.

Duration35–40 min
Levelintermediate
Load3 paradigm shifts
PrereqsModules 0-9 (NumPy fluency, image processing)

Big Question — what changes when your code never stops running?

For nine modules you have written Python scripts that execute once, top to bottom, and exit. To change a parameter you edit the source, save the file, and re-run. That round-trip — edit, save, run, wait — costs seconds at best and minutes for anything heavy. In a live performance, an interactive installation, or a VJ set, that workflow is unusable. TouchDesigner, Max/MSP, Unreal Blueprints, and the rest of the node-based visual programming family solve the problem by inverting the relationship between code and time: instead of writing a script that runs once, you wire up a network of nodes that runs continuously, sixty or more times per second, forever. Move a slider, the output updates the next frame. The shift is the most significant paradigm change in this module, and once you have internalised it, every later TouchDesigner concept follows naturally.

Side-by-side comparison: left shows a Python script with sequential numbered steps that runs once and stops; right shows a TouchDesigner node network with nodes connected by wires, with arrows indicating data continuously flowing through the network at 60+ fps
Fig. 1 Python (left) runs once, top to bottom, then stops. A TouchDesigner network (right) keeps every node alive — each node re-evaluates whenever its inputs change, and the system never halts.

The good news for someone arriving here from Modules 1-9: your NumPy knowledge transfers almost unchanged. A TouchDesigner image isn’t a np.ndarray, but you think of it the same way. A blur operator behaves like gaussian_filter. Connecting two nodes is like assigning the output of one function to the input of another. The new ideas are the operator-family categorisation, the meaning of cooking, and the dependency-driven evaluation model. This lesson walks through all three.

Learning objectives

  1. Articulate why node-based programming exists — what kind of problem it solves that sequential scripting does not.
  2. Name the four TouchDesigner operator families (TOP, CHOP, SOP, DAT) and the data type each handles.
  3. Define cooking and recognise that TouchDesigner uses pull-based evaluation along a DAG of dependencies.
  4. Build a 3-node, 5-node, and feedback-loop network in TouchDesigner — and recognise the feedback loop as a real-time reaction-diffusion system.

Part 1 — Two paradigms, side by side

A typical Python image pipeline runs as a recipe — load image, adjust brightness, blur, save:

python · python_pipeline.py
import numpy as np
from scipy.ndimage import gaussian_filter

noise = np.random.rand(512, 512)        # step 1
adjusted = noise * 0.5 + 0.25            # step 2
blurred = gaussian_filter(adjusted, sigma=2)  # step 3
save_image(blurred, 'output.png')        # step 4

The script executes once. To change the blur amount you edit the source, save, and re-run. The same pipeline in TouchDesigner is a chain of four operators wired together: Noise TOP → Level TOP → Blur TOP → Out TOP. Every frame, the network cooks: each operator re-reads its inputs, applies its operation, and outputs the result. The network never stops.

AspectPython scriptNode network
ExecutionRuns once, then stopsRuns continuously (60+ fps)
Changing parametersEdit code, save, re-runAdjust slider, instant update
Data flowVariables pass between linesWires connect outputs to inputs
Mental modelRecipe with stepsLiving, breathing system

The fundamental rule: nodes are functions that never stop running. Each node continuously watches its inputs; the moment something changes, it recalculates and pushes the new output downstream. The whole network is alive.

Part 2 — The four operator families

TouchDesigner organises every operator into one of four families, each handling a different kind of data. Knowing which family handles what is the difference between fumbling for the right node and reaching for it instinctively.

Four-quadrant diagram showing TouchDesigner operator families: TOP (purple) for images and textures in upper-left, CHOP (green) for numbers and channels in upper-right, SOP (light blue) for 3D geometry in lower-left, DAT (pink-purple) for text and tables in lower-right
Fig. 2 TouchDesigner's four operator families. Each family is colour-coded in the interface — purple TOPs, green CHOPs, light-blue SOPs, pink-purple DATs.

TOP — Texture Operators are pixel arrays. Think np.ndarray of shape (H, W, 4). Examples:

  • Noise TOP (procedural noise — your np.random and Perlin/Simplex from Module 6)
  • Level TOP (brightness, contrast, gamma — array arithmetic)
  • Blur TOP (Gaussian blur — gaussian_filter)
  • Composite TOP (combine multiple images — array stacking, alpha blending)
  • Null TOP (a pass-through reference point — like binding a name)

If you process images in TouchDesigner you live in TOPs. Your entire Modules 1-6 knowledge maps here.

CHOP — Channel Operators are 1D arrays of numbers that change over time. Audio, animation curves, parameter values:

  • LFO CHOP (sine, triangle, square — a continuous oscillator)
  • Math CHOP (arithmetic between channels)
  • Filter CHOP (smoothing)
  • Audio In CHOP (live microphone)
  • Timer CHOP (timing and sequencing)

CHOPs typically control parameters of other operators. An LFO CHOP driving a Blur TOP’s filter size produces a pulsing blur — no Python code required.

SOP — Surface Operators handle 3D geometry: vertices, edges, polygons. Sphere SOP makes a sphere, Transform SOP moves it, Particle SOP runs a particle system. Module 10.2 explores SOPs when you recreate Boids and N-body simulations in TD.

DAT — Data Operators handle text, tables, and Python scripts. The most important DAT for this module is Script DAT, which is where your Python lives. Table DAT stores spreadsheet-like data. Web DAT fetches URL content. DATs are the bridge between TouchDesigner and the outside world.

Part 3 — Cooking: continuous, pull-based, dependency-ordered

When a TouchDesigner node “cooks”, it re-reads its inputs, applies its operation, and produces an output. Cooking happens continuously — typically 60 times per second — and the framework calls this the cook rate. Three properties of cooking matter:

1. Pull-based. A node only cooks if someone downstream cares about its output: a viewer is showing it, a parameter is referencing it, or another node has wired into it. Unused branches consume nothing. This is critical for performance — you can leave a hundred dormant nodes on the canvas and they cost effectively zero.

2. Dependency-ordered. A node cannot cook until all its inputs have cooked. The whole network is a DAG (directed acyclic graph) of dependencies; source nodes (no inputs) cook first, processing nodes follow, output nodes cook last. The framework topological-sorts the DAG every frame automatically.

Diagram of a TouchDesigner data flow with arrows showing numbered cooking order — source nodes (Noise) labelled 1, processing nodes (Level, Blur) labelled 2-3, and output nodes (Composite, Out) labelled 4-5. A CHOP feeds a parameter to a TOP via a parameter export.
Fig. 3 Data flows continuously through the network. Numbers indicate cooking order — source nodes cook first, then downstream nodes follow. CHOPs can drive TOP parameters via *parameter exports* (the dotted line).

3. Automatic propagation. When a parameter changes, the change cascades through every downstream node — within a single frame for any reasonable network. In Python you would write:

parameter = 0.5
result = image * parameter     # calculated ONCE
parameter = 0.8                # changed
# 'result' is STILL the old value — Python doesn't re-run

In TouchDesigner, the equivalent wire-and-node setup is the recalculation:

Math CHOP (outputs 0.5) → Level TOP (uses 0.5 for brightness)
Change Math CHOP to 0.8 → Level TOP IMMEDIATELY shows 0.8 brightness

There is no result = ... to refresh because the wire is the dependency.

Synthesis project — three exercises, increasing in complexity

Three hands-on TouchDesigner exercises in Execute → Modify → Create order. The complete .toe file is included as a download; open it in TouchDesigner to see the finished network for all three.

exercise-1-2-3-soultions.toe — TouchDesigner project file (all three exercises)
EXECUTE I.

The 3-node glowing orb

Goal: produce a soft glowing pink orb using only Circle TOP → Blur TOP → Null TOP.

A soft pink glowing orb on a black background
Fig. 4 The output of Exercise 1 — a 3-node chain produces this glow effect without writing a single line of code.

Steps

  1. Open TouchDesigner. Press Tab → TOP → Circle. Set radius 0.3, fill colour (0.95, 0.50, 1.0).
  2. Tab → TOP → Blur. Wire Circle → Blur. Set Filter Size 50.
  3. Tab → TOP → Null. Wire Blur → Null. (Null is a reference point.)
The 3-node network in the TouchDesigner editor — Circle TOP on left, wired to Blur TOP, wired to Null TOP
Fig. 5 The 3-node network as it appears in TouchDesigner.
MODIFY II.

Animated colour flow (5 nodes)

Goal: an animated, hue-cycling noise pattern through Noise → Level → HSV Adjust → Blur → Null. The colour cycle is driven by a built-in time variable, not by a separate Python script.

Animated colorful noise pattern with hue smoothly cycling through the spectrum
Fig. 6 Output of Exercise 2 — the hue cycles continuously, driven by the parameter expression `absTime.seconds * 0.1`.

Key step — at the HSV Adjust TOP, instead of typing a constant Hue Offset, write an expression. Right-click the Hue Offset field, choose Expression, enter:

absTime.seconds * 0.1

absTime.seconds is a built-in variable holding the elapsed clock time. Multiplying by 0.1 means one full rotation through the hue circle takes roughly 36 seconds. Try * 0.5 for faster cycling, * 0.05 for meditative.

The 5-node network: Noise TOP, Level TOP, HSV Adjust TOP, Blur TOP, Null TOP wired in a chain
Fig. 7 The 5-node chain. The animation comes entirely from one parameter expression on the HSV Adjust node.

What changed conceptually: you now have animation without a script. The expression is evaluated every frame; the hue offset updates every frame; the network re-cooks every frame. Time-based behaviour is a one-line parameter expression in TD, where in Python it would require a loop with time.sleep() or a frame counter.

CREATE III.

Cellular feedback (10 nodes)

Goal: a self-organising cellular pattern produced by a feedback loop. The network feeds its own output back into itself, creating temporal recursion: each frame depends on the previous one. The result is reaction-diffusion in node form.

The complete 10-node network with a feedback loop visible: Feedback TOP receives the output of an Add TOP downstream, completing a cycle
Fig. 8 The 10-node feedback network. Watch the loop: Add → Feedback (which stores the previous frame) → LumaBlur and Level (branching) → Subtract → Math → Add (loop closes).

The architecture has three regions:

  • Source: a Noise TOP that gives the loop a starting seed.
  • Edge-detection branch: LumaBlur → Blur → Subtract produces a difference-of-Gaussians edge map.
  • Feedback core: Math amplifies edges, Level dampens the recirculated signal, Add combines them, Feedback stores the result for next frame’s input.

The key TD-specific operator: Feedback TOP, with Target TOP parameter set to add1. Feedback continuously reads the output of add1 and stores it as its own output for one frame, completing the loop.

Why does this produce cells? Local activation (edge amplification by Math) plus lateral inhibition (dampening by Level and blur) plus temporal recursion equals Turing’s reaction-diffusion mechanism from 1952 — see lesson 5.4.4 Turing Patterns for the chemistry version. You have just built a real-time analogue computer for morphogenesis using ten node graphs and zero Python.

Summary

Common pitfalls to avoid

  • Thinking in “run once” mode. TD networks never stop; if something looks wrong, look at the current network state, not at “running it again.”
  • Cross-family wiring. Connecting a TOP to a CHOP input fails — different data types. The colour code is your safety net.
  • Over-complicating early networks. A 3-node chain is enough to understand the paradigm; add complexity only when it earns its keep.
  • Treating parameter expressions like Python. Expressions are evaluated each frame in TD’s expression language, which is similar to Python but not identical (no imports, no statements — only expressions).
  • Forgetting the Null TOP at the end of every chain. It is a reference point that downstream nodes can wire into without modifying the upstream signal — invaluable for editing without breaking dependencies.

References

  1. [1] Burnett, M. M., & Baker, M. J. (1994). A classification system for visual programming languages. Journal of Visual Languages and Computing, 5(3), 287–300.
  2. [2] Derivative Inc. (2024). TouchDesigner Documentation. derivative.ca/UserGuide
  3. [3] Green, T. R. G., & Petre, M. (1996). Usability analysis of visual programming environments: A ‘cognitive dimensions’ framework. Journal of Visual Languages and Computing, 7(2), 131–174.
  4. [4] Reas, C., & Fry, B. (2014). Processing: A Programming Handbook for Visual Designers and Artists (2nd ed.). MIT Press.
  5. [5] Shneiderman, B. (1983). Direct manipulation: A step beyond programming languages. Computer, 16(8), 57–69.
  6. [6] Turing, A. M. (1952). The chemical basis of morphogenesis. Philosophical Transactions of the Royal Society B, 237(641), 37–72. (Exercise 3’s feedback loop is a real-time analog of Turing patterns.)
  7. [7] Hils, D. D. (1992). Visual languages and computing survey: Data flow visual programming languages. Journal of Visual Languages and Computing, 3(1), 69–101.