Abstraktion is a TouchDesigner system designed to automatically generate a multichannel and multiformat mixer. While there are many excellent mixing systems designed in TouchDesigner, they mostly tend to focus on mixing a single type of media such as video. This system has evolved out of my own attempts to mix multiple formats over the past 2 years, and earlier versions were used in my shows MIDNIGHT and CATHARSIS.
To understand the design choices behind the system, I need to explain my personal TouchDesigner workflow. I like to create electronic music mixes, extract pitch and frequency data from each song, and then use the extracted data as input for systems that control physical outputs, such as projectors, LED nets, and DMX fixtures. So essentially, I have a number of inputs that need to be mapped to a static number of outputs, but instead of having a single, static mapping, I have different mappings for each song or section of the performance.
I will explain Abstraktion by walking through a hypothetical performance. Let's assume we have an art performance with 3 discrete sections in a room with a main visual projector (720p), a ceiling mounted projector (SVGA) for volumetric projections, LED par cans at the bottom corners of the room, LED bars uplighting a single wall, and moving heads mounted on the ceiling.
I would consider these to be 3 different categories of fixtures. The projectors both need 2D image data, so we can mix using TOPs, just like a standard VJ program would mix between videos. Next, let's assume we only want to control the color and brightness of the par cans and the bars, and we don't need any additional DMX activated features like strobing. In this case, we can also use TOPs to represent the RGB data, where each TOP pixel is a single RGB fixture (par can) or RGB subsection of a fixture (pixel in a LED bar). After our mixing, we can convert the TOP data to CHOP data to output to our DMX network. For the moving heads, a different strategy is needed. We could represent the color data with a TOP, except that there are many parameters other than color for a moving head, and moving heads tend to express their color as a single DMX channel selecting from a finite list of colors, rather than 3 channels for RGB like regular par cans. For this performance, I will have a different set of moving head mappings that switch directly between the different scenes. So a switchCHOP will be most appropriate.
So let's start using Abstraktion! An alpha download is available here:
To start, we'll define the settings we just described in the 'channel_settings' tableDAT.
The opType determines how all of the scenes will be combined. Right now, only composite and switch are explictly coded, but the script is easy to modify to include more types. If the opType is a composite, the operand field sets the composite operation. The resolutionW and resolutionH sets that resolution at various points throughout the mixer to ensure any differing inputs are resized correctly.
Next we'll define our scenes, or different states of the performance. I want to have 3 discrete sections, and also a set of mappings for before and after the performance, so I'll modify the scenes in the 'scene_settings' tableDAT.
Now Abstraktion and create the mixer. First, we have to generate the mixer interface by pressing the 'Update Mixer Interface' Button. This creates a series of in, out, and resolution nodes that are standardized within a container so that the generated mixer can find the right CHOPs and TOPs whenever a scene clones them.
Next, we need to generate the mixer from these settings. Press the 'Create Mixer' button next, and Abstraktion will generate the nodes needed to mix our channels together in the 'mixer_core' container. All of your scenes' outputs will be automatically selected in here.
Now we can put some sample content in our scenes. In the 'Red_theme' scene, I'll route a static red color to the projector and bottom pars, a scanning red light to the bars and volumetric projection, and a simple lfo to the moving heads, all by simply connecting to the corresponding inputs on the 'OUTPUT_INTERFACE' container within the scene.
I'll do a similar thing in the other scenes. I'll also attach the outputs of the mixer to some Null Operators so we can see the output, though usually I would attach these to containers mapping this output data to the actual projectors and DMX fixtures. Now if you press the 'Open Viewer' button, a simple GUI I made will appear. I typically interface my midi controller directly to the mixer without a GUI, but this should give a much better idea of how the system can be used. I'll discuss how to directly control Abstraktion with a midi controller in a future blog post, the values from the GUI are simply being inserted into a tableDAT read by the mixer. Also, note that the 'mixer_gui' container has custom parameters to adjust the channel height and width, and the lag of any knob input.
Now you can fade in every single scene on every single device at will! For the channels configured as switches, the buttons will act as radio buttons to switch between the scenes. The Disable cooking will turn the 'allowCooking' flag to 'False'. This is useful to only turn on the scenes necessary for the current performance output.
In my next blog post, I'll discuss how to combine this system with OSC data from Ableton, and strategies for interfacing the output to physical fixtures such as projectors and DMX lighting. I'll also talk more about the strengths and limitations of my approach and the Abstraktion system in general. If you try it out, please leave a comment with your experience. This is a work in progress, so any feedback is useful.