Your First Installation
Combine audio analysis, 3D geometry, colour grading, and full-screen output into one complete real-time installation.
This tutorial is the capstone of the beginner series. You will build a complete, self-contained installation — audio input driving a 3D geometry field, colour-graded and output to a full-screen display — using everything covered in the previous nine articles. At the end, you will have a project file you could put in a gallery tomorrow.
Project Architecture
Before placing a single operator, plan the architecture. This installation has four subsystems:
- Audio Analysis: Live microphone input → spectrum analysis → bass, mid, and treble channels.
- 3D Geometry: Grid SOP displaced by audio → Render TOP producing a lit 3D texture.
- Colour Grade and Composite: Level TOP, HSV Adjust TOP, final output Null TOP.
- Output and UI: Window COMP for the external display, Perform COMP with a minimal operator interface.
Keep each subsystem in its own Base COMP. Name them audio_analysis, scene_3d, color_grade, and ui_output. This organisation means you can open any Base COMP, see exactly what it does, and make changes without hunting through a flat network of two hundred operators.
Step 1: Audio Analysis Base COMP
Enter the audio_analysis Base COMP and build:
- Audio Device In CHOP — Select your microphone input. Set Multi-Channel Off (mono is fine for spectrum analysis).
- Audio Dynamics CHOP — Threshold –18 dB, Ratio 4:1, Attack 5 ms, Release 150 ms. This normalises the dynamic range.
- Audio Spectrum CHOP — FFT Size 512, Window Hann, Smooth 0.9. This generates the frequency spectrum.
- Select CHOP (bass) — Channels
chan0tochan5. Follow with a Math CHOP set to Combine Channels: Mean, Range From 0/0.35 To 0/1, Clamp On. Rename output channelbass. - Select CHOP (mid) — Channels
chan10tochan30. Same Math CHOP treatment. Channel namemid. - Select CHOP (treble) — Channels
chan50tochan120. Same treatment. Channel nametreble. - Beat CHOP connected to the Audio Device In CHOP. Trigger CHOP after it: Attack 0.001, Release 0.35. Channel name
kick. - Merge CHOP — Combine bass, mid, treble, and kick into a single CHOP for easy export. Add a Null CHOP named
OUT.
From outside the Base COMP, all audio data is available from op('audio_analysis').op('OUT').
Step 2: 3D Scene Base COMP
Enter the scene_3d Base COMP. Build the SOP chain inside a Geo COMP named terrain:
- Grid SOP — Size 6 / 6, Rows 100, Columns 100. A high-resolution plane.
- Noise SOP — Amplitude expression:
op('/audio_analysis/OUT')['bass'] * 1.2 + 0.05. Period 0.5. Translate Z (time offset):absTime.seconds * 0.12. This makes the terrain breathe with the bass.
Assign a Phong MAT to the Geo COMP. Set Diffuse Colour to a deep indigo (0.07, 0.04, 0.2) and Specular Colour to white with Shininess 80.
Back in the scene_3d Base COMP, outside the Geo COMP:
- Camera COMP — Translate (0, 3, –7), Rotate X –25. Perspective, FOV 50.
- Light COMP (key) — Directional, Rotate X –40, Rotate Y 20. Diffuse a cool white (0.8, 0.85, 1.0).
- Light COMP (fill) — Ambient. Diffuse a dark warm tone (0.1, 0.06, 0.04). Prevents pure black shadows.
- Render TOP — Camera
camera1, Render list includesterrain. Background Colour (0.02, 0.01, 0.05). Multisample 4×. Resolution 1920×1080. - Null TOP named
OUT.
The Noise SOP amplitude is now driven live from the audio bass channel. On bass hits, the grid erupts into peaks; in quiet passages, it relaxes to near-flat.
Step 3: Colour Grade Base COMP
Enter color_grade. Connect the 3D scene output as input:
- At the start of the network, place a Null TOP named
IN. In the parent network, wireop('scene_3d').op('OUT')into this Null TOP’s first input. (In practice you wire the two Base COMPs together from the outside — the Null TOPs are your clean interface points.) - Level TOP — Brightness expression:
0.85 + op('/audio_analysis/OUT')['kick'] * 0.3. On beat, the image brightens. Input Black 0.05 to clip near-black noise. - HSV Adjust TOP — Hue Shift expression:
op('/audio_analysis/OUT')['mid'] * 0.25 + absTime.seconds * 0.02. Hue rotates slowly over time and jumps with midrange energy. Saturation expression:0.6 + op('/audio_analysis/OUT')['treble'] * 0.5. Treble lifts colour vividness. - Blur TOP — Filter Size 0. Leave here as a toggle point: you can crank Filter Size to 8 for a softer, dreamier look during quieter sections of audio.
- Null TOP named
OUT.
Step 4: UI and Output Base COMP
Enter ui_output. This Base COMP handles the Perform COMP interface and the Window COMP.
- Place a Null TOP named
IN(receives the colour-graded output from outside). - Window COMP — Input:
IN. Monitor 1 (your external display). Full Screen On. Borders Off. Open On. - Perform COMP — Contents: a Container COMP you build inside with:
- A Button COMP labelled “Mute Audio” that toggles the Audio Device In CHOP’s Active parameter.
- A Slider COMP labelled “Brightness” that drives a Constant CHOP exported to the Level TOP’s Brightness parameter.
- A Text COMP showing the current frame rate, using the expression
str(round(me.time.perf.cookFPS)) + ' fps'.
The Perform COMP interface is only visible to the operator in Perform Mode, not on the external output Window COMP — they are separate outputs.
Making It Robust
Robustness is what separates a demonstration from an installation you can leave running for eight hours:
Null TOPs at every subsystem boundary: The Null TOPs named IN and OUT in each Base COMP are the connection points. If you need to rewire, the Null TOPs never change name — only the single wire into the Null TOP changes. Nothing downstream breaks.
Name every operator: TD defaults to names like blur3 and math7. Rename to blur_glow, math_bass_remap. When something breaks at 2 AM before a show, readable names save you.
Freeze static operators: If part of your network is a non-animated background element, select its terminal TOP and set Cook to Off (on by default). Freezes its output and frees GPU cycles for the animated parts.
Error handling in Python: Wrap any op() references in try/except blocks. A missing operator causes an exception every frame — noticeable lag and console spam.
Saving the Project Properly
Create a folder: my_installation/. Inside it:
my_installation.1.toe— the TouchDesigner project fileassets/— audio files, video files, fontsdata/— any Table DATs exported as CSV for referenceversions/— periodic saves:my_installation.2.toe,my_installation.3.toe
Use File → Save As each time you make a significant change. TouchDesigner saves the entire project — all networks, all parameter values, all media references — in the single .toe file. Keep your assets in a relative path (a subfolder) so the project remains portable.
Running on Startup
For an unattended installation, configure Windows to launch TD automatically:
- Open Task Scheduler. Create a task triggered At Log On.
- Set the action to run
TouchDesigner.exewith arguments:"C:\installation\my_installation.1.toe" -p. - Under Settings, check “Run task as soon as possible after a scheduled start is missed” (handles reboots after power outages).
- Add a 60-second delay to allow drivers and display outputs to initialise.
Set Windows to auto-login to the account that runs TD (via netplwiz). Set the display settings to extend to the output monitor before the task fires.
What You’ve Built
This installation combines: live microphone input → FFT spectrum analysis → per-band channel extraction → animated 3D terrain displacement → phong-lit render → beat-reactive brightness → time and audio driven hue rotation → full-screen external display → operator-facing perform UI. Every tutorial in this series contributed one piece of this system.
The architecture — modular Base COMPs, clean Null TOP interfaces, data separated from presentation — is the same pattern used in professional installations. The operators are different; the structure is the same. Build the next project in the same way, and the one after that, and complexity becomes manageable.