The next thing we’re going to build is going to use our next set of operator families which is DATs. DATs are the data operators we can use to create tables and texts, and this is how you will probably work with a lot of web APIs and Python.
What we’re going to do is make a slider controlled pre-set system so that we can drive a Text TOP’s text as well as the text styles of it dynamically.
Go to your OP Create Dialogue and create a Text TOP operator.
We want to dynamically drive the text that’s inside this Text TOP. To do this, first make a Text DAT.
You can think of a Text DAT like a word pad or a little Microsoft Word without any of the other features.
When you activate the viewer of the Text DAT, you can start typing inside of it, and it’s going to save that text in there.
You can manipulate it later with more DATs, and you can reference it for different things, which is what we’re going to do here. We’re going to use a Text DAT as our text storage for our Text TOP. For now, type a few words into your Text DAT.
Remember, before we start referencing any kind of data between operators, it’s always important to put a null. So, create a Null DAT after your Text DAT and connect them.
Next, go back to your Text TOP and delete the default “derivative” text.
Then go to the DAT parameter of the Text TOP. Essentially what this does is you can reference a DAT in here, whether it’s a table or a text, and then you can select text out of it to render in there instead of having to manually type the text inside this parameter.
In this case, drag and drop your Null right onto that parameter. And you’ll see that your text looks clipped on both sides.
To fix this, toggle on the word wrap parameter of the Text TOP. This will automatically figure out when those break points are and wrap the text. It’s very useful because it’s dynamic, so if you go back into the Text DAT and type more words in, it’ll still try to word wrap as best it can.
If you notice that the text is still getting clipped on the top and bottom though, go to the font parameters of the Text TOP, go to auto size font and select “autofit always”. That way, the text will also dynamically resize so not only is it getting word wrapped on the left and right edges, but it’s getting resized in case it becomes too big.
Right now, if you middle click on the Text TOP, you’ll see it’s 256 by 256. Personally, I think that’s a little bit small. So go to the common parameters page and change the resolution to be 720 by 720. We want to do that because we’re going to composite this text onto another video, and if the video is 720 we want a nice square with text in the middle of that video.
Next, copy and paste your Text DAT a few times and add different text inside of each one.
Now we need a way to switch between these different Text DATs and have them go into the Null, which then gets referenced by our Text TOP. Luckily we have a really useful DAT we can use for this called Switch DAT.
Open up the OP Create Dialogue and create a Switch DAT.
We’re going to plug all of these Text DATs into the Switch and then use the index parameter to switch between them.
The slow method is to plug them all in one by one. But there’s a nice trick I recommend, where if you right click and drag and select all the operators that you want to connect, all you have to do is connect the first one and all of them will get automatically connected.
When you’ve got them all connected, take a look inside of the Switch DATs viewer and as you change the index parameter, you’ll see it changes the text depending on what input that index number is (index zero will show you the text of the first Text DAT because remember everything in TouchDesigner starts at an index of zero).
Plug the Switch DAT into your Null, and then as you change the index, the text getting rendered in the Text TOP updates.
Now that we’ve got our tech set up, we can work on some of the formatting.
Very similarly to how we set up our Text DATs going into a Switch DAT, going into a Null, we’re going to set up a similar system but with tables.
This can be thought of as a really simple preset system. It’s not the most efficient one, but if you’re a beginner and you’re just trying to save a few different states for something like a Text DAT or maybe movie files, this is not a bad system to use.
A Table DAT functions like a Text DAT except you can add more rows and columns. Each cell is essentially the equivalent of a Text DAT but inside of a cell.
Create a Table DAT, and activate the viewer so you can interact with the data inside.
Right click on the first row number (which is zero), and hit Add Below, which will add a new row, and now you’ll have two rows in one column. Do this a couple more times so that you have four rows.
Then, right click on column zero, and hit Add After which will then add a second column for you.
Click inside of a cell and you can start typing. In the first row of your zero column, type “colour red”. In the next row, type “colour green”, in the third row type “colour blue”, and in the final row of that column type “opacity”.
Our first preset is just going to be white text, so in your column one, type 1 for each of the colour rows, and 1 for full opacity.
Now, turn off the viewer, and copy and paste it four times for our four presets. This way, each one of our text objects will have a preset of its own.
Edit each of the tables you just copied. Make the second preset red text, so change the value of the blue and green colours to zero, but leave the opacity full.
For the third preset, make it zero for red, 0.5 for green, 0.7 for blue, and keep the opacity full.
Finally for the last one, we’ll do something more subtle, so make it 0.3 for red, 0.3 green, and 0.3 blue (so it essentially becomes a dark grey) and then set the opacity down to 0.3 (so it kind of fades into the background).
Now that all your values edited, turn off the viewer active state on the tables.
Just like we did with our Texts going into a Switch, we’re going to do the same thing with our Tables. Create another Switch DAT, right click and drag around all your tables, connect the first one, and automatically they’ll all get connected.
The same principle with the index parameters applies to tables connected to a Switch DAT too. With an index of zero, we get the contents of the first table, if you set an index of one then it switches to the contents of the second table, etc.
Now what we want to do is line up the presets with the text. So we’re going to make a little controller that’ll control these indices.
For this, we’re going to use some of what we learned and used in our COMPs operator families lesson.
The first thing you’re going to do is make a slider, then make a Null CHOP after it and connect them. Currently, the value of the slider goes from zero to one, but we actually want it to be from zero to three (because we have four presets).
Insert a Math CHOP in between the slider and the null, and change the “to range” to go from zero to three.
The value currently coming from the slider into the Math is what we call a float. A float is basically just a number with decimals in it. That’s not going to be useful for our switch because the Switch DATs don’t interpolate.
We need to round our number as well, so that it’s not sending decimals, but sending a whole number that will accurately map to each one of the indices.
Our best friend Math CHOP can also round for us! Insert another Math CHOP in between the first Math and the Null.
On the first page of parameters you’ll find one called integer. Click on that and select “round”. Now you’ll see as the gradient float value changes when you move the slider, coming out of the output you actually have a rounded integer.
Like we’ve done with everything else before, to control the parameter of this Switch DAT’s index select the Switch DAT so you see its parameters, activate the viewer on your Null 2, drag and drop that channel right onto the index parameter, and choose Relative CHOP Reference.
Now do the same thing for the first Switch you made. Select it, and then drag and drop the null value again onto the index and choose the second option.
We can’t blend values in DATs because DATs are really focused on string type of data, Python, etc.
But what we can do is convert this data from the DAT family back into channels, and then use some of the techniques we used with our CHOP networks, like using Lag CHOPs, Filter CHOPs, things that will smooth the transition between two values.
This is actually relatively easy to do in TouchDesigner.
As always before we make any big jumps, we’re going to set a checkpoint here by creating another Null DAT.
Now we’re ready to do our data conversion. First, create a DAT To CHOP (you’ll find it under the CHOPs page of the OP Create Dialogue).
This DAT To CHOP that we’re going to use takes DAT data and converts it to CHOP data.
The DAT parameter of the DAT to CHOP wants to know the name of the DAT that you want to convert. So, drag and drop your Null 3 right onto the parameter (by now I hope you’re seeing the pattern here where a lot of things are drag and drop).
You’ll see one of those little dotted line with an arrow is created, telling us that there’s a reference happening. However, this time it’s not animated, because this information isn’t changing.
The way we’ve set up our table corresponds to basically exactly how the default settings of the DAT To are set up.
You can see we have our first channel which is colour_red (it doesn’t like spaces, so it replaces them with underscores).
If you go back up to your slider and change the values, you’ll see you now have this dynamically changing CHOP value operator.
So now that we’ve converted that data back into CHOPs because it’s all numeric data, what we can do is use some of those things like filter.
Add a Filter CHOP after the DAT To, then set the filter width parameter to be three seconds.
Move the slider now between a couple of indices, and you’ll see the nice smooth transitions between those two presets on the Filter CHOP.
In less than a few minutes, we rolled our own simple preset system that you can use with numeric data for parameters, so that’s awesome!
Put another Null CHOP after the Filter, then go back to your Text TOP and make sure you can see the colour parameters page.
Activate the viewer on your latest Null CHOP and drag and drop the parameters to reference them.
Take the red value, drop it onto the first font colour parameter (the R value), take the green over to the second font colour (the G value), take the blue over to the third font colour (the B value). Finally, reference your opacity value over to the font alpha parameter.
Turn the little display flag on your Text TOP so you can see your texts in the background. Play around with the slider and watch it do it’s state changes, text changes, colour changes, and opacity changes.
The final thing we can do here is create a Movie File In TOP so we can have a nice dynamic background. Use the plus button on the file parameter to open up the file chooser, go into the nature folder where there’s a few 720p stock nature shots and choose one.
Then create an Over TOP, put the background as your movie, and put your Text TOP into the first input on top of it, and change the pre-fit overlay to native resolution.
Turn off the display flag on your Text TOP now, put a Null TOP at the end of this chain and turn the display flag on that on.
Now when you move the slider, as the values are changing and the presets are changing, we can see them live on the background, like in this GIF here:
You can edit this to make this whatever you want. Maybe you only want to have one text and you’re just changing styles, or you want to change the amount of time it takes for that transition. You can also have multiple texts, you can have more advanced compositing, whatever you like. The sky’s the limit here.
We only did it with some styles but you can do it with all the parameters you want, there’s no limit on how much data you can store on a table.
This should give you a good introduction to DATs. What I hope you’re starting to see is that with using little pieces of functionality from each of the operator families, we’re starting to add to the complexity of our networks.
We have some TOPs that are doing some compositing and rendering of 2D objects, we have a handful of DATs holding some data, then they get converted into CHOPs. We know that we can use CHOPs to smooth out values, and we have a little controller for our presets using some COMPs and some CHOPs.
As you explore TouchDesigner more and more, you’re going to always want to try and take your idea and think about the simplest blocks that could make that idea, because that’ll make it easier for you when you’re trying to build these networks.
Now let’s move on to our next operator families: SOPs and MATs.
I possess a deep knowledge in many professional fields from creative arts, technology development, to business strategy, having created solutions for Google, IBM, Armani, and more. I'm the co-founder of The Interactive & Immersive HQ. Yo!
Building off of previous Python workshops, this class aims to demystify a few of the elements often used when doing advanced Python development work in TouchDesigner. From using storage to writing your own extensions we’ll work through the several concepts that will help you better leverage Python in TouchDesigner for installations and events. From the conceptual to the concrete, by the end of the workshop you will have both worked with abstract concepts in the textport and created a functioning tool for saving presets.
Matthew Ragan
We all know user interfaces in TouchDesigner are hard. If you’ve taken our Perfect User Interfaces training you’ll know all the ins-and-outs of creating your own user interface elements from scratch. But what if you need a UI made quickly? What if you want to skip building your own UI pieces? Widgets to the rescue! Widgets are the new and powerful way to make user interfaces quickly and easily in TouchDesigner. What they lack currently in their customization, they make up for in speed of deployment and out-of-the-box features that are easy to access through their custom parameters. Combined with new features to TouchDesigner such as bindings, creating quick, scaling, and aesthetically-pleasing user interfaces is a breeze. .
Everyone has seen pictures of TouchDesigner projects with hundreds of operators and wires all over the place. Impressive, right?
No! In fact, the opposite is true. If your projects look like this, you’re seriously hampering your TouchDesigner installations – and your potential to consistently get high-profile gigs:
If you want to create large-scale installations or consistently work on projects in a professional capacity, you need a project architecture that is clean, organized, and easy to use.
The best project architectures – those used by the pros – are so streamlined that they make programming TouchDesigner look boring.
I share how to do this in my training, “TouchDesigner Project Architectures for Professionals.”
In “TouchDesigner Project Architectures for Professionals”, I give you my exact project architecture system – the same system that’s made it possible for me to create installations for Nike, Google, Kanye West, Armani, TIFF, VISA, AMEX, IBM, and more.
With my project architecture system at your disposal, you will:
We accomplish this through my 3 core project architecture concepts:
I’ve spent over 8 years refining my project architecture into an easy-to-implement, repeatable system that any designer can use. Once you learn my system, you’ll be able to take on projects you didn’t think you were capable of. You will also have the confidence you need to land better gigs and meet challenging client demands with flexibility and ease.
Want to level-up your TouchDesigner skills and create projects that can intelligently make content and generative decisions using weather and climate data?
How about installations that span forty-story high-rises that use Twitter posts to prompt generative designs?
Big clients – with big budgets – demand a level of immersion deeper than the use of Microsoft Kinect and Leap Motion interaction. They want to integrate social media, custom web apps and their own CMS to create interactive installations that bring people together in a way they haven’t experienced before.
In short, they want to use technology to become part of the broader conversation.
Fortunately for us, we’re able to deliver this level of immersion by integrating external data sources into our TouchDesigner projects.
The catch? Bringing external APIs into TouchDesigner can be challenging:
That’s why I created my latest training, “Join the Broader Conversation: How to Use External Data and APIs in Your TouchDesigner Installations”. Made for the complete Python beginner, the training provides you with everything you need to begin integrating external data sources with your TouchDesigner projects.
When you’re done you’ll be able to charge more and secure bigger projects than you would previously.
In this 1.5 hour video training (which includes example project files), we will:
Without any guidance, I’ve found that learning to integrate external data natively into TouchDesigner takes new designers between 20-40 hours – and that’s not including the trial and error phase that comes with implementing these concepts for the first time. Many people quit out of frustration.
Want to avoid spending $50,000+ on the wrong computer hardware?
Or having to look your client in the eye and say “I don’t know” when they ask why their shiny new immersive media installation looks like a stuttering, jaggy hot mess?
Then you need this training.
When I first started working with TouchDesigner in 2011, I thought the most valuable skill I had to offer was my ability to code beautiful interactive and immersive media projects for my clients.
While this IS important, I quickly realized that that what my clients valued most was my ability to create an installation that performed perfectly – no tearing, stuttering, judder, or any other issues. If you think this sounds easy, you haven’t been working with Touch long enough.
This is one of the reasons my clients pay me $1,500 per day.
When I first started, I encountered all the issues mentioned above. I overcame them with a combination of all-nighters, hiring the right (and expensive) experts, and in some cases, luck. I also wasted a lot of time and money.
With experience, I was able to preemptively solve for all these performance issues.
That’s why I created the “Creating Flawless Installations with TouchDesigner” training. Now you can benefit from my 7+ years of experience without having to make the costly mistakes I did.
After this training, you will have the confidence you need to deploy immersive design and interactive technology installations for big brands who pay top dollar for your skills. And you’ll be one of the select few individuals in this industry that know how to do what I do with TouchDesigner.
In this 1.5 hour video training (which includes example project files), we will cover:
Want to create large-scale video arrays and real-time LED facades that span high rises?
How about installations that use GPU particle systems, volumetric lighting, and multi-composite operators?
As lots of you know, this is all possible with TouchDesigner – sort of.
Out-of-the-box TouchDesigner is great when you’re just starting out. But as your interactive installations grow larger and your clients begin to want more generative and technical content, there are several challenges that arise and the cracks begin to show.
Problems typically fall into two broad categories:
When problems due to scale such as these inevitably occur, the standard TouchDesigner functionality and nodes only gets you so far. And it doesn’t take very long before you have to explain to your client that you’re unable to deliver what they’re asking for.
Lucky for us, we can leverage the code that powers a lot of TouchDesigner to create installations of virtually unlimited scale and technical possibility.
We do this by learning how to program GLSL Shaders. GLSL is the programming language on which many of the features of TouchDesigner are created even now.
When you understand how to apply GLSL to TouchDesigner, you’re effectively turning on “God Mode.”
That’s why I created my training, “Turn on God Mode in TouchDesigner with GLSL Shaders.” In it, I cover the following concepts:
TouchDesigner is the leading platform for interactive media and immersive design, and is used to create the world’s largest installations. Elburz Sorkhabi explores and explains concepts in TouchDesigner revolving around network optimization and performance bottlenecks.
The user interface (UI) is an integral part of any TouchDesigner installation.
Most clients want dynamic installations that they can control as needed, without consulting a designer or programmer for every change. This is usually through a control panel and UI they can access.
Even more important are user-facing UIs – think interactive panels, turntable additions for live shows, and customizable remote controls. This is what many clients have in mind when they decide to contract someone to design an interactive installation.
But if UIs are so central to TouchDesigner installations, why is it so hard to make them not suck? Most UIs slow down installations and break when you try and resize a component or add multiple pages. They’re also ugly.
So as always, I’m fixing the problem by providing a training.
In my latest 2-hour training, you will learn how to:
A great TouchDesigner installation needs a great user interface. Get the training you need to provide professional UI for top clients today.
Elburz deep dives on all the the inner workings of Python in TouchDesigner. This introductory course takes you from the very beginning of your Python journey and explains concepts that will create a powerful foundation for all your Python scripting in TouchDesigner.
Elburz deep dives on all the the inner workings of Python in TouchDesigner. This introductory course takes you from the very beginning of your Python journey and explains concepts that will create a powerful foundation for all your Python scripting in TouchDesigner.
Ever wonder how TouchDesigner pros work so fast? Ever see a friend or colleague do something and think “How did you do that??” Elburz puts together the top tips and tricks that everyone needs to know when working with TouchDesigner. Speed up your workflows and explore undocumented features across both the application and each operator family.
Want to level up your TouchDesigner skills and create dynamic 3D installations with interactive elements that can scale from single to multi-touch and virtual reality – all without changing anything about your setup?
Are you still trying to use 2D interactive hotspots and invisible UIs in your 3D TouchDesigner installations?
If this sounds like you, I’ve got good news and bad news.
The good news is that you’re not alone – this is how most designers start out (even some experts get away with it). It actually works okay if your 3D installations are static and the interactions are simple.
The bad news is you’re going to miss out on rich, dynamic and complex 3D projects. Anyone who has tried to create dynamic interactive 3D elements using invisible 2D UI hotspots to trigger interactivity has seen this firsthand.
Fortunately, TouchDesigner lets us use render picking to integrate 3D interactivity directly into our projects:
But render picking isn’t easy. It requires unintuitive Python scripting techniques. And to implement effectively, render picking assumes a deep understanding of TouchDesigner and the connection between instancing and multichannel manipulation of data.
It’s with this in mind that I created the “How to Create Multi-Touch 3D Installations Using Render Picking” training. In this training, I teach how you how to use Python to build native 3D interactivity directly into your 3D TouchDesigner installations.
In this training, you will learn:
The best is that I’m offering “How to Create Multi-Touch 3D Installations Using Render Picking” for $125.
Note: this training is the same content as the previous “3D Interactivity with Render Picking” training, but it has been upgraded and re-recorded. If you already bought that one, you already have access to this new one!.
Learning TouchDesigner can be difficult for anyone, no matter what background you have. With all the new terminology, hundreds of operators, and unique paradigm, new users can become overwhelmed and paralyzed. In this training, I take you on a 3 hour deep dive of TouchDesigner’s basic features, fundamentals, and walk you through small example projects to introduce you to the operator families. This course sets you up to take on any of the intermediate trainings available.
Everyone always complains about the wiki. It’s hard to use, that’s a fact. What about all those hidden tutorials? And how about gigs? Where are those? Blogs and videos, where can I find those? For the first time ever, this training compiles all the TouchDesigner resources available and guides you not just in finding them, but also how to find future resources.
Want to create TouchDesigner installations with objects that interact with each other, human participants, and the environment? How about 3D scenes with objects that respond to natural forces?
Whether you’re interested in the above or are just tired of your TouchDesigner projects looking like a video game from the early 90s, the answer is Physics.
Physics is the key to unlocking a new level of realism and natural interactions in your TouchDesigner installations. Put plainly, it brings a new level of immersive fidelity and consistency to interactive installations.
But getting physics right in TouchDesigner is an uphill battle:
You can spend days, weeks, or even months trying to learn this stuff. Or, you can gain an understanding of the fundamentals in just over 2 hours with my latest training, “Physics Fundamentals: Use Physics Like A Pro in TouchDesigner.”
In “Physics Fundamentals” I give you everything you need to start leveraging physics to create interactive and immersive TouchDesigner projects of the highest caliber.
In “Physics Fundamentals,” you get:
When you’ve finished “Physics Fundamentals,” you’ll be able to add physics – one of the most in-demand TouchDesigner skills – to your interactive and immersive media repertoire.
How many times have you been on a gig and been screwed over because you didn’t have a contract in place? How often have you wished you could properly negotiate or knew the finer points of what you were actually signing? In this workshop, you’ll learn about the most common types of contracts, what all the sections mean, and how you can change them based on your requirements. The included templates give you a great reference whether you’re just getting your career started or if you’re a seasoned pro and want to review your own contracts.
Everyone has had a client ask them to make something cool with a Kinect 2. Where do you being? What can you make? Will it be hard or easy? How do we combine the Kinect info with regular TouchDesigner work that we have to do. In this workshop, I introduce you to the fundamentals of using the Kinect 2. This includes initial setup, using the invaluable Kinect Studio 2.0, demonstrating the common uses of Kinect 2 in TouchDesigner, and then talking through many of the common hardware pitfalls when using a Kinect 2 for a project.
Have you ever used high-density geometry and models in TouchDesigner to create the visually jaw-dropping interactive installations of your dreams, but come up short? You’re not alone. Creating fully functional 3D installations that look amazing and let users interact with them in real time is a major sticking point along most folk’s TouchDesigner journey.
In fact, I’d say that it’s nearly impossible to get right without knowledge of one tool: GLSL.
When you understand how to apply GLSL, you can create 3D installations on a massive scale, work with high density point clouds using sensors, and manipulate complex geometry in real time for truly interactive, large-scale immersive projects.
Over the course of 1.5 hours, this is exactly what you’ll learn in “God Mode in 3D: GLSL For 3D TouchDesigner Installations”. Through real-world examples and instruction, I give you the tools you need to begin working with GLSL in 3D today.
Note: We touched on the basics of GLSL with a focus on 2D work in a previous training, “Turn On God Mode in TouchDesigner With GLSL Shaders”. If you’re new to GLSL, I highly recommend you click here to get that course, and view it before viewing “God Mode in 3D”.
Here’s exactly what you’ll learn in “God Mode in 3D”:
For many, leveraging GLSL in TouchDesigner is the most critical step towards becoming a professional TouchDesigner developer. It’s one of those skills that separates the amateurs from the pros.
Fortunately, it’s a skill that can be acquired relatively easy with practice and the guidance provided in “God Mode in 3D”.
SOPs are tough, there’s no getting around that, but they aren’t impossible. What most people lack is a fundamental understanding of how SOPs work and the data structure that drives them. With this knowledge in hand, it’s possible to do great things with SOPs. In this training, Elburz takes you from SOP ground-zero through to making some SOP data visualizations and particle systems with attractors and metaball forces.
Getting gigs can be hard. Even something as simple as figuring out the budget can be a challenge. Whether your new to the industry or a seasoned pro, there are many factors to consider in pricing. To add even more on your plate, once you have a price, you still have to put together a nice presentation to pitch the project. In this workshop, I take you through the common process of pricing and pitching a gig to win it as quickly as possible.
Machine Learning (ML) completely transforms the capabilities of TouchDesigner.
In fact, it might be the single most important development for interactive tech and immersive media in years.
Why?
Well, most TouchDesigner developers are used to standard computer vision, which requires you to program very specific rules for every bit of data your installation ingests. If the data varies even slightly, the rules must be reprogrammed, or the installation can break.
With ML, a new relationship between data inputs and their outcomes is created. Instead of programming a set of specific rules, large datasets are fed to your computer that “train” it to understand it’s environment.
For example, without ML it’s almost impossible to get your TouchDesigner installation to recognize faces of people with hats, glasses, or beards, because there are just too many variations to create rules for. But with ML, you can train your installation to recognize what a face is by having it learn from millions of images of people.
And this is just the tip of the iceberg. From realistic landscapes generated using millions of data points, to style transfers that look just like a Monet, to near-limitless skeleton tracking, ML blows open what is possible with TouchDesigner.
But like most things interactive and immersive, it’s not that easy…
To solve these problems, I created the training “Machine Learning For TouchDesigner.” In it, I demonstrate how to leverage ML to the fullest using TouchDesigner and a program called Runway ML.
For those unfamiliar, Runway ML is an application that allows you run ML models both locally and even on their own Remote GPU cloud resources that eliminates the need for you to have custom software or hardware to leverage machine learning.
I love Runway ML so much that I’ve been collaborating with the co-founders on educational materials, and they were generous enough to offer anyone who purchases this course a $20 coupon code for remote GPU processing, which equates to over 6.5 hours of processing time.
Here’s exactly what you get in “Machine Learning For TouchDesigner”:
By the end of “Machine Learning For TouchDesigner”, you’ll have everything you need to leverage machine learning in your TouchDesigner installations immediately.
Prerequisites: To get the most out of this course, you should already have a good fundamental understanding of TouchDesigner, as well as Python and how it is used inside of TouchDesigner. We recommend our TouchDesigner 101 and Python 101 for TouchDesigner courses.