Ghost Audition Memos II – Workflow improvements for global effects using Expressions: Animation cycles and simplified balancing

In my desperate need to experiment with video effects syncing to the music’s atmosphere or rythms, it is common for me to set these up globally for the whole timeline of the project. This is put into practice in a specific comp that is more or less used only for this purpose, where all the comps of the individually edited chapters are put together neatly. For Ghost Audition there are like 7 layers for 7 chapters. Effects that are used globally in the whole video are then put on adjustment layers on top of the edited chapter comps.

global comp explained

Creating repeating animations

The global effects all are animated individually. Given that the animations often naturally repeat for every bar in the track, we need a method of easily repeating manually adjustable animations.

I regret that, in the past, I solved this by simply copy&pasting the keyframes. This is quite the tedious task in itself (even if you exponentially increase your speed by copying a larger timeframe of keyframes every few steps). But even worse is the fact that this method is as non-dynamic as it gets. If you want to change the animation of one effect, you’ll have to delete all the outdated keyframes and repeat the copy&pasting part all over again.

For Ghost Audition, I finally was smart enough to consider the possibility to develop a way more dynamic process for stuff like this. I figured I could use expressions to let animations automatically repeat with a given frequency. If the animation property is set up like that, the keyframes for the repeated animation have to be given only once. If you want to change them, it’s as easy as that, the expression will adapt the whole timeline for you.

The expression I developed to implement this is given by:
CycleLenth=1/ (5*comp(“GLOBAL”).layer(“GLOBAL”).effect(“Taktfrequenz”)(“Schieberegler”))
while (relativeTime>=CycleLenth) {


loopExpression explained crop

The linked value (Taktfrequenz in my case) you have to create yourself beforehand.

The value specifies the frequency at which the animation shall repeat itself. It is important to note that you need a very accurate value for the frequency in order to prevent the animation from eventually misaligning relative to the music! The error increases the longer the animation goes on.

The reason for linking the value to one global property is to keep the project dynamic and not having to correct this value for every instance where you used this technique. Then you only have to correct this single value for all instances of the looping expression if you notice that the value is not accurate enough.

By the way, linking another property is easy if you are using the whip tool:

whip tool.PNG

A useful relation for determining the frequency value f is that f = 1/T , where T is the length of one loop cycle.
In my experience the best way to determine the loop cycle length T accurately is to count the intended number of loops for a long time frame while listening to the track. Then divide the length of the whole section by the number of loops you counted.

Now, I think someone told me like a year ago that there might be an inbuilt function to do this. I have now checked it out whether it is a valid alternative. The function is called LoopOut(), and will automatically repeat a given animation based on the keyframes. The issue of using this method though seems to be that it will only repeat the whole duration of all given keyframes. This means that the cycle duration T of one loop is limited to only be as accurate as the framerate allows, as you normally can’t put a keyframe in between frames. This makes this method very unreliable when trying to sync animation to music.

Balancing global effects with modifiers

The next issue regarding global effects I want to talk about is balancing.

The animations we set up for every effect are repeated as-is, and are not adapting to slight changes in the music you’d like the effects to respect.

So for this, I also use expressions to keep control over all effects with a few simple values that can be changed at every point in time. This way, the effects restore a lot of balance that you lose for static repeating animation. Changing the values won’t change your actual animations, so it is a safe way to experiment with effects balance.

The basic idea is that the input values are instances of the effect “slider control” (in the screenshots it is called “Schieberegler”). We can put all of them on a specific invisible layer, or on their respective adjustment layer that they control. The individual effects’ animations then need to be linked with these slider control properties. Most of the time, simple multiplication does a good job. For example, a effect property like “blur strength” that increases the effects’ visibility more or less linearly from 0 to higher values can simply be multiplicated by a controllable value which I call x. In this case, if you increase x, the effective effect strength will also increase, and if you decrease x, the effect will also get weaker. If x=0 the effect is effectively turned off.

value = value*x

In practice, the expression could then look like this (given you have a repeating animation):


Simple multiplication works most of the time, but sometimes it doesn’t. This is the case if an effects’ effective strength does not turn off if the property value is zero. A simple example for this is the scale property. A value of 0 does not correspond to “no scaling occurred” but rather shrinks the layer down to infinitely small.

The more convenient way to link scale to a slider is something like :

value = 100 + (value-100)*x

This way, only the deviation from 100 is modulated by x.

It is useful to keep x in between 0 and 1. Or make it between 0 and 100 and renormalize the value in your expression accordingly (in the screenshot above I renormalized it by the factor *10 to make both graphs visible at the same scale).

To link to a certain property, remember the convenience of the whip tool:

whip tool

Here’s all my modifiers for global effects:

modulation list.PNG

In my case, some values were linked to influence each other as well. For example, the value “Herzschlag Master” would automatically influence “Verschiebung” and “Vignette” at the same time. The value Herzschlag Master is convenient to use, since it controls all effects that are used to sync to one sound while keeping the effects in the same relation to each other.

Here’s how the full timeline looks regarding all the modifier values I used:

modifier timiline

Leave a Reply

Fill in your details below or click an icon to log in: Logo

You are commenting using your account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s