Ukramedia Podcast

Joe Clay | Jul 12, 2018

Sadly, I'm a little late to post this, but I've been trying to hit some deadlines this week. If you can't tell by the graphic above, I was a guest on the Ukramedia Podcast! It was an incredible honor. I can't stress enough how good this podcast is. But I'm going to try because whatever their numbers are, they're too low.

I hate that I have to disclaim this, but I was not paid to say this. None of these links are affiliate links. And it wasn't a condition of being a guest. Other than me telling Vladimir that I was going to write something, they have no idea I'm even doing this. I just think that they're fantastic and their podcast is fantastic too. I had seen their tutorials on my jaunts through YouTube but I hadn't heard their podcast. So when they asked me to talk with them I checked it out, and it's great! It's also amazing how good it is with only 23 episodes so far. I feel like most podcasts take much longer to find a groove if ever.

If you don't know, Vladimir and Sergei are twins running Ukramedia. Sergei has made tutorials for years in a similar fashion to my own—short and to the point—but they've also started some more natural, unedited tutorials that are also excellent. They've also come out with an expressions course as well.

Vladimir is the host of the podcast. And he's such a good interviewer. While he starts off with a similar set of questions, it is crazy how different each podcast is. Vladimir brings his own experiences out and builds a great rapport with his guests so it's not just a one-sided conversation. But he also knows when to get out of the way to let the story unfold.

Unlike a lot of other podcasts, Vladimir gets excellent, actionable information out of the guests so you're not left wondering what steps you can take to better yourself. I'm going through all of their podcasts now and I don't think there's one that has failed to teach me something, give me an idea, or show me a new perspective that will help me to improve upon my goals.

Aside from that, I just love their story. You can hear it in Episode 1 of the Ukramedia Podcast and there's also an excellent interview with Sergei on the School of Motion Podcast. It's an amazing tale of how they arrived in the United States as twelve-year-old refugees from a dissolved Soviet Union. The friendships they forged, even while only beginning to learn English, led to the brothers taking a path into motion and design-related fields. And the help they gained through others led to them helping others today. That's all I'm going to summarize because it's much better if you just listen to the podcast. So go do that already. If you've spent time reading to this point instead of listening to their podcast, you're doing it wrong.


Joe Clay | Jun 19, 2018

If you're following us on Twitter, you've probably seen that we've started a Twitch account. After trying to find a channel name that worked and wasn't taken, I kind of took a different direction taking inspiration from this Simone Giertz TED Talk. Workbench is a place where we basically go to work and show you the results of that work. But Failbench is where we put in the time to figure out just what we're doing and showing you all of the fails along the way. It's a place where we might not know all of the answers, but we'll do our best trying to find them.

While our main tutorials will always be quick and to the point, I think it's important for you guys to see that sometimes developing this stuff takes way longer, and it's not always perfect. As the YouTube algorithm has become a mindreader, I happened to stumble upon this video by Andrey Lebrov that sums it up perfectly—I struggle too. We all have our struggles—even our idols—and even when we succeed we feel like imposters.

Failure and struggle are more important than anything in life. Everything comes from failure. Failure is our greatest teacher, and it ensures we succeed and help others to learn from our mistakes too. This is why I stress for you to always go out and experiment with your tools. I've had people ask me to basically spoonfeed them my tutorials. But success doesn't work like that. Copying me won't make you better than me.

I've been using After Effects for about 15 years now. I've experimented a lot. And I've failed a lot. Thankfully that experience can see me through a lot of things. But I still fail. Sometimes I know exactly how to build something and sometimes I spend hours figuring something out—like the way I built Tutorial 126: Number Crawl. I initially intended that to be my first stream but it took so long I never uploaded it.

I'm still learning to show that side on stream. Sometimes I make a mistake that I normally wouldn't because I'm trying to multitask and be entertaining, and that's kind of embarrassing. But who hasn't done that? In these days of our insta-culture, our society demands that we present our lives and ourselves as perfectly infallible. Our currency has become likes, views, and subs. And while being perfect and admirable certainly gains those things and can be a relative gauge of our success, I think we need to take a step back and embrace that failure. I'm not perfect, and neither is anyone else. I've just failed so many times that I figure things out quicker. Don't look at your idols' perfect work and compare it to you. You don't see their failures unless they choose to present them.

So come along and check out our failures. Let's learn and grow together. And definitely join us on stream if you see that we're live. Even if we're working on something else, ask questions and interact. Interaction helps me. Otherwise I try too hard to be entertaining!

