Published 2025-01-29.
Last modified 2025-02-01.
Time to read: 15 minutes.
av_studio
collection.
I have been searching for a truly all-singing, all-dancing music video generation capability. After obsessively immersing myself with TouchDesigner for several days, I feel certain that it can take care of that somewhat nebulous requirement quite nicely.
About TouchDesigner
TouchDesigner is a node-based visual programming environment used for real-time interactive multimedia and generative visuals. Developed by Derivative.ca, a Canadian company based in Toronto, TouchDesigner is widely used for creating interactive installations, VJ performances, projection mapping, and live visuals.
TouchDesigner has been developed over decades. The historical information I could find was a bit vague on details, but it seems that TouchDesigner was first released in 2002. It’s immediate ancestor, guided by the same startup founder, was Houdini 4.1.
Technology has changed and advanced quite a lot in the past 23 years. Many devices that were popular then are no longer available. It seems that TouchDesigner has retained compatibility with obsolete devices.
Dependencies
The information in this section is generally not important for using TouchDesigner. However, knowing the components that were used to build a product helps develop an intuitive sense of that product’s capabilities, and often provides guidance on how to approach problems encountered while using the product.
Implementation details should not normally be visible to users. Because TouchDesigner seems to be extremely well designed, the dependencies that I show below merely provide the desired functionality without forcing users to contend with implementation details.
Example: Installation Debug
TouchDesigner uses Vulkan as a graphics engine. Vulkan is a low-level, low-overhead cross-platform API and open standard for 3D graphics and computing. Knowing that helped debug a problem.
I have several laptops. One of them is a 7-year-old Dell 9575 2-in-1. This model laptop has kinds of two video chips on the motherboard: a Radeon RX Vega M Graphics, and an Intel HD Graphics 630.
When I attempted to run TouchDesigner for the first time on the Dell 2-in-1, the following appeared:

