Experimental 2023.10130

First experimental build for 2023
Release Notes 
Experimental builds include new features still in development and testing, features are subject to change or even be removed. For the stability and reliability required for performances and project deliveries, use the production ready Official Builds.
Known Issues and Backward Compatibility warnings below should be read carefully.

Known Issues

Please report all issues to the Bugs Forum, remember to include build number.

  • Errors on Palette Components GeoPanel, MoviePlayer, and MovieEngine.
  • macOS Open File dialog results are randomly ignored.
  • Random bugs


Backward Compatibility

Change for keys on Windows systems

  • TouchDesigner's License System Codes are now generated differently to reduce the chance of a system code change when applying Windows Updates. Old keys will work in this 2023.10k branch, however, new keys created in this 2023.10k branch will not work with older versions of TouchDesigner.
  • We have released an update to 2022.20k branch so any builds released after July 10 2023 will also work with the new keys created in this 2023 version. In summary - If you want to use 2022 and 2023 versions with the same key, either a) create your key using 2022 builds, or b) use a 2022 build released after July 10 2023 (yet to be released).


File Compatibility

Project .toe files saved in Experimental can not be loaded back in Official.


Backward Compatibility Changes

We try to make upgrading to new TouchDesigner branches as painless as possible, but sometimes changes are made that are not compatible with the feature set in older builds. These are difficult decisions and we do not take them lightly, but we move forward with such changes when it is clear that they will benefit the TouchDesigner platform in the long term.

  • BACKWARD COMPATIBILITY ISSUE - tdu.match interprets spaces in the pattern argument as separators.
  • BACKWARD COMPATIBILITY ISSUE - The Keyboard In DAT's 'key' column will no longer return special characters such as !@#$%^&*(). These will now be 1234567890 for better consistency with other shortcut workflows.
  • BACKWARD COMPATIBILITY ISSUE - Parameter expressions assigned to None in scripts will now be empty string instead of the string 'None'.
  • BACKWARD COMPATIBILITY ISSUE - When Python parameter expression is blank, return None, not empty string.
  • BACKWARD COMPATIBILITY ISSUE - Panel.interactMouse/interactTouch will respect a panel's 'Enable' parameter toggle.


Build 2023.10130 - Aug 16, 2023

Key Highlights

OAK-D AI Sensors

OAK-D cameras offer a range of high-resolution cameras with depth vision and on-chip machine learning. OAK-D can run computer vision tasks on-device and send the processed images or data to TouchDesigner on both Windows and macOS. For example, an OAK camera can compute human skeleton landmarks for a live RGB image and send both the landmarks and image to TouchDesigner. OAK is short for the OpenCV AI Kit, which originated through online crowd-funding. Luxonis has expanded the line of OAK hardware and also released several open-source libraries such as DepthAI that run on the OAK.

The aim of integrating TouchDesigner with OAK cameras is to facilitate novel interactions with the rest of the TouchDesigner environment while providing low-latency, high throughput performance with the OAK hardware. If you think a pure Python example that doesn't involve TouchDesigner is running faster than one which does, please let us know. For example, we aim for the frames-per-second of an OAK's RGB camera received in TouchDesigner to be at least as fast as what you would receive in pure Python with DepthAI and OpenCV.

Three new OAK-D operators work together to implement the OAK functionality: The OAK Device CHOP is the main interface to the camera devices. The OAK Select CHOP extracts channel and dictionary data from the camera results of a OAK Device CHOP. The OAK Select TOP extracts processed images from the camera. Each DepthAI model running on each camera will have one OAK Device CHOP plus one or more of the OAK Select OPs.


Machine Learning Features

  • Body Track CHOP - This new CHOP uses Nvidia Maxine AR SDK to perform body pose estimation on any TOP video or camera input. It can track bounding boxes and 34 key points of one or more human bodies, with optional joint angles, in 2D or 3D.
  • ZED - Major overhaul including an SDK update and the addition of body tracking support in the ZED CHOP and a 'Neural' depth camera mode in the ZED TOP.
  • Nvidia Upscaler TOP - This new TOP used Nvidia Maxine Video Effects SDK to upscale the resolution of an input video. The Upscale mode is faster and offers a 'Strength' parameter. The Super Resolution mode is higher quality and doesn't offer a Strength parameter, but it does have an optional 'Artifact Reduction' toggle.


Broadcast and Virtual Production

  • MoSys CHOP / MoSys TOP - The MoSys CHOP receives data from a MoSys camera tracking system. The channels can be used to control a virtual camera and to implement lens distortion via the MoSys TOP as part of a virtual production system.