Hopefully soon we can figure out how to get both Sev and me on a stream too. Collaborating on making last week's tutorial frames would've made a great stream, so we're hoping to get something like that going. We just didn't think of it until after we were done because we're dumb.

So follow us on twitter @workbench_tv and hopefully I'll remember to send out the notification that I'm live when I actually start. That was a fun fail I did on the first Twitch streams. Today, I remembered but I didn't remember to record the stream. Thankfully, Twitch lets you download it if you're archiving. Always remember to turn that on. That's a great mistake to avoid. Find more mistakes to avoid in the latest stream below.

Memorial Day

Joe Clay | May 28, 2018

Words cannot express our gratitude to those who have given their lives so that we may be free to do what we do. In honor of Memorial Day, I made a flag based on one of our tutorials last week for you to use. I made it into wallpaper sized for a retina Macbook Pro (2880x1800) so it should fit most screens. And there's also an iPhone X version. Have at it.

Text Breakup Advanced

Joe Clay | Apr 9, 2018

In Tutorial 118: Text Breakup I noted that it should be possible to do that effect with one text animator instead of one per character. That makes sense, since the expression selector allows us to use the textIndex variable in order to write per-character expressions. So guess what?

Here's the first part of how to do it with an expression selector—note that it may scroll on your screen. I'll explain this code in more detail below. The setup for this is basically the same as in the tutorial as far as the sliders go.

group = thisProperty.propertyGroup(3).name.slice(-1);
amt = effect("Slide " + group)("Slider");
d = effect("Frame Delay " + group)("Slider");
seed = effect("Random Seed " + group)("Slider")+textIndex;

d = textIndex*d*thisComp.frameDuration;
amt = amt.valueAtTime(time-d);

amp = random(0,100)*amt;

