The Interactive & Immersive HQ

Recent TouchDesigner Updates 2022.31030

The initial stable release of the 2022 version of TouchDesigner was an exciting one for the community, full of great new features to explore (Vulkan! VSTs!). But the new features didn’t stop with that initial release! In this article, we’ll take a look at some of the exciting new updates that have been added to TouchDesigner over the last few months. Specifically, we’ll take a look at a major new release of TDAbleton, as well as improvements and new features that were added to the Blob Track TOP, Particle SOP, Timer CHOP, and Table DAT.

TDAbleton Update: Version 2.0

TDAbleton was updated to version 2.0 in the 2022.28040 release, and brought with it a slew of new features! One of the most exciting features is the ability to access arrangement clip info (a highly requested feature), meaning you can access not only the name and index of track, but also time/tempo-related info and even the filename of the sample! This ability really takes the possibilities for the integration between TouchDesigner and Ableton to the next level.

Image from the Derivative blog post about TDAbleton 2.0

Besides that, the abletonSong component has been updated to include global clip launch quantization features, meaning that you can control the quantization applied when you trigger a clip from TouchDesigner. With the Ableton Live 11 update, track macros were increased to 16, and a new preset system was added for recalling settings. The abletonRack component has been updated to take advantage of both of these new features.

For users of TDAbleton, the ability to access the clip info itself is really exciting, but these additional features that take advantage of the new capabilities of Live 11 just sweeten the deal! It’ll be exciting to see what possibilities these features open up.

Blob Track TOP Updates

In version 2022.29530, the blob track TOP received some cool updates, including new callback functions and newly accessible state columns in the docked info DAT.

The callback functions include onBlobTrack() and onBlobStateChange(). onBlobTrack() runs whenever the blob track TOP is currently tracking a blob, and provides information about the blob, including the id, normalized x and y position, width/height, and age (time in seconds that the blob has been active). onBlobStateChange(), on the other hand, only runs when the state of a blob changes. The function has access to the same info as the onBlobTrack() function, but additionally has an additional state field, which can tell you whether a blob is new, revived, lost, or expired.

Similarly, the docked info DAT provides access to the state change information found in the callbacks. New columns corresponding to the active, lost, revived and expired states have been added, along with columns for age, lost_time, and expired_time (which provide time values).

For comparison, take a look at the old blob track TOP below and the new version that follows: that’s a lot of useful new functionality!

The previous version of the blob track TOP and its info DAT
The updated version of the blob track TOP, with new callbacks DAT and info DAT (expanded to show new columns)

All of these functions provide excellent new tools for keeping better track of blobs, including after the tracking has been temporarily lost or the blob has expired. Besides that, it provides an opportunity to build out new complex functionality using the callback functions along with the new state information.

Particle SOP Updates

In build 2022.29850, the particle SOP received a new python method to create a specific number of particles. We covered this functionality and built a cool effect around it in a recent blog post, but for those who haven’t seen it yet, it’s worth looking at!

The function createParticles() allows you to generate a specific number of particles, and then returns the results as a modifiable list. You can then modify the attributes of the generated particles directly, including their normals, velocity, life, color, and more! It’s an exciting new way to build triggerable functionality into particle systems.

If you’re looking to see an example of this in practice, check out the recent article Generating Particles with Python in TouchDesigner!

Particles generated and modified with the createParticles() method

Timer CHOP Updates

The Timer CHOP received some updates in 2022.31030, mainly focusing around the goTo() function and some new members for accessing different forms of time.

The goTo() function updates include:

  • Scrubbing with .goTo() no longer affects running count values
  • Playing count timers and cumulative timers no longer jump during .goTo() scrubbing
  • When .goTo() results in restarting of timers, cumulative/playing/running counters are reset
  • New members to access playing and cumulative time in different units (.cumulativeFrames .cumulativeSamples .cumulativeSeconds .cumulativeTimecode, .playingFrames .playingSamples .playingSeconds .playingTimecode)

What does this mean? Well, for starters, the goTo() function should work more reliably and not interrupt functionality based around the running count values. The new members make it a lot easier to access the playing or cumulative time for building/trigger functionality, in whatever time format you need! With these features, the already useful timer CHOP becomes that much more so.

Get Our 7 Core TouchDesigner Templates, FREE

We’re making our 7 core project file templates available – for free.

These templates shed light into the most useful and sometimes obtuse features of TouchDesigner.

They’re designed to be immediately applicable for the complete TouchDesigner beginner, while also providing inspiration for the advanced user.

Table DAT Updates

In 2022.31030, the table DAT received the ability to easily create/fill rows and columns. A new page called Fill has been added to the parameters, and the previously available ability to set the dimensions of the table has been moved there. Some additional functions have been added as well, including:

  • Generating multiple rows and columns with specific headings, and the ability to fill the cells
  • Generate multiple sets of new rows and columns with the sequential parameter
  • New expressions me.subRow and me.subCol, which allow you to access the row or column index of the cell that is being filled. This is useful for building expressions that generate different data depending on the cell’s row or column.
  • New OP Snippets for these features

The new Fill page is shown in the example below, along with the Fill by Column option that allows you to easily generate new columns of data (complete with labels for each column!). In the Cell Expression 0 parameter, the new expressions me.subRow and me.subCol are used to illustrate how it’s possible to access the row and col index of the new cells being generated. Note how in this case the row values output into each cell are offset from the cell’s actual position within the table.

The new Fill page, showing the Fill by Column mode.

It’s well worth taking a look at the OP Snippets for the Table DAT to see more examples of these powerful new features in action! Another cool thing to note is that the similar features have been added to the Insert DAT as well, allowing you to fill new or replace existing rows/columns with expressions.

Wrap Up

Hopefully you’re excited to dive into these new features (if you haven’t already done so)! As usual, we’ve only scratched the surface in terms of all the changes that have been made to the 2022 release, and a full list can be seen on the Release Notes page of the TouchDesigner wiki. One final note of caution, if you’ve got a deadline coming up in the next 90 days or so, it’s probably best not to rely on any of the freshly added features as bugs may still be lurking. That said, it’s definitely worth checking out the above features — experiment to your heart’s content!