To debug the problem, I installed and ran the Intel Driver Assistant on the 2-in-1 laptop. The software utility identified that the video driver for the Radeon RX Vega M Graphics chip needed updating.
😁 😁After updating the video driver, TouchDesigner worked on the 2-in-1 laptop.
The Dell 9575 2-in-1 laptop can only hold a maximum of 16 GB RAM, so I do not expect it to be able to run demanding TouchDesigner networks at an acceptable frame rate. When running alongside Chrome and WSL, the laptop’s RAM pages quite a bit. Thankfully, the laptop’s NVMe storage has a high enough bandwidth that the constant paging does not impact performance too much.
Having two kinds of video chips means the Dell 2-in-1 laptop runs small TouchDesigner networks quite nicely. I do not expect that a demanding network would perform adequately on this laptop due to the limited memory available.
Similar But Different
I also have an 8-year-old Dell XPS 15 9570 with 32 GB RAM and two other video chips. I think the 4K display feature that I opted for when I ordered the XPS 15 slows TouchDesigner down on this laptop quite a lot. This configuration of XPS 15 runs TouchDesigner less well than the 2-in-1 does, even though the XPS 15 has twice the memory of the 2-in-1.
I wonder what might happen if I connected a 4K external monitor to the XPS, and displayed TouchDesigner on it? Perhaps I might try that sometime.
In contrast, my custom-built desktop has 64 GB RAM and an MSI GeForce RTX 3060 Ventus 12G OC GGDR6 video card. It runs large TouchDesigner networks much quicker. Because I also run Chrome and WSL at the same time, I am considering doubling the RAM.
Bill Of Materials
Following is a descriptive list of the DLLs that I found installed in
%ProgramFiles%\
.
You could think of this list as similar to the list you might make when examining a car. Your list would consist of a brief description of the externally visible components, for example the engine, transmission, navigation, seats, doors, etc.
It seems that TouchDesigner provides support for a many types of devices, with many integration options. TouchDesigner still provides support for many discontinued devices. Kudos!
I was surprised to see the amount of neural network, deep learning and image recognition support that these dependencies provide. I installed TouchDesigner on Windows 10; Mac users will have some different dependencies.
- 3Dconnexion SpaceMouse provides 3D mouse support.
- Allied Vision Technologies Camera API provides the GigE Vision driver and API.
- Alembic is a F/OSS library jointly developed by Sony Pictures Imageworks (SPI) and Lucasfilm Ltd, and available on GitHub. Alembic is a framework for storing and sharing scene data that includes a C++ library, a file format, and client plugins and applications.
- Apache Xerces-C++ XML parser is a F/OSS validating XML parser written in a portable subset of C++.
- Boost is a general-purpose F/OSS library of utility functions for C++.
- Cubemos Skeleton Tracking Software; Intel has discontinued the Cubemos Skeleton Tracking software product, but TouchDesigner continues to support it.
- DeltaCast VideoMasterIP SDK; is an SDK for high-performances multimedia capture and streaming. The IP Virtual Card is a new software framework allowing the use of 3rd-party NIC (Network Interface Card) for high-performances multimedia capture and streaming. It supports SMPTE ST2110 norms, including compliant packet pacing and PTP synchronization.
- DepthAI allows users to develop and deploy vision pipelines.
- E57 Scanning Format is a compact and vendor-neutral format that is used for storing point clouds, images, and metadata produced by 3D imaging systems, such as laser scanners. This file format is specified by the ASTM, an international standards organization, and it is documented in the ASTM E2807 standard.
- EMVA GenICam provide a generic programming interface for all kinds of devices (mainly cameras), no matter what interface technology (GigE Vision, USB3 Vision, CoaXPress, Camera Link HS, Camera Link etc.) they are using or what features they are implementing. The result is that the application programming interface (API) will be identical regardless of interface technology.
- FreeType is a F/OSS library to render fonts.
- HeliosLaserDAC is a F/OSS node for working with the Helios Laser Dac, which is a USB to ILDA interface/adapter that connects laser show projectors to computers.
- Intel nGraph is an open-source C++ library and runtime / compiler suite for deep learning ecosystems.
- Intel RealSense provides stereo depth camera support. Intel just spun this group out; its future is unknown.
- Intel Threading Building Blocks is a flexible performance library that simplifies the work of adding parallelism to complex applications across accelerated architectures.
- LibAV is a F/OSS collection of libraries and tools to process multimedia content such as audio, video, subtitles and related metadata.
- Libcurl; libcurl is a F/OSS client-side URL transfer library, supporting DICT, FILE, FTP, FTPS, GOPHER, GOPHERS, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, MQTT, POP3, POP3S, RTMP, RTMPS, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, TELNET, TFTP, WS and WSS. libcurl supports SSL certificates, HTTP POST, HTTP PUT, FTP uploading, HTTP form based upload, proxies, HTTP/2, HTTP/3, cookies, user+password authentication (Basic, Digest, NTLM, Negotiate, Kerberos), file transfer resume, and http proxy tunneling.
- Liblz4 is a F/OSS lossless compression algorithm, optimized for fast decompression.
- Libmd is a multi-threaded math library for Microsoft Windows provided by Intel.
- LIVE555 Streaming Media is a set of F/OSS C++ libraries developed by Live Networks, Inc. for multimedia streaming. The libraries support open standards such as RTP/RTCP and RTSP for streaming, and can also manage video RTP payload formats such as H.264, H.265, MPEG, VP8, and DV, and audio RTP payload formats such as MPEG, AAC, AMR, AC-3 and Vorbis. It is used internally by well-known software such as VLC and mplayer. The software distribution also includes a complete RTSP server application, RTSP clients and a RTSP proxy server.[2][3][4]
- FFmpeg is a F/OSS suite of libraries and programs for handling video, audio, and other multimedia files and streams.
- Microsoft DirectML; Direct Machine Learning (DirectML) is a low-level API for machine learning (ML).
- Microsoft Kinect Common Bridge is an archived complement to the discontinued Kinect for Windows SDK that makes it easy to integrate Kinect scenarios in creative development libraries and toolkits.
- Microsoft ONNX Runtime powers AI runtime training and inferencing.
- MQTT is an OASIS standard messaging protocol for the Internet of Things (IoT). It is designed as an extremely lightweight publish/subscribe messaging transport that is ideal for connecting remote devices with a small code footprint and minimal network bandwidth.
- NVIDIA AR SDK utilizes the Tensor Cores on NVIDIA RTX GPUs to enable fast, high quality tracking through an AI network.
- NVIDIA Broadcast SDK optimizes audio and video streams for broadcasting.
- NVIDIA cuBLAS
- NVIDIA CUDA and Cudart
- NVIDIA cuDNN; the NVIDIA CUDA Deep Neural Network library is a GPU-accelerated library of primitives for deep neural networks. cuDNN provides highly tuned implementations for standard routines such as forward and backward convolution, attention, matmul, pooling, and normalization.
- NVIDIA cuFFT provides the CUDA Fast Fourier Transform library.
- NVIDIA CUDA NPPCORE library is a library of functions for performing CUDA accelerated 2D image and signal processing.
- NVIDIA Nsight Aftermath SDK is a library that integrates into a D3D12 or Vulkan game’s crash reporter to generate GPU “mini-dumps” when an exception or TDR occurs, exposing pipeline information to resolve an unexpected crash.
- NVIDIA FleX is a particle based simulation technique for real-time visual effects.
- NVIDIA Flow is a volumetric fluid based simulation of a burning gas system.
- NVIDIA TensorRT is an ecosystem of APIs for high-performance deep learning inference. TensorRT includes an inference runtime and model optimizations that deliver low latency and high throughput for production applications.
- NVIDIA Tools Extension Library is a cross-platform API for annotating source code to provide contextual information to developer tools.
- NVIDIA® Vision Programming Interface (VPI) is a software library that implements computer vision and image processing algorithms on several computing hardware platforms available in NVIDIA embedded and discrete devices.
- Oculus OVR Audio SDK was a tool for developing audio for Oculus devices. Oculus/Meta no longer supports this, but TouchDesigner still does.
- OpenColorIO is a complete color management solution geared towards motion picture production with an emphasis on visual effects and computer animation.
- OpenCV is a F/OSS computer vision library that contains over 2500 algorithms.
- OpenEXR implements the EXR file format, a professional-grade image storage format for the motion picture industry.
- OpenMP is a cross-platform library for shared-memory multiprocessing.
- The OpenSSL Toolkit provides SSL support.
- OpenVINO toolkit is a F/OSS toolkit for optimizing and deploying deep learning models. OpenVINO is developed by Intel and stands for "Open Visual Inference and Neural Network Optimization".
- OpenVR SDK an API and runtime that allows access to VR hardware from multiple vendors without requiring that applications have specific knowledge of the hardware they are targeting.
- OptiTrack NatNet SDK is a client/server networking SDK for sending and receiving OptiTrack data across networks.
- Orbbec Femto Bolt is a high performance iToF 3D camera jointly developed by Orbbec and Microsoft. The camera uses the same depth module as Azure Kinect DK, continuing the same depth modes and performance.
- Orbbec SDK is a cross-platform library supporting various platforms and languages for Orbbec 3D cameras.
- Pixar Animation Studios Universal Scene Description a high-performance extensible software platform for collaboratively constructing animated 3D scenes, designed to meet the needs of large-scale film and visual effects production. USD enables robust interchange between digital content creation tools with its expanding set of schemas, covering domains like geometry, shading, lighting, and physics. USD’s unique composition ability provides rich and varied ways to combine assets into larger assemblies, and enables collaborative workflows.
- Python 3.11.1
- Rav1e is an AV1 video encoder.
- RED R3D SDK is a RAW decoder for RED R3D files.
- RPly is an ANSI C library that allows applications to read and write PLY files. PLY is a file format that stores geometric information, such as 3D models.
- Scalable Display Technologies EasyBlend provides image perspective correction and blending for projection onto curved surfaces.
- SICK LiDARs and Radar
- Spout is a F/OSS library that provides realtime video routing for Windows. Using Spout you can send video between applications like Resolume, Max, Processing, MadMapper, TouchDesigner and more. Create graphics in Processing, mix them in Resolume and projection map them with Mad Mapper. Throw in some interactive content from TouchDesigner, Max or Unity while you are at it.
- Steam Audio Core is a cross-platform software toolkit for spatial audio.
- StereoLabs ZED SDK stereo camera for spatial perception.
- Adobe Substance 3D Painter is a texturing app for 3D professionals and enthusiasts. This library was used by Houdini, TouchDesigner’s predecessor.
- TeleDyne FlyCapture SDK; for machine vision cameras.
- TeleDyne Spinnaker SDK; The TeleDyne Spinnaker SDK library supports machine vision applications that require FLIR USB3, 10GigE, and most GigE area scan cameras.
- Vulkan is a low-level, low-overhead cross-platform API and open standard for 3D graphics and computing. It was intended to address the shortcomings of OpenGL, and allow developers more control over the GPU. It is designed to support a wide variety of GPUs, CPUs and operating systems, and it is also designed to work with modern multicore CPUs.
- Ximea SDK provides support for Ximea machine vision cameras.
- WebRTC; C bindings for Google Chrome WebRTC Native.
-
Zlib
is a F/OSS software library for data compression. It is used bylibpng
and is widely used to compress files to thegzip
format.
Getting Started
The written documentation for TouchDesigner is good; however, visually oriented programs like TouchDesigner benefit from video tutorials. I added comments to the following quote; my comments look like this.
- The Getting Started Tips will help you install TouchDesigner and get it keyed and running.
- The TouchDesigner Curriculum course is where you should start to learn the fundamentals of TouchDesigner. This is not the best learning option.
- Check out the Beginner - Interactive and Immersive HQ playlist. I liked these videos best.
- The Introduction to TouchDesigner workshop highlights many concepts and specific operators through introductory examples in a single 4-hour-long YouTube video. This video has 16 chapters and is 7 years old. The author is Ben Voigt, Derivative Product Manager.
-
Go through First Things to Know about TouchDesigner
to get an introductory overview with pro tips and tricks throughout.
Although all this information is useful,
people reading this information for the first time will probably have their eyes glazed over by the time they
reach the following crucial material, and I have not found any links back to it.
The material that I want to emphasize is:
- Section 16, The Four "Parameter Modes", transposed the second and third modes. Although no links were provided to where readers could learn about how to actually use these modes, that information is provided in the next four sections, which are:
- Section 17. CHOPs output Channels of Samples
- Section 18. Export CHOP Channels to Parameters
- Section 19. Put a Python Expression in a Parameter
- Section 20. Parameter Mode: Binding
After installing TouchDesigner, a good place to start learning is the Beginner Crash Course by Interactive and Immersive HQ. Just let each lesson autoplay. The pacing is just right, is not repetitive, and has many practical reasons for why each morsel of information is useful.
Lots Of Help Is Provided
Microsoft customers are used to getting help by selecting something they want to learn about, then pressing F1. If you do that when running TouchDesigner, an empty, black projector window will open. Closing the window by pressing the UI control exits TouchDesigner.
It is better to press the ESC button to exit the projector window. TouchDesigner has lots of help available – just do not press F1 when you want to view it.