Timecode Tools

Numerous Timecode tools has been woven into TouchDesigner. A new Timecode CHOP can create and manage SMTPE timecode and a large selection of OPs in TouchDesigner that deal with time have been updated to be driven by timecode or include a timecode member so they can all be managed effectively. For a full list of these operators, refer to the Timecode page.

  • Timecode CHOP - A new CHOP for managing Timecode
    • Added custom length parameters and extra countdown field to Info DAT.
    • Added countdown output channels.
    • Check out the new OP Snippets for this operator.
  • Timeline CHOP - Added a new parameter to drive timeline time with a timecode object.
  • LTC Out CHOP - Added a parameter to drive the LTC Out timecode with a Timecode Object/CHOP/DAT.
  • Timer CHOP - Added option in the 'Time Control' parameter to drive the Timer CHOP directly with timecode.
  • Timecode Class - A new class to access timecode features via python throughout TouchDesigner.
  • Many operators that can use timecode now have new timecode members to access their timecode directly via python.


Laser Control

  • Laser Device CHOP - The Laser Device CHOP can send laser points to supported laser devices: EtherDream, Helios, and ShowNET. ShowNET support comes to TouchDesigner for the first time! The devices can be connected to a laser using an ILDA cable, except in the case of ShowNET when an onboard DAC is used. Applications of the Laser Device CHOP include displaying computer-generated shape animations or other special effects of a light show. The Laser Device CHOP replaces the deprecated EtherDream CHOP and Helios DAC CHOP.
  • Laser CHOP - Added look-up CHOP for vertex hold min/max angles and added 'Blank State Channel' for help with debugging.


New Operators

  • Bloom TOP - The Bloom TOP creates a glow effect around bright parts of the image.
  • GLSL COMP - The new GLSL COMP uses GLSL shaders to render an image in a panel directly to the screen. It is useful for rendering pixel accurate UIs as the resolution will automatically adapt to the DPI scaling of the screen it is displayed on.


Engine COMP Overhaul

  • Engine COMP - New features and improvements.
    • Enabled OP Viewer parameter on Common parameter page to show a selected viewer.
    • Added 'Asset Paths' parameter to make relative paths based on the Project .toe file or the External .tox file.
    • Added TouchEngine process parameters on the Advanced parameter page. This allows you to quit or launch the process independently from loading your component.
    • Added 'On Engine COMP Load' parameter which determines what happens when a .tox is loaded (also affects copy & paste).
    • Errors on the loaded component are now reported in the pop-up info text via middle-mouse button .
    • Added a new onError() callback to the Callback DAT.
    • Allow use of user selected operator colors (use color palette to set).
  • New Init Start parameter page modelled after Init Start on Timer CHOP including a similar set of core control parameters.
    • Added “Ready when” parameter to specify when the transition to Ready state happens.
    • Added onInitialize() callback.
    • Added 'Go To Done' parameter, and 'On Done' parameter to determine behavior, plus onDone() callback, plus "done" channel, plus "goToDone()" Python command.
    • Added 'Pre-Roll' parameter.
  • Added a docked Info CHOP and Info DAT
    • More channels added in 'General' Info Type.
    • Added “Initialize Start” Info Type group of channels reporting on the Status of the Init Start features mentioned above.
    • Added 'TouchEngine Status' Info Type group of channels for process and component state to better understand the TouchEngine process lifetime.
    • Renamed Engine Perform to 'TouchEngine Perform'.
    • Added “engine_pid” to Info DAT
    • Added Info CHOP channels output_cook_abs_frame, engine_absolute_frame, engine_absolute_seconds, and initialize_fail.


Lightweight Installer for Windows

The best option for installing TouchDesigner on Windows is our new lightweight installer. This installer packages the core elements of TouchDesigner into a much smaller download which lets you select the features of TouchDesigner you require and downloads them on-the-fly. If you don't own devices like Kinect Azure, ZED camera, or even an Nvidia GPU, save time by skipping these items in your install. The download size is smaller and faster, the installation goes more quickly, and TouchDesigner will use less space on your system. Only install what you need!

Add additional features after the initial installation by going to Settings > Add or Remove Programs and locating your TouchDesigner application. Then select 'Modify' from the options menu on the app and the Modify installation dialog will open allowing you to select the additional features you'd like to download and install.

We will always continue to maintain a full installer for those who want everything or need to install TouchDesigner later on machines where there is no internet connection. However, with the addition of more devices, large SDKs, and features using machine learning models, the full installer is now greater than 2.4GB and will continue to grow. The lightweight installer is a great option for anyone working with a reliable internet connection.


