Tillman Jex |||

The Fog - Film Score

When the film is released, I will post a link here!

The Fog is a short film directed by Gianna Mazzeo, which handles the topics of climate change, coming of age and procreation. The project is currently in production. I’ll complete this page with documentation and content after the project is done!

Screengrab from The Fog. Directed by Gianna MazzeoScreengrab from The Fog. Directed by Gianna Mazzeo

The brief for this film score:

Minimal, stripped back, simple yet emotive composition that incorporates avant-garde + futuristic sounds/samples into the mix to allude to the sci-fi world in which the short takes place.

As this brief is very in my comfort zone, I want to experiment some more with my composition setup by integrating the live coding language TidalCycles into my current composition setup comprising of Cubase and Max8.

The signal flow now looks like this:

Studio Signal FlowStudio Signal Flow

Because TidalCycles uses SupperCollider as the audio engine, the quality of DSP is excellent. So for extreme pitch shifting for example, there are some great granular moments to be found. I’ll be using TidalCycles mainly for this, ie extreme effecting and sound mangling.


max patch original
Above is the original max patch. The patch takes audio input and routes the audio to any of four effects units. The effects units parameters are hard coded to be mapped to physical knobs and faders on my Livid DS1 controller. Additionally there is a multi channel midi recording section (top right) and an audio track playback section (bottom right) for playing pre prepared material.

I wanted to rebuild the patch to make it more light weight, take advantage of new capabilities in Max8 (midi mapping and multi channel audio routing) and also clean it up in general by implementing techniques and design choices I’ve learned through my masters studies, namely organisation with classes / objects in object oriented programming (OOP). In the original patch, you can see many max objects with the various colored patch cables attached). Each of these objects is an encapsulated function that controls a specific parameter of the FX unit. This is not very scalable as if I were to add a new FX unit, I would have to increase the amount of outputs in each encapsulated function. Increasing the amount of outputs in this case means increasing the amount of objects and patch cables needed inside the function itself. See figure below:

patch oldpatch old

As said, this makes scalability more arduous. So instead of having one encapsulated function per control, I went about making one encapsulated function per FX unit. See figure below: max patch rebuilt

Not only is it much neater, but if I wanted to add or remove an FX unit, all I would need to do is add or remove its partnered group of functions, encapsulated into one singular max object rather than spread out over many. As well as this I removed the midi recorder, the audio playback section and did a general clean up by using Max8’s multichannel functionality eg mc pack~ 8 and midi mapping instead of hard value mapping parameters.

pre midi mappre midi map primal tap controlsprimal tap controls

TidalCycles / SuperCollider

TidalCycles is a pattern generator. It sends data to SuperCollider where sample playback, synthesizer control and FX manipulation are controlled. In this sense TidalCycles uses SuperCollider as the audio DSP engine. Below is the startup code for my multi channel routing setup from SuperCollider to Cubase Pro 11. Each track (called an Orbit in TidalCycles) gets routed out one of SuperCollider’s stereo channels to Cubase Pro 11.

s.options.device = "Flow Hole";
s.options.numBuffers = 1024 * 256;
s.options.memSize = 8192 * 16;
s.options.maxNodes = 1024 * 32;
s.options.numOutputBusChannels = 26; // total number of channels output
s.options.numInputBusChannels = 2;

s.waitForBoot {
    ~dirt = SuperDirt(2, s);
    ~dirt.doNotReadYet = true;
    ~dirt.loadSoundFiles("/Users/tillman/Library/Application Support/SuperCollider/downloaded-quarks/Dirt-Samples/*"); // these methods load sample libraries for playback.
    ~dirt.start(57120, [4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26]); // These are output channles. ie Orbit 0 of Tidal cycles, controls audio that is subsequently sent out channel 5+6 of my audio device. (Remember we count from 0 in code land.)
s.latency = 0.3;

Cubase Pro 11 and Inter-Application Routing

The Cubase template is setup to send and receive audio from my physical audio interface as well as MaxMsp and SuperCollider. To send and receive to SuperCollider and MaxMsp I’m using BlackHole, which is an open source inter-application audio router for Mac (with future plans to develop for Windows). In order to simultaneously use my phsical audio interface as well as BlackHole I combined them into an Aggregate Audio device.

Up next “Shortcut” - First Term Masters Project WOMB Installation
Latest projects PDF Correlator with doc2vec Tombola Sequencer Rose Curves in Blender Collage Isolation WOMB Installation The Fog - Film Score “Shortcut” - First Term Masters Project Paradigm Shift In Search of Shadows Subsurface Oceans Op Voyager - The Ignition