TouchDesigner Beginner Article 10

Your First Installation

Combine audio analysis, 3D geometry, colour grading, and full-screen output into one complete real-time installation.

⏱ 35 min installation project audio-reactive 3d output workflow

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:

  1. Audio Analysis: Live microphone input → spectrum analysis → bass, mid, and treble channels.
  2. 3D Geometry: Grid SOP displaced by audio → Render TOP producing a lit 3D texture.
  3. Colour Grade and Composite: Level TOP, HSV Adjust TOP, final output Null TOP.
  4. 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:

  1. Audio Device In CHOP — Select your microphone input. Set Multi-Channel Off (mono is fine for spectrum analysis).
  2. Audio Dynamics CHOP — Threshold –18 dB, Ratio 4:1, Attack 5 ms, Release 150 ms. This normalises the dynamic range.
  3. Audio Spectrum CHOP — FFT Size 512, Window Hann, Smooth 0.9. This generates the frequency spectrum.
  4. Select CHOP (bass) — Channels chan0 to chan5. Follow with a Math CHOP set to Combine Channels: Mean, Range From 0/0.35 To 0/1, Clamp On. Rename output channel bass.
  5. Select CHOP (mid) — Channels chan10 to chan30. Same Math CHOP treatment. Channel name mid.
  6. Select CHOP (treble) — Channels chan50 to chan120. Same treatment. Channel name treble.
  7. Beat CHOP connected to the Audio Device In CHOP. Trigger CHOP after it: Attack 0.001, Release 0.35. Channel name kick.
  8. 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:

  1. Grid SOP — Size 6 / 6, Rows 100, Columns 100. A high-resolution plane.
  2. 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:

  1. Camera COMP — Translate (0, 3, –7), Rotate X –25. Perspective, FOV 50.
  2. Light COMP (key) — Directional, Rotate X –40, Rotate Y 20. Diffuse a cool white (0.8, 0.85, 1.0).
  3. Light COMP (fill) — Ambient. Diffuse a dark warm tone (0.1, 0.06, 0.04). Prevents pure black shadows.
  4. Render TOP — Camera camera1, Render list includes terrain. Background Colour (0.02, 0.01, 0.05). Multisample 4×. Resolution 1920×1080.
  5. 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:

  1. At the start of the network, place a Null TOP named IN. In the parent network, wire op('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.)
  2. 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.
  3. 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.
  4. 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.
  5. 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.

  1. Place a Null TOP named IN (receives the colour-graded output from outside).
  2. Window COMP — Input: IN. Monitor 1 (your external display). Full Screen On. Borders Off. Open On.
  3. 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 file
  • assets/ — audio files, video files, fonts
  • data/ — any Table DATs exported as CSV for reference
  • versions/ — 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:

  1. Open Task Scheduler. Create a task triggered At Log On.
  2. Set the action to run TouchDesigner.exe with arguments: "C:\installation\my_installation.1.toe" -p.
  3. Under Settings, check “Run task as soon as possible after a scheduled start is missed” (handles reboots after power outages).
  4. 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.