More New Features


  • Working with External Files
    • New parameters on the Common page of all Components offer better control of managing external file locations and paths.
    • New parameter 'Relative File Path Behavior' allows you to use relative paths that are local to the Project (.toe file) or to the location of the External COMP (.tox file).
    • Users are invited to read our article introducing some changes and new features.


  • Nvidia 40-series GPUs
    • The machine learning models for Nvidia operators using Maxine SDKs have been updated to include models for the 40-series Geforce and Professional A-series Ada generation GPUs.


  • Noise TOP - Added 'Derivative (slope)' toggle to get the gradient of the noise in the RGB channels. Only works in monochrome mode.
  • Text COMP / Text TOP - New options for selecting fonts via a new 'Typeface' parameter instead of the previous 'Bold' and 'Italics' parameters.
  • Audio VST CHOP - Added support for custom bus layouts and new parameters for controlling the VST plugin's playhead.
  • Bind CHOP - New 'Exclusive Hold' parameter. Locks out remaining inputs for this period when change detected.
  • Pattern CHOP - Added a new 'Cyclic Ramp' ramp type.
  • Pulse CHOP improvements
    • Added a second input to specify custom pulse indices.
    • Multiple channels now supported.
    • Options to set minimum spacing values for pulses if they overlap.
    • Pulse height determined by the number of repeated indices.
    • Option to specify units for the pulse indices in samples, frames, or seconds.
    • Added 'Connect' option to Interpolate parameter menu which gives true linear interpolation.
  • Timer CHOP - Numerous improvements
    • Active toggle expanded to: Never / Always / While Running / While Playing. 'While Playing' only cooks if any timers are active and 'Play' is enabled.
    • New 'Defer Parm Changes' parameter controls whether or not parameter changes take affect immediately or after the next init/start cycle.
  • Trigger CHOP - Added menu option 'Update once per Cycle' to update trigger shape parameters only once each cycle.
  • Insert DAT - Added rows and cols via cell expressions and added a new 'Replace if Duplicate Name' toggle to replace existing column/row names if new ones have the same name.
  • Keyboard In DAT - Overhaul to how characters are handled with the goal to improve international language support and offer a more consistent interface with keyboard input.
    • BACKWARDS COMPATIBILITY ISSUE - The 'key' column will no longer return special characters such as !@#$%^&*(). These will now be 1234567890 for better consistency with other shortcut workflows.
    • New optional 'web_codes' column, which matches the key code names that Chromium expects.
    • Reworked callback to take a namedtuple, add 'webCode' as a new value.


New Python


Reset parameters new python

reset() -> bool - Resets the associated parameters to its default state, returns true if anything was changed.

op('geo1').par.tx.reset() op('geo1').parGroup.t.reset() op('geo1').pages[0].resetPars() op('player').customPages['Setup'].resetPars() op('player').resetPars(includeBuiltin=False) # only reset custom

Default parameter new python

  • Par Class / ParGroup Class.defaultBindExpr .defaultExpr - Get or set the default bind expression on custom parameters.

n.par.Float1.defaultBindExpr = 'me.par.Float2' n.par.Float1.defaultExpr = 'me.time.frame'

n.par.Float1.defaultMode = ParMode.EXPRESSION - Resetting the parameter sets it to .defaultExpr expression, so using the previous example n.par.Float1.defaultExpr = 'me.time.frame', then the expression would be set to me.time.frame.

