In the previous posts in this series, we looked at useful TOPs and SOPs. Now that you’ve got working with 2D textures and 3D geometry under your belt, what about creating control channels or adding interactivity? CHOPs, short for Channel Operators are TouchDesigner’s operator family for processing motion, audio, math, logic, MIDI data, and other input data from a variety of devices. Not only can CHOPs be used to retrieve data from devices, but they also have a wide range of functionality for processing the data as well. In this post, we’ll take a look at a number of useful CHOPs in TouchDesigner, including operators that are used for generating and processing CHOP data.
Useful Generator CHOPs
Generator CHOPs cover a wide variety of functionality, from generating CHOP channels, to loading in data from files, to receiving data from input devices. If you’re looking to create CHOP data (as opposed to processing it), you’re likely going to need a generator CHOP!
Constant CHOP

For our first generator CHOP, we’ll start (seemingly) simple. The Constant CHOP comes in handy more than you’d think, allowing the easy creation of new CHOP channels.

One feature of the Constant CHOP that tends to fly under the radar is its ability to create a snapshot of the channels connected to the first input. Connect a CHOP to the input, press the Snapshot Input pulse button, and you’ll replace the Constant CHOP’s contents with a copy of the input’s current channel names and values. It can be very useful for recording presets!
LFO CHOP
The LFO (low frequency oscillator) CHOP creates waveforms in real time. It can generate typical sine, square, ramp, and pulse waves, but can also repeat a custom waveform that you create (see image below)! It provides controls for the frequency (rate) and amplitude of the signal, which often can be enough to adjust the signal to your needs.
Noise CHOP
The Noise CHOP creates semi-random waves in the range -1 to 1. It can be great for adding a bit of randomness into your CHOP channels! In the default configuration, it creates a single multi-sample CHOP channel, but it’s not limited to just creating a single channel. You can use the channels page to create multiple channels. The new channels won’t be a duplicate of the original, either — each channel will contain different data.
Timer CHOP
The Timer CHOP is a feature-packed operator for running timed processes! Besides the (expected) ability to run a single timer for a specific length of time, it can also run multiple timers in series or parallel, and trigger Python code at specific events with the associated Callbacks DAT.
Audio Device In CHOP
The Audio Device In CHOP allows you to receive audio from any attached audio input device, and outputs the audio as time-sliced CHOP data. It’s great for receiving audio from things like microphones, webcams, or portable audio devices, but even can receive analog control voltages (CVs) if you audio device supports it!
If you’re looking to instead load/play back an audio file, check out the Audio File In CHOP.
Keyboard In CHOP

One of many CHOPs dedicated to receiving user input, the Keyboard In CHOP outputs CHOP channels representing the state of a user-defined set of keys on the computer keyboard. Press the key down, and the channel outputs a value of 1, release the key and it goes back to zero. The Keys parameter allows for the selection of multiple keys, as well as add in modifier requirements like Alt, Control or Shift. For more input-related CHOPs, check out the Mouse In CHOP and the Joystick CHOP.
MIDI In CHOP
The MIDI In CHOP is great if you’re looking to use a MIDI controller to control parameters in TouchDesigner. It not only supports typical MIDI CC and Note events, but also receives Program Change events, as well as System Exclusive and Timing messages. It’s also worth checking out the MIDI Mapper Dialog and the MIDI In Map CHOP.

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.
Useful Filter/Effector CHOPs
Unlike generator CHOPs, filter CHOPs generally process CHOP channels created by other CHOPs, and will thus need a CHOP connected to their input(s) to function.
Math CHOP
Another seemingly simple CHOP to start off our Effectors section, but one that you’ll return to time and time again. The Math CHOP can perform all kinds of mathematical operations on your CHOP channel’s data, including the usual addition/subtraction/multiplication/division affair, but also can be used to re-range data and compare channels (i.e. find the channel with the minimum or maximum value, and output that value). You can also use it to combine CHOP channels and multiple CHOPs using a number of operations.

Filter CHOP
The Filter CHOP can be used to smooth or sharpen incoming data. In the default state, it’s great for smoothing out large changes in the incoming CHOP channels, as shown below. Also check out the Lag CHOP.
In this second example, the Edge Detect filter type is used, which detects sharp changes in the incoming channel.
Count CHOP
The Count CHOP counts the number of times that a channel crosses a trigger or release threshold, which defaults to 0 (but can be adjusted via the Trigger Threshold parameter). Instead of counting upward infinitely, you can set limits for the count, and have it either loop or clamp when the limit is reached.
Trail CHOP

You’ve seen it in a number of the examples above, so it must be useful! The Trail CHOP displays a history of its input channels. It’s great for getting a sense of how your CHOP channel actually changes over time. You can connect up to four CHOPs to the Trail CHOP at once, which means you can keep track of a lot of channels!
Lookup CHOP

The Lookup CHOP outputs values from a lookup table at an index that you specify. By connecting a CHOP to the first input, you can tell the Lookup CHOP which index to pull from the table. It can be very useful for “playing back” recorded data, and also allows for the decoupling of time data by enabling you to choose the speed that the index value changes at.
Wrap-Up
As usual, this is just the tip of the iceberg for the CHOP family! There are many more operators worth mentioning here, but, well, we had to stop somewhere. We hope that this post has given you a sense of some of the great functionality that the CHOP family has to offer.