A practical, zero-fluff introduction for creative coders and curious beginners. Two projects. Real results.
Project 01 — Inputs & Outputs
Project 02 — Webcam → Audio FX
Difficulty — Beginner
// 00 — Before You Begin
The TouchDesigner Mental Model
TouchDesigner is a node-based programming environment. Instead of writing lines of code top-to-bottom, you connect boxes (nodes) together and data flows through the wires between them — left to right, always.
Download First
Get TouchDesigner free at derivative.ca/download. The free non-commercial licence is fully functional. Install, open, and you'll land in a blank network editor — that grid is your canvas.
The 6 Operator Families
Every node belongs to a family. The colour and suffix tell you what kind of data it carries.
🟠
Suffix: COMP
COMPs
Container/component nodes. The structural glue of your network — windows, panels, 3D objects.
🔵
Suffix: TOP
TOPs
Texture OPerators. Pixels, video, images, camera feeds, compositing — all GPU-accelerated.
🟢
Suffix: CHOP
CHOPs
Channel OPerators. Numbers over time — audio, sensor data, LFOs, mouse position, OSC.
🟡
Suffix: SOP
SOPs
Surface OPerators. 3D geometry, meshes, particles. Processed on the CPU.
🟣
MAT
MATs
Materials and shaders applied to 3D geometry. Controls how surfaces look under light.
🩷
Suffix: DAT
DATs
Data OPerators. Tables, text, Python scripts, XML, JSON — raw structured data.
Essential Shortcut
Double-click anywhere in the network editor to open the OP Create Dialog. Type the name of any operator and press Enter to place it. Wire nodes by dragging from the right output of one to the left input of another.
// Project 01
Inputs, Wires & Outputs — Making a Noise-Driven Visual
Your first network will feed a slider value into a noise generator, visualise it as a morphing texture, and output it to your screen. By the end you'll understand how data flows through a real patch.
// 01-A — Concept
What We're Building
A Slider (input) drives the speed and scale of an animated noise texture (process) which displays full-screen (output). Simple chain. Huge insight.
// Node Network — Project 01
CHOP
Slider
CHOP
Math
TOP
Noise
TOP
Level
COMP
Window
// 01-B — Step by Step
Build It Node by Node
01
Create a Slider CHOP
Double-click in the empty network to open the OP Create dialog. Type slider and hit Enter. A green Slider CHOP appears. This is your input — drag the slider handle to produce a number between 0 and 1.
02
Create a Math CHOP and connect it
Create a Math CHOP. Wire the Slider's right output into the Math CHOP's left input. In its parameters, set Range → From Range: 0 to 1, To Range: 0.1 to 5. This remaps the 0–1 slider to a more useful 0.1–5 speed range.
03
Create a Noise TOP
Create a Noise TOP. This generates animated procedural noise as a texture. In its parameters, find the Transform tab and locate the Translate X parameter field. Click the parameter name and select Export… — then link it to the Math CHOP's channel. The noise now scrolls at a speed controlled by your slider.
04
Add a Level TOP for contrast
Create a Level TOP and wire the Noise TOP into it. In Level's parameters, push Contrast to around 1.8 and Brightness to 0.1. This makes the noise punchier and more dramatic. Try creating a second Slider and wiring it to Level's Contrast — now you have two controllable inputs.
05
Output to a Window COMP
Create a Window COMP. Set its TOP parameter to point at your Level TOP (type its name or drag-drop it into the field). Press F6 or click Open in the Window's parameters to see your patch fullscreen. Move the slider — the noise scrolls faster.
Why does the export method matter?
TouchDesigner has two ways to connect CHOPs to TOP/SOP parameters: Exports (push data directly, evaluated every frame) and Expressions (Python one-liners you type into a parameter field). For this project, either works — but Exports are more visual and beginner-friendly. Expressions are more flexible once you're comfortable.
// 01-C — Going Further
Expressions: Python in Parameters
Instead of using Export, you can type a Python expression directly into any parameter field. Click any parameter value and press = to enter expression mode.
// Example expression in Noise TOP → Translate Xop('slider1')[0] * 5
// Oscillate using time — no input neededmath.sin(absTime.seconds * 2) * 3
// Reference another node's parameterop('level1').par.brightness.eval()
Pro Tip — Viewer Active
Clicking a node once selects it. Pressing V toggles Viewer Active on the selected node, so you can see its output preview in the node itself without opening a separate window.
Key Parameters to Explore in the Noise TOP
Parameter
What it does
Try this
Type
Algorithm: Sparse, Hermite, Alligator…
Cycle through all — each is a completely different feel
Period
Scale of the noise pattern
Drive with a second slider for zoom control
Translate
Animates the noise as it scrolls
This is the main motion driver
Monochrome
Grayscale vs colour noise
Toggle off for instant colour noise
Amplitude
Height of noise peaks (brightness)
Automate with a LFO CHOP for breathing effect
// Project 02
Webcam → Motion → Audio Effects
Feed a live webcam through a motion-detection pipeline, extract a single control value from the motion signal, and route it into audio effect parameters in real time. This is the foundation of generative AV performance.
// 02-A — Full Network Map
The Complete Signal Chain
Webcam pixels → motion detection → brightness reduction to a single number (CHOP) → routed to audio reverb and distortion parameters. Five operator families working together.
// Node Network — Project 02
TOP
Video Device In
TOP
Frame Diff
TOP
Threshold
CHOP
TOP to CHOP
CHOP
Math (smooth)
CHOP
Audio Filter
Audio Input
You'll also need an Audio Device In CHOP feeding into the Audio Filter CHOP (or Audio Reverb CHOP). The motion signal controls the parameters of the audio FX; the mic/line audio flows through the audio chain separately. The two chains only intersect via parameter expressions.
// 02-B — Step by Step
Build It Step by Step
01
Bring in your webcam — Video Device In TOP
Create a Video Device In TOP. In its parameters, set Device to your webcam (it usually auto-detects). You should see a live feed immediately. Set Resolution to something small like 640×480 — you don't need high resolution for motion detection and it'll run faster.
02
Detect motion — Frame Diff TOP
Create a Frame Diff TOP and wire the webcam into it. This subtracts the previous frame from the current frame — where there's movement, pixels are bright; where there's stillness, pixels are black. Move your hand in front of the camera to see it working.
03
Clean the signal — Threshold TOP
Create a Threshold TOP and wire the Frame Diff into it. Set the Threshold to around 0.1. This kills the camera noise — only real motion (above 10% brightness change) passes through as white. Adjust until small movements register but the image stays black when you're still.
04
Convert pixels to a number — TOP to CHOP
Create a TOP to CHOP and wire the Threshold TOP in. This converts the entire image into a single averaged channel value. In parameters, set Select to Average Pixels and Channel to r (red = brightness for grayscale). Now you have a single 0–1 number representing "how much motion is happening."
05
Smooth the value — Math CHOP with filter
Create a Math CHOP, wire the TOP to CHOP in, then add a Filter CHOP after it. In Filter's parameters, set Filter Width to around 0.5 seconds. Raw motion values jitter wildly — smoothing them gives your audio parameters silky, gradual movement instead of glitchy jumps.
06
Set up audio input — Audio Device In CHOP
Create an Audio Device In CHOP. Set Device to your microphone or audio interface. This brings live audio into TouchDesigner as a CHOP signal. You'll see the waveform updating in real time in the node preview.
07
Apply a Reverb effect — Audio Reverb CHOP
Create an Audio Reverb CHOP and wire the Audio Device In into it. Now click on the Room Size parameter, press = to enter expression mode, and type:
op('filter1')['r'] * 1.0
Replace filter1 with whatever your Filter CHOP is named. Now motion in front of your camera controls reverb size directly.
08
Add distortion — Audio Filter CHOP
Create an Audio Filter CHOP after the Reverb. Set Type to Low Pass. Now add an expression to the Cutoff Frequency parameter:
op('filter1')['r'] * 8000 + 200
When still: the filter cuts to 200 Hz (dark, muffled). When moving: it opens up to 8200 Hz (bright and full). Motion literally opens the sound.
09
Send audio out — Audio Device Out CHOP
Create an Audio Device Out CHOP at the end of your audio chain and wire your last audio effect into it. Set Device to your speakers or headphones. You should now hear your voice/audio with reverb and filtering controlled by your body moving in frame.
10
Visualise the control signal (optional but recommended)
Create a CHOP to TOP and wire your smoothed Filter CHOP into it. Then wire that into a Window COMP to display the motion graph as a scrolling waveform. This lets you see what you're hearing — essential for understanding and tuning your network.
// 02-C — Tuning Your Patch
Expression Reference
These expressions go into audio effect parameter fields (press = first). Swap filter1 with your actual CHOP node name.
// Reverb — Room Size — more motion = bigger spaceop('filter1')['r'] * 1.0
— range 0.0 to 1.0 = dry room to cathedral
// Audio Filter — Cutoff Frequency — motion opens the filterop('filter1')['r'] * 8000 + 200
— 200 Hz when still → 8200 Hz at peak motion
// Reverb — Wet/Dry Mix — inverted: stillness = wet1 - op('filter1')['r']
— 1.0 when still (100% reverb), 0.0 when moving (dry)
// Any parameter — scaled with a curve (exponential response)op('filter1')['r'] ** 2 * 5000
— small motions barely register; big motions = dramatic response
▸ If you hear no audio
Check your Audio Device In has the right mic selected
Check Audio Device Out has the right output
Look for a red node — hover it to read the error
Make sure the chain is continuous — no broken wires
Check system permissions allow mic access
▸ If motion isn't detected
Lower the Threshold TOP value (try 0.05)
Check lighting — flat light = less contrast = less detection
Increase Filter CHOP width to smooth out jitter
Preview the Frame Diff TOP to verify it's working
Make sure webcam resolution matches your TOP to CHOP settings
// 03 — Next Steps
Where to Go From Here
You now understand the core loop: input → process → output. Everything else in TouchDesigner is a variation on this. Here are logical next experiments.
Add OSC Input
Use an OSC In DAT to receive control signals from a phone app (TouchOSC) or other software over WiFi. Same concept — just a different input source.
Zone-Based Motion
Instead of averaging the whole frame, crop the webcam feed into regions with a Crop TOP. Each zone becomes a separate control channel — left hand vs right hand, top vs bottom.
Add Visuals
Route your motion CHOP into a Noise TOP (as in Project 01) alongside the audio. Now motion controls both the visuals and the sound simultaneously — a true AV instrument.
Record Your Output
Add a Movie File Out TOP at the end of your visual chain to record video. For audio, route Audio Device Out to a DAW via a virtual audio cable (BlackHole on Mac, VoiceMeeter on Windows).
Use a LFO CHOP
Replace or combine the motion signal with a LFO CHOP (Low Frequency Oscillator). Set its rate and shape to automate parameters rhythmically — hands-free movement.
Explore Audio Analysis
Try an Audio Spectrum CHOP → Analyze CHOP to extract frequency bands from audio. Feed bass into one parameter, treble into another — audio-reactive visuals.
Key Resourcesderivative.ca/learn — official tutorials and documentation facebook.com/groups/touchdesigner — active community, great for troubleshooting youtube: "The Interactive & Immersive HQ" — excellent structured beginner series youtube: "Elburz Sorkhabi" — deep-dives and advanced techniques