if(random(0,1) > .5) {
} else {

This code is added to an Expression Selector's Amount property. The text animator is named Slide A. It doesn't matter what it's named as long as that A is at the end. I'll explain why next.

group = thisProperty.propertyGroup(3).name.slice(-1);
amt = effect("Slide " + group)("Slider");
d = effect("Frame Delay " + group)("Slider");
seed = effect("Random Seed " + group)("Slider")+textIndex;

The first line looks up from our Amount property using propertyGroup(countup) to get the name of the parent group this property resides within. In this case, it's 3 groups up and the name of the text animator is Slide A. So we take the name and use javascript's slice() method to get just the final character of the string—A.

If you looked at the image above, or watch the tutorial, you'll notice that I named all the sliders with an A at the end. This way, if we want to add multiple text animators, we can duplicate and rename those sliders (unfortunately you have to do that). Then we can just rename our text animator and it can look at a new group of sliders. The expression will fail when you duplicate the animator since After Effects will name the next one something like Slide A 2, so you'll just have to toggle it off and then back on again once you've named it something like Slide B. That's quicker than having to modify the expression at least.

So that's what we use to grab all of our sliders. We take the name and append the group variable to the effect name so we can grab the slider that matches the name of our text animator. amt and d just grab their slider values. seed takes the slider value and adds to it our textIndex value so that we get a different seed for each character—otherwise they'd just move together completely.

textIndex is a variable the Expression Selector gives us. After Effects evaluates this expression for each character of the text, so the value is just the index of the character that it's currently running our expression for.

d = textIndex*d*thisComp.frameDuration;
amt = amt.valueAtTime(time-d);

amp = random(0,100)*amt;

Next, we set up our delay so that each character waits a little bit after the previous character before it starts moving—unless you set the Frame Delay slider to 0 of course. So we take our textIndex and multiply it by d which is our slider value in frames. Doing this makes sure that each character is delayed by that number of frames. This needs to be converted to time, so we multiply that whole thing by thisComp.frameDuration which is how long a frame is in seconds according to our composition. If we're at 24fps, this value is 1/24. But if we use this property instead of hardcoding it, it'll change to whatever the comp is set to.

Then we set up amt. amt is a value from 0-1 representing our animation—1 is the extent of our animation, and 0 is the base position of our characters. We're taking the value of that slider at time-d so that we can get the value offset in time by our characters. This is what sets each character's delay until the previous one begins.

Next, we set up our random seeds using seedRandom(seed,timeless). We pass that our seed value and we set timeless to true. This means that our random value will stay constant. Normally, a new random value is calculated per frame. With timeless set to true it only happens once.

Now that we have our seed set up, amp—short for amplitude—is then set to a random value from 0-100 and then multiplied by amt. As amt is basically our animation offset for each character but represented by the range 0-1, multiplying those two values remaps that range to the values we need to output for the Amount property—an array of three values from 0-100%.

In this case we're randomizing that percentage range so that each character can move up to 100% of the max value we have set.

if(random(0,1) > .5) {
} else {

Finally, we grab a new random value from 0-1 so that we can use a conditional to make values above .5 affect the x value, and those below affect the y value. If you had 3D characters you could make this affect all three values since the Amount property is 3-dimensional. But I only want to use 2 dimensions. So we just output an array with values for x, y, z and we're done with that property.

We just have one more expression to do. You might have noticed that I mentioned a max value, but we didn't bring that slider in. Well, the issue is that we can only output a percentage for Amount, not a value. But that's actually a nice flexibility. That means we can set all sorts of different values for the properties in our text animator and they will scale accordingly.

group = thisProperty.propertyGroup(2).name.slice(-1);
max = effect("Max Value " + group)("Slider");

I've added this simple expression to a Position property within the animator containing our Expression Selector. We set up a group variable as before though this time it's just 2 groups up.

Then we grab our max slider value, and then we use mul(vec,scalar) to multiply our value array by that maximum value. The cool thing about this is that we're using value so you can change the value of the property to modify what we get from the max slider. So if the slider is 500, you can set the property to [2,.5] and the final value will be [1000,250]. In my case, I wanted my text to possibly go right and up so I set my Position value to [1,-1].

You can also set it to [1,1] and set the random for amp in the Amount property to go from -100 to 100 so the text can move in either direction. There's a lot of different combinations of things you can do with this effect. I've added another project file to the download for Tutorial 118: Text Breakup so if you purchased that, you should've gotten an email about that. And if you didn't you can grab this setup from our Gumroad shop if you like.

HomePod - Welcome Home by Spike Jonze

Joe Clay | Mar 30, 2018

You might have seen this excellent looking spot by Spike Jonze for Apple's new HomePod. I had a feeling when I was watching it that at least some if not all of it was practical. It felt just perfectly imperfect enough for it to be real. Well, it was. It looks like the only VFX was just removal work, and there might not have even been much of that other than the guys moving the couch. This would be a fun set to play on! That table is amazing!

Make sure to watch the final before checking out the BTS that CollideTV put on below. With the way Spike dances in this, I think they had a missed opportunity to shoot a second version.


Joe Clay | Mar 29, 2018


Where's Sundial? It's said "Coming Soon" for as long as this site has existed.

Fair enough. I've had a few inquiries into this one. The short of it is that it's now available as a name your own price with some caveats. The long of it is that it's incomplete and macOS only.

Boring History Lesson

I developed Sundial in 2014. One of my goals was to make a plugin. I originally tried to remake Pete's Plugins from his source, especially for his legendary halftone effect, but I could never figure out how it all went together. So I went about building my own from scratch.

I had this great idea. Everyone was trying to make long shadows and had developed all of these different hacks. For quick things, I had always cheated by stacking a few drop shadows. But I figured that I could probably turn that process into a way more efficient plugin. How hard can copying a layer over and over a ton of times be? It was difficult. The docs were ancient and my C++ experience is still low. But eventually I got it working. I even optimized it so that it didn't draw a ton of layers, but grouped them and repeated those groups to get to the desired length.

The only setback I faced, and could never recover from, was that it wouldn't work well with raster images. Every once in a while you'd need to purge. And moving the controls around usually seemed to have the effect of stacking the copies, especially if opacity was used.

So I stopped development completely when an alternative hit the market. I found out recently that others had been working on a similar path and had similar setbacks. I think the code they worked on ended up in a viable version somewhere.

So that's where it stands. As I use Macs, it's macOS only. Had I been able to get the kinks worked out, I probably would have ported it to Windows, but that didn't happen. If those two drawbacks aren't a concern feel free to name a price and download it. But please remember, there is no active development on this one, and it's offered as-is with no support available.


Joe Clay | Mar 23, 2018

Today, we're making some changes with how we do some things so that we can bring you guys more value and make Workbench more of a focus for us both. Right now there's a ton of stuff we want to do, but we have to balance that with running Yellow Dog Party. So in that vein, the first big change we're going to make is to switch around our Patreon setup. The goal is to get more content out for our patrons and lower the price of the tiers versus 4 videos a month so that it's a more attractive offer. Obviously we'd rather have more patrons paying less than less patrons paying more.

When I started this thing, it seemed like a good idea to set it up per video. But as I've posted every week consistently for a couple of years now, it makes more sense for us to go monthly, especially with Sev now being more involved. We won't have to bother with explaining that we're not charging for extra videos and we'll have a better idea of what's coming in from Patreon each month. And we might also be able to curb the few people who've joined our highest tier, downloaded our stuff, and then skipped out on paying. We're making free tutorials so it's a little disheartening to be stiffed. But it makes us really happy for all of you who have gone above and beyond to chip in.

One of our other goals is to make sort of a Patreon-lite experience with regards to project files and elements. When we make our tutorials, we build up these project files, and then we strip out what we can't distribute—like music—and then we strip out content destined for Patreon, and then we put up the project file. If you're a patron, you have to go to two places to get everything. If you're not, you get a project file but it's lighter than it could be. And if you're us, you have extra work ahead of you to do all of that and distribute it.

Well, starting with Tutorial 115 we're hoping to change that. We're now putting our project files up on Gumroad—free for patrons and $1+ for everyone else. Our patrons will still get extra content outside of the tutorials of course—we haven't forgotten the displacement maps we owe you guys!—and we won't have to make three versions of everything. The idea is to make is as easy for us to get you guys useful content, and easy for you to get it.

Hopefully this will be a better solution as we grow. And when that time comes we'll probably have more improvements to make!

Easyrig + Simmod Lens S2 Connector

Joe Clay | Mar 7, 2018

Today we're talking about something different—production equipment. While we probably won't get into full on production tutorials as there's plenty of great content out there already, there's not a lot of stuff geared at people who might find their way onto a set for other reasons—VFX supervisors for example—that might wonder about equipment or perhaps even certain practices.

This started because we were asked to do a quick demo for a product that I've personally bought—the Simmod Lens S2 Connector. Full disclosure: I'm getting a discount on future purchases for talking about it, but it's a product I really believe in and recommend from a company—and owner—I really like. The KONG Frog clips are already excellent, and using them to build this solid, purpose-built clip that melds securely with an Easyrig makes a perfect piece of support equipment for anyone who uses similar setups. It also keeps the camera higher than the usual Frog clips with the strap.

That offer led to the idea of talking about things you might find on set. I live in a right-to-work state so our shoots are typically non-union. That means I've often helped out other departments on set—though I work in the camera department—because we're not as regimented as union shoots. That means we often help with other departments' equipment. So I figured it would be helpful for people who are starting out and find themselves in an open set to know about various items they might come across.

Anyway, if there's anything you're curious about, let us know in the comments and maybe we can make a video for it. And I promise that the next intro won't be as long. We felt like having a play shooting with Sev's A7R and some cheap RGB lights I bought a while ago!

The Nugget

Joe Clay | Mar 6, 2018

If you've watched a few of my tutorials, you've probably heard me talk about "the nugget." I'm not talking about what you make while browsing Reddit on your phone. I'm talking about a nugget of information! I'm talking about why I still watch After Effects tutorials even if I think I'm going to already understand most of what I'm about to watch.

And Monday's Video Copilot Glitch Tutorial—Andrew just made it in time!—was chock full of useful nuggets. For example, in the past I've made 3D water reflections by masking out a floor layer to see a flipped copy of my animation. But adding in one of my favorite effects that I really should use more frequently, Compound Blur, allows you to easily make those water puddles variable with a floor texture. What a great use for that effect!

Or you have the section where Andrew used Set Matte to matte out saturation to do a targeted glow—and actually make AE's default Glow effect look good. That was an excellent use for such an already useful effect.

But my favorite nuggets are the ones where I see something and it gives me an idea that might not even really have anything to do with the tutorial. And this texture Andrew used did that for me.

What this reminded me of has no real relation to the tutorial. And yet it gave me an excellent idea for this week's tutorial. There's still going to be glitching involved, displacement, and maps. But there's a fun way we're going to build our maps that I hadn't thought of before. I'm really excited about this one because it's a great example of the nugget in action. So don't forget to check back Friday! Better yet, follow us @workbench_tv so you don't miss it!

EDIT: It's up!

15K Giveaway

Joe Clay | Mar 1, 2018

Amazing Music Tracks contacted us and my wife had a great idea about doing a giveaway since we just hit 15K subscribers on YouTube—now just shy of 16K! So to enter, you only have to do a couple of things.

  1. Follow us @workbench_tv.
  2. Tweet out your favorite Workbench tutorial and tag us at the end!

Since we're still pretty small, we'll leave this running for a couple of weeks so we can get a decent amount of entires. But that also means you have a good shot at winning. And what can you win? Free music!

The winner will receive 5 free tracks, a re-usable code for 50% off up to 50 tracks and another re-usable code for 30% off up to 100 tracks. And if you don't win, you can still use our affiliate code: WORKBENCH10 at Amazing Music Tracks.

Thanks for 15K everyone! It's unreal.