General Python Additions and Improvements

  • App Class.systemFolder - A new member that contains the installation folder for TouchDesigner system files.
  • ClockCHOP Class - Added a new timecode member.
  • DAT Class - row(),col(),rows(),cols() have a new bool argument `val`. `val=True` returns list of just cell entries instead of list of cells.
  • Dependency Class.setVal(val, setInfo=None) .setInfo(Keyword, Optional) - Optional information passed to the modified callback. Allows users to give more specific information when setting a value.
  • ListCOMP Class - Added .dropRow .dropCol members. The current row/col about to be dropped over.
  • OakdeviceCHOP Class - Changed masterTimecode/runningTimecode to return a tdu.Timecode rather than a string. Also added a timecode getter that simply returns masterTimecode, similar to the Timer CHOP.
  • OakselectCHOP Class / OakselectTOP Class - Added a timecode member that returns the referenced OAK Device CHOP's master timecode.
  • OP Class.checkSequence() -> list - Returns a (possibly empty) list of any ParGroup objects with unmatched sequence flags.
  • Page Class.appendMenu(size=1) - Now supports up to 4 menus in a single ParGroup.
  • Page Class / Cell Class - Comparisons to 'None' vs None now work properly.
  • PanelCOMP Class - Added .dropReady The current state of the drop operation. True when the drop will be accepted.
  • PanelCOMP Class - BACKWARDS COMPATIBLITY ISSUE - Panel.interactMouse/interactTouch will respect 'Enable' parameter toggle.
  • Par Class - Custom parameter order attribute is now a float and no longer limited to integers.
  • Par_Class - .defaultMode .mode undoable when changed in script.


  • Timecode Class.setLength - A new method for setting a custom length.
  • Timecode Class.countdown - A new member of the Timecode object that is the difference between the current timecode value and the length.
  • TimerCHOP Class.playingTimecode/cumulativeTimecode - Has been changed to return a tdu.Timecode object rather than a string
  • TOP Class - cudaMemory() now supports a 'stream' keyword argument. Use this to make use of a cudaStream_t/CUstream stream to do the work on.
  • TOP Class - Added newestSliceWOffset member for use with Texture 3D TOP generated textures in Python.
  • scriptTOP Class - copyCUDAMemory() now supports a 'stream' keyword argument. Use this to make use of a cudaStream_t/CUstream stream to do the work on.
  • run function. The first argument can now be an optional function instead of a string. This can be easier to work with rather than constructing an executable line of code with embedded quotes.

run( lambda: print('A') ) run( lambda x: print(x), 'B' ) run( print, 'C', 'D', 'E')

    • run(func) now accepts keywords. ie. run( myfunc, 'C', a=1, stop=True)
  • tdu_Module.match - BACKWARDS COMPATIBILITY ISSUE - Now supports space separated patterns and single ^ terms properly. tdu.match interprets spaces in the pattern argument as separators.


tdu.match( "^foo", ["bar"] ) # ["bar"] tdu.match( "* foo", ["bar"] ) # ["bar"]

  • Parameter members .expr, .bindExpr, .defaultExpr, .defaultBindExpr assigned to None in scripts will now be empty string instead of the string 'None'. BACKWARDS COMPATIBILITY ISSUE
  • When Python parameter expression is blank, return None, not empty string. BACKWARDS COMPATIBILITY ISSUE


New Palette

  • TDAbleton - 2.2.0 features of note
    • Currently playing arrangement clip info is now reflected in abletonTrack parameters
    • RunRemoteCode extension functions will no longer work when Listen Only is set on tdaMaster component. This can be overridden with an "overrideListenOnly=True" argument.
    • Added "Back To Arrangement" toggle on abletonSong - return tracks to arrangement control
  • Palette:lister - Fixed a bug where reordering rows in lister can mangle a sync'd input table if not all tableDAT cols are displayed in lister.
  • Palette:logger - v2.1.13 - A new palette component wrapping around the Python Logging Library and interface to add additional Loggers easily in your TouchDesigner projects.
  • Palette:particlesGpu
    • Life can be randomized or derived of an Effector input. Particles with alpha=0 will not be rendered.
    • New 'Lifemodifier' parameter to multiply remaining lifetime with effector value.
    • Fixed source interpolation disabled when source input provided.
    • Particles are not created from source points that have alpha 0.
  • Palette:popMenu - Fixed issue where title width wasn't incorporated into menu window width. Other cosmetics. Menu updates size when pars change.
  • Palette:quadReproject - v0.1.7 - Added support for multiple lights in the 'Lights' parameter.
  • Palette:recorder - A new folder called TDVS for general video server components. The first component is the recorder component which wraps a Movie File Out TOP for easier recording and encoding of videos.
  • Palette:searchReplace - Now searches the evaluated value of parameters as well as val, expr, bindExpr.
  • palette:lister and palette:treeLister - Bug fixes and improvements
    • Added defaultAutoColDefine and exposed 'Word Wrap' parameter in config components.
    • Fixed bug where SetCellLookName function would override striping.
  • palette:treeLister - Further improvements
    • Added scrollbar controls to Tree parameter page.
    • Added 'Expand All' pulse button and ExpandAll function to expose all tree nodes.
    • Fixed bug where FromPathsSelectRows would miss the first row.
    • Fixed bug where input mode with wirePath and parentPath columns would fail.
    • Fixed error messages on initial load.
  • TransitMap removed (before eventual replacement).