Help information for a node can be found by right-clicking on the node and selecting Help....
A new tab will appear in your computer’s default web browser,
displaying the appropriate page from
docs.derivative.ca
.

You might see an icon that resembles a small grid sprinkled into the text of the help page. I believe that this icon is meant to resemble a plus sign within a square. Click on an instance of this icon to reveal more information. The icon does not change when you click on it to indicate that it has been expanded. The UI designer could have done a better job here.
Contextual help is also available from the parameters’ pane, which displays two help icons in the left-most portion of its title bar. The question mark icon over a black background opens the above-mentioned help page.

Help for Python and C++ programmers is displayed when you click on the question mark icon that looks like it is in front of the Python colors (blue and yellow, separated by a thin white bar). This icon looks rather like a square Ukrainian flag with a question mark in front.


The Help / Operator Snippets menu item is particularly useful. It opens a new TouchDesigner window in which you can find many useful networks with embedded Python snippets. You can paste these subnetworks into your network.

Mouse over the image to enlarge it
Programming Interfaces
TouchDesigner provides a nice visual programming environment, into which snippets of code can be sprinkled. Larger chunks of code can also be woven into a network (of nodes).
The main programming interface supported by TouchDesigner in 2025 is Python. The version bundled with TouchDesigner is Python v3.11. C++ is also supported. TypeScript support is deprecated.
Python Snippets
You can experiment with Python code within a TouchDesigner Textport, which can be opened by typing ALT-T.
To obtain a reference to a node, pass the fully qualified path of the node to the op
function.
TouchDesigner Build 2023.12120 compile on Mon Dec 16 15:05:18 2024 Python 3.11.1 (heads/3.11-Derivative-dirty:82b0389147, Jan 25 2023, 22:34:27) [MSC v.1929 64 bit (AMD64)]
python >>> r = op('/project1/moviefilein1')
Nodes have attributes and methods.
Two commonly used attributes are name
and opType
.
python >>> r.name 'moviefilein1'
python >>> r.opType 'moviefileinTOP'
Python programmers are familiar with how to obtain the list of all available attributes and methods for a node:
Just pass a node reference to dir
.
Python programmers might expect that a similar result could be returned by __dir__
;
however, many TouchDesigner objects do not support __dir__
.
python >>> dir(r) ['OPType', '__add__', '__bool__', '__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__mul__', '__ne__', '__new__', '__radd__', '__reduce__', '__reduce_ex__', '__repr__', '__rmul__', '__setattr__', '__setstate__', '__sizeof__', '__str__', '__subclasshook__', '_customPages', '_pages', 'activeViewer', 'addError', 'addScriptError', 'addWarning', 'allowCooking', 'aspect', 'aspectHeight', 'aspectWidth', 'base', 'builtinPars', 'bypass', 'changeType', 'children', 'childrenCPUCookAbsFrame', 'childrenCPUCookTime', 'childrenCPUMemory', 'childrenCookAbsFrame', 'childrenCookTime', 'childrenGPUCookAbsFrame', 'childrenGPUCookTime', 'childrenGPUMemory', 'clearScriptErrors', 'cloneImmune', 'closeViewer', 'color', 'comment', 'cook', 'cookAbsFrame', 'cookEndTime', 'cookFrame', 'cookStartTime', 'cookTime', 'cookedPreviousFrame', 'cookedThisFrame', 'copyParameters', 'cpuCookTime', 'cpuMemory', 'cudaMemory', 'curBlock', 'curPar', 'curPass', 'curSeq', 'current', 'currentPage', 'customPages', 'customParGroups', 'customPars', 'customTuplets', 'dependenciesTo', 'depth', 'destroy', 'digits', 'display', 'dock', 'docked', 'error', 'errors', 'evalExpression', 'expose', 'ext', 'family', 'fetch', 'fetchOwner', 'fileFolder', 'fileHeight', 'filePath', 'fileWidth', 'findHeader', 'getHeader', 'gpuCookTime', 'gpuMemory', 'hasAudio', 'hasDecodeErrors', 'height', 'icon', 'id', 'index', 'indexFraction', 'inputConnectors', 'inputs', 'iop', 'ipar', 'isBase', 'isCHOP', 'isCOMP', 'isCustom', 'isDAT', 'isFileOpening', 'isFilter', 'isFullyPreRead', 'isInvalid', 'isLastFrame', 'isLoopFrame', 'isMAT', 'isMultiInputs', 'isObject', 'isOddField', 'isOpen', 'isOpening', 'isPanel', 'isPreloading', 'isSOP', 'isTOP', 'label', 'lastIndexUploaded', 'licenseType', 'lock', 'maxInputs', 'minInputs', 'mod', 'name', 'newestSliceWOffset', 'nodeCenterX', 'nodeCenterY', 'nodeHeight', 'nodeWidth', 'nodeX', 'nodeY', 'numChildren', 'numChildrenRecursive', 'numFrames', 'numHeaders', 'numImages', 'numSeconds', 'numpyArray', 'op', 'opType', 'openMenu', 'openParameters', 'openViewer', 'ops', 'outputConnectors', 'outputs', 'pages', 'par', 'parGroup', 'parGroups', 'parent', 'pars', 'passive', 'path', 'pixelFormat', 'preload', 'python', 'rate', 'recursiveChildren', 'relativePath', 'render', 'replicator', 'resetNodeSize', 'resetPars', 'resetViewer', 'sample', 'save', 'saveByteArray', 'scriptErrors', 'selected', 'seq', 'setInputs', 'shortcutPath', 'showCustomOnly', 'showDocked', 'sourceChannels', 'start', 'storage', 'store', 'storeStartupValue', 'subType', 'supported', 'tags', 'time', 'timecode', 'totalCooks', 'trueIndex', 'trueNumImages', 'type', 'unload', 'unstore', 'unstoreStartupValue', 'valid', 'var', 'viewer', 'visibleLevel', 'warning', 'warnings', 'width']
The above gives us the names of 186 attributes and methods provided by moviefilein
nodes.
Many of them are described in
Working with OPs in Python
Calling help()
and passing a node reference yields many screens of documentation.
This is too much information to view in a programming interface.
I discussed how to view this help information above.
MIDI Controllers
Since I use DAWs a lot, I have many MIDI devices and find it natural to use their knobs and sliders to manipulate parameter values. TouchDesigner provides support for external MIDI controllers.
There are two MIDI In ops: a MIDI In CHOP and a MIDI In DAT. Initially, they will be empty. As each key, knob or slider on a connected MIDI controller is adjusted, those controls will be added to the list of known controls in all MIDI In nodes.
The TouchDesigner MIDI documents are not the best place to look for information about how to get MIDI controllers to work with TouchDesigner.
Matthew Ragan made 4 helpful videos about using MIDI controllers with TouchDesigner in 2017, 8 years ago. He explains many things, but does not consummate the information by telling you how to actually control something with a MIDI device. I figured out a way, which I will show you in a moment.
A few important points from the above video:
- MIDI In CHOP provides MIDI data from a MIDI control ranging from 0 to 127.
-
MIDI In Map CHOP
provides normalized MIDI data from a MIDI control ranging from 0 to 1.
This op provides a naming convention for controls that are stored within a TouchDesigner project.
If we open the
/local/
network, themidi
Bas can be saved to a separate file and then used in other projects by (somehow) mergingmidi
Bases.
The MIDI Device Manager Dialog (ALT-D) shows a MIDI learn button, but it was always deactivated for me. Supposedly this feature was added so long ago that the exact date is lost in the mists of the distant past. On the other hand, the above video did not show MIDI learn functionality, and it walks through the painful details of coping without MIDI learn. Perhaps I will learn more about this one day.
Not having a MIDI learn button meant that much painful typing is required.
Moreover, I found that the input sequence does not flow well,
as there are idiosyncrasies about how a new control is recognized.
I had to fiddle with controls until they all worked.
Defining a new knob would deactivate recently defined knobs,
so I would have to re-jiggle them in the order they were added before new knobs would function.
This dialog needs more work; TouchDesigner seems unfinished in this regard.