Bug Fixes and Improvements

  • Updated Nvidia Optical Flow to 4.0.11
  • Updated Nvidia Video Effects to 0.7.2
  • Updated Nvidia AR SDK (Face Track) to 0.8.2
  • Updated JUCE v7.0.2
  • Updated Kinect Body Tracking SDK to 1.1.2
  • Ableton Link SDK v3.0.6


  • Container COMP - Fixed a problem with the positioning of popup windows when panel opacity is below one.
  • List COMP - Don't edit cells if modifier (shift/ctrl/alt/etc) keys are used. Also fixed an out-of-bounds issue calling rollover with (max_row, max_col) instead of (-1,-1).
  • Text COMP - Improvements and bug fixes
    • Fixed an issue where text members were out of date if the view hadn't been displayed yet.
    • onTextEditEnd() callback is now inside the Text Value Change undo block to allow additional events to be added to the undo step.
    • UI Events are now flushed before the OP Viewer TOP captures a panel viewer to ensure it is up to date with the latest cook which fixed a case where Text COMP data might be a frame behind.



  • Info CHOP - Added "All" info type to display all info available.
  • Logic CHOP - 'Convert Input' menu indexing fixed.
  • Lookup CHOP - Added 'Extend Condition' menus with options for 'Use Input' and the standard extend options found elsewhere ie. (Hold, Cycle, etc).


  • MQTT Client DAT - Added topic argument to onPublish callback.
  • OP Find DAT - 'Include Utility Off' no longer includes children of utility nodes.
  • UDP In DAT / TCP/IP DAT / Touch In DAT / Touch Out DAT / OSC In CHOP - Updated the way TCP and UDP sockets bind to ports. We now can issue more warnings depending on the status of the port and how the binding of the socket went, for exmaple, if the port is already in use or not. Windows only.


  • Line MAT - Now supports draw vectors for point primitives.


  • SOP operators now support directly saving contents as the following formats dae, 3ds, dxf, obj (in addtion to fbx).
  • Blend SOP - Fixed crash when blend weights reached 0.
  • Text SOP - Fixed crash in some cases when using a Font File.


  • Search / Replace Dialog now searches the evaluated value of parameters as well as val, expr, and bindExpr.
  • Improved accuracy of GPU timing calculations.
  • Fixed password dialog sometimes not opening on top of other windows.
  • Fixed floating network editors sometimes being always on top.
  • Fixed parameter dialog to not show default parmeters in non-default mode (eg: './help' and 'repositioncomp' in containers)
  • Fixed Global OP shortcuts not registering properly on external toxes.
  • Fixed spurious errors when using Page.appendPar()
  • TOP viewer pixel value picking (when viewer is active) now works correctly for 3D textures and Cube Map textures.
  • Added definitions for media keys i.e. AudioVolumeUp, BrowserBack, etc
  • Added drag and drop support for FLAC audio files.
  • dragEnd callback 'droppedOn' now distinguishes between Par and ParGroup.


Sequential Parameters Sequential Parameters are sets of parameters in TouchDesigner that can be grown using the +/- buttons in the parameter dialog. We have revamped the naming as follows.

The new naming format is: <sequence name><block index><parName>.

Every sequence now has a "sequence name" which is added as a prefix to every parameter that is part of the sequence. This is followed by a "block index", which is the index of the block (set of associated parameters) within the sequence.

For example, the name/value pars in constantCHOP used to be called name0/value0, name1/value1, etc. The new names are: const0name/const0value, const1name/const1value etc. Other notable examples are extensions (sequence name "ext") and internal operators (sequence name "iop") TouchDesigner will attempt to understand the old names as aliases, but there can still be backwards compatibility issues in some cases.



  • On Windows, TouchDesigner's License System Codes are now generated differently to reduce the chance of a system code change when applying Windows Updates. Old keys will work in this 2023.10k branch, however, new keys created in this 2023.10k branch will not work with older versions of TouchDesigner. We also have release an update to 2022.20k branch so any builds released after July 10 2023 will also work with the new keys created in this 2023 version. In summary - If you want to use 2022 and 2023 versions with the same key, either a) create your key using 2022 builds, or b) use a 2022 build released after July 10 2023.
  • Errors are now provided when Floating Cloud and Dongle licenses are expired for the current build.
  • Floating Cloud licenses won't be consumed anymore if a better Dongle license is present on the system. Furthermore, floating cloud or dongle licenses won't be used if a higher level local license is installed through the Key Manager Dialog.


Panel Layout Optimization

  • Lots of work was done to speed up internal panel layout code resulting in many control panels performing significantly faster. If you discover regressions or control panels that are still extremely slow, please contact us via the bugs forum.