Obtain The Value Of A Slider
To obtain the value from a mapped slider on a Novation LaunchControl XL, pass the value through the following linear network:
midiin1
select1
(I used this op to rename the MIDI data channel tov1
)math1
null3
The incantation I used for colorr
(red) in a color picker is:
op('/project1/null3')['v1']
The incantation I used for colorg
(green) in a color picker is:
1-op('/project1/null3')['v1']

I found an open-source MIDI learn function for MIDI controllers,
packaged as a tox
file; the project has a
GitHub page.
I have not tried it yet.
Projector Output
Projectors with resolution compatible with the free version of TouchDesigner are quite inexpensive.
Connect a Window node COMP (found at the bottom of the Other column) to the TOP node that you want to project, and then adjust the Window node parameters.
This is an excellent video on how to set up projector output:
Miscellaneous
- FunctionStore_tools on GitHub; a collection of TouchDesigner hacks and tools that can help you improve the workflow as well as manipulate the default behavior of TD
- TDMorph; toolbox for enhanced parametric exploration, preset storage, composition and cueing in the TouchDesigner platform. It is meant to help in creating and performing generative content via various methods and archiving interesting parameter configurations using a JSON format. Furthermore, the library provides a set of tools that developers can use to create their own custom systems.
Reopening The Previous Project

There is no option for TouchDesigner to automatically reopen the previous project. That is a pity.
For Windows 10 and 11 users, however, jump lists are supported, which is very helpful. You can access a program’s jump list by right-clicking on its icon in the Start menu or the toolbar.
More to come...

The mice are pedaling as fast as they can!