Sweat Equity Podcast Appearance

Joe Clay | Jan 12, 2018

Yesterday, I had a blast hanging out with the dudes of Tocobaga Consulting (aka TocoWorks) and 208 Monkeys for a little bit to talk shop! We talked about the origin of Workbench, why you shouldn't use tutorials in your reel, advice for people in the industry, and a whole lot more. There's some hilarious NSFW bits in there, so if you work in an office that's lame, throw on some headphones!

If you're curious, Law and I went to high school together. That's not really what led to this appearance, but it's interesting information. We were even on the track team. Before I was 30 pounds overweight! Here's another odd piece of trivia—a few months ago I weighed almost 100 pounds over what I weighed back then. Insane. Anyway, check it out and have a great weekend!

Number Format

Joe Clay | Jan 10, 2018

Let's format some numbers

Often there's a need to make a ticker-style number growing from some number into another number. If you haven't had that request you haven't been working in this industry for more than five minutes. The problem is, while you can make a slider cycle through numbers from -1,000,000 to 1,000,000, you can't get those commas in there without some work. And unless you truncate the decimals you can get some really long decimal values too. Unfortunately, After Effects's available functions are sometimes limited so there's no number format function.

So I made a reasonable facsimile. Enter my number format expression. Here's what it looks like.

//Apply to SourceText
m = effect("Multiplier")("Slider");
e = Math.round(Math.log(m)/Math.log(10));
n = effect("Number")("Slider").value;
neg = n < 0 ? '-' : '';
n = Math.abs(n).toFixed(e)*m;
s = n.toString();
n = '';
for(i = s.length; i > 0; i--) {
    if((s.length-i) % 3 == 0) { n += ',' }
    n += s.charAt(i-1);
n = n.split('').reverse().join('');
neg + n.substr(0,n.length-1);

To use this, you need to add two sliders to your text layer. Call them Number and Multiplier. The multiplier is used to get numbers higher than one million. If you have 1234.567 as your value for example, if your multiplier is 1,000 you'll get 1,234,567 which is obviously over one million. You can enter numbers to a ton of decimal places though AE will usually only display 2-3 depending upon how you've interacted with the UI. You can also double click on a keyframe to see a slightly more precise value.

Note, I'd keep that Multiplier slider set to powers of 10—100 is 1 by the way so if you want the number to be exactly the same as the number slider without decimals, set the multiplier to 1.

How it works

m = effect("Multiplier")("Slider");
e = Math.round(Math.log(m)/Math.log(10));

First we grab our Multiplier slider. Then we see how many factors of 10 we're going to multiply by. This is necessary to truncate our Number value later on so that we don't end up with decimals or other weird formatting in our number. Even though you may only see 2 decimal places, there can be about twenty digits AE holds onto in the background.

Since there's also no Math.log10() function in AE for some reason, we have to calulate that ourselves. So we take the log of our Multiplier, and divide it by log10. We're also using Math.round()—it could also be Math.ceil() for our purposes—because sometimes Javascript math is odd. For example, taking log10 of 1000 is 2.999999999... instead of 3 for some reason and we need it to be dead on 3. This value is stored in e for exponent.

n = effect("Number")("Slider").value;
neg = n < 0 ? '-' : '';
n = Math.abs(n).toFixed(e)*m;
s = n.toString();

Next, we'll grab our Number slider. We need to add .value to the end of this one because it has to be a float and not some other type of variable. Then we do a quick check with a ternary structure so that we can conditionally set a variable in one line. If n is negative, we save - to the neg variable, otherwise it's an empty string. That will be tacked on to the front of our number later.

Then we take the absolute value of our number, since that sign—the dash—will mess us up. You could just truncate that character off, but dropping the sign with Math.abs()—taking the absolute value—should be a faster operation. Then we convert that number to a fixed string with e decimals. And that final result is multiplied by our multiplier m and saved back to n.

Even though we've converted our floating point number to a string using toFixed(), that math still works thankfully. But we need a string for what we're going to do next.

s = n.toString();
n = '';

So we convert n to a string and save it to s for, uh, string. Then we clear out n because there's no point to making another variable and n makes sense since it'll hold our number again at the end.

for(i = s.length; i > 0; i--) {
    if((s.length-i) % 3 == 0) { n += ',' }
    n += s.charAt(i-1);

In this for loop, we're going to loop backwards from the end of the string to the front. This will allow us to place commas every three characters. You could do this forwards, but going backwards is simpler and probably faster to execute.

So we'll start by setting i equal to the amount of characters in the string—the length—and while i is greater than zero this loop will function. Every time through the loop we'll decrement i by 1.

Each time through the loop, we'll check to see if the original string length minus the current value of i is a multiple of 3. We do that by using modulo and checking if our value is 0. If it is, we're at a third character and we'll concatenate or append a comma to the end of variable n. On the first time through this loop, the value we'll modulus will be zero so it will append a comma as the first character of string n. We'll drop that off later.

Then we append the charcter at position i-1 to the variable n. We have to subtract one because character position is zero-indexed while length is 1 indexed. For example if we have ten characters the tenth character is 9, because we start counting character position at 0.

At this point we'll be left with a number that looks like: ,987,654,321

n = n.split('').reverse().join('');
neg + n.substr(0,n.length-1);

So then we'll use split to convert our string into an array of characters, then we'll reverse that array and join it back together with an empty string. This would leave us with 123,456,789,. So in the next line we add that negative sign—if there was one—back in and then truncate off that last comma using substring.

And that's it. It took a bit of fiddling, and it's not as perfect as just having a number format function like many languages do. But it works when you need it. The only thing this won't do is decimals. If you need decimals with large numbers, it'd be easier to add another slider and deal with them separately. If I have a need for that, I'll make it and make it available. But that's unlikely. Most of the time you do that with smaller numbers so just use a simple toFixed(2) on the value from the slider and call it a day. This mainly helps for larger numbers where the specificty of decimals are less important.

This is also a Quiver file for this expression available to Patrons. It's available in the general Quiver folder. The link can be found on a prior Patreon post!

I feel like this is a good way to explore some expressions in a little more depth. If you enjoyed this format, leave a comment below, or message me on twitter @workbench_tv.

10K Subscribers!

Joe Clay | Dec 1, 2017

I'm a YouTuber Now

I guess this new milestone makes me a YouTuber now. Sorry guys, but we're going to have to start using some clickbait titles now. Learn After Effects easily with this one weird trick. I'm quitting mograph (clickbait). I'm not quitting mograph (not clickbait).


Workbench stared out as a side project. I had hopes that it would grow, but I had no idea if that would actually happen when I sat in my old office to record Tutorial 01 in January of 2016. And here we are just maybe half an hour ago hitting 10,000 subscribers on YouTube.

I probably had four really good ideas when I began making tutorials. I didn't really know that at the time. I felt like I had plenty. Why else would I start making tutorials? I guess it's good that I didn't know how few ideas at the time. One tutorial a week is a lofty goal. It still is. Yet somehow those four ideas turned into five, into ten, twenty, fifty, and soon into a hundred. Forcing myself to come up with a tutorial a week has led to me experimenting more—to making more. It's become a cycle that feeds itself. And I've made a lot of great friends in the community along the way who have also helped and contributed ideas.

I can't say that every tutorial has been completely up to the level I'd hope. Some weeks I'm just super busy and I'm struggling to find an idea so I build upon something I've done before, or I make a simpler tutorial than I would otherwise. But I find that even if a tutorial isn't as brilliant as I would hope, it still helps people out. So I've learned a lot on this adventure too.

Thank You

I send out my sincerest thanks to all of you who have clicked that subscribe button. Thanks for following me on this journey. It's been a busy year, and it's been tough sometimes to stick to my schedule, but I haven't missed a week in just under two years of making Workbench tutorials—making it the longest project I've kept up other than my marriage! This week has been particularly trying due to how things all got bunched up in my schedule, but hitting this milestone makes it worth it.

Thank you all for watching, subscribing, retweeting, becoming patrons, and buying our products. It means a lot to me. I'll see you guys next week.

Black Friday 2017!

Joe Clay | Nov 23, 2017

Black Friday Deals

Everything in our store is 40% off right now with offer code stuffing! If you're a patron, it's 50% off. If you purchased Quiver, there's a discount on Quiver 2 in your inbox.

Did I say Quiver 2?

Oh yes I did. Quiver 2 is awesome. When I made Quiver, I always hoped it could do more things, but that was difficult with the way the UI had to be built. So I finally learned how to do CEP UIs in After Effects, and that allowed me to make Quiver 2 into what I always envisioned Quiver to be—a tool to not only apply expressions to properties from a library, but to also manage that library right from Quiver itself.

LUTs Vol 1

I've been getting requests for grading, so I figure it might be a good idea to make a LUT pack, so I did. I can always use LUTs so it's win-win.

Anyway, head on over to the store and pick up anything you been eyeing!

Regarding Resolution

Joe Clay | Nov 18, 2017

Why I record tutorials with full-size UI

I guess I write this at the risk of alienating some people—someone has already called me a piece of shit for making high-resolution, free tutorials—but I have reasons for making my tutorials the way I do. I understand that things may be hard to see on smaller screens—though I have no issue editing these at half-size on my 15" MacBook Pro. Anyway, what follows is my explanation.

I hate zooming in tutorials and I hate non-native resolutions

It might sound odd to you, but I don't like watching tutorials that have tiny resolutions. I abandoned 1024x768 screens more than a decade ago, so watching someone open and close panels throughout a tutorial really bothers me. And I hate working at non-native resolutions so I don't record that way.

I also find it incredibly distracting when people zoom in to specific UI controls and settings. Often, I'd rather them just work so I can immediately see how it affects picture. I think it might be important for beginner tutorials so they can see what they're looking at but that's not what I'm trying to do with Workbench. Eventually I might make a beginner-focused tutorial, and in that case I may zoom those. But that's not going to happen for our weekly tutorials. Plus I'd rather spend the time thinking up new ideas in After Effects than adding zooms to a ton of cuts in my edit. And while you might think that's easy, here's what a typical Workbench edit looks like in Premiere.


Focus is the most important reason why I make my tutorials as they are. It might also sound odd that I'd mention focus to you if you're having trouble reading specific settings while watching my tutorials on a laptop. But it is a matter of focus. I don't design these tutorials to be specific to a set of settings. If that's what you're looking for you're missing the point. If there's anything absolutely necessary for something to work, I call it out. I put expressions on our site and in the comments—when I can since YouTube refuses to use a single function to strip HTML. And I try to use Expressionist when going through expressions so that they're a little easier to see. Right now, however, it needs an update to work in AE CC 2018, which they're working on, so I haven't been able to do that while showing CC 2018 features. If there's something I think you should have specific access to or would benefit from, I publish the project file—and sometimes specific elements to our Patreon.

But I do that because I think screwing around inside of After Effects is hugely important as I've said numerous times. And sometimes having the setup or having the code gets you straight to being able to mess around with the concept. Concepts are the absolute root of my tutorials. They are what I am trying to teach. That's why I'll frequently explain how I got somewhere, or what I was thinking about that lead to a discovery.

I watch tutorials all the time on my phone. I've never had an issue, but I'm not watching for the settings. I don't watch tutorials to mimic something specific. And I don't build my tutorials so that you guys go out and do that either. I don't really want to see a thousand copies of the exact same thing I've made. What I think is dope is when someone comes back to me with, "hey man, I took your effect and modified it like this so that it does this now." That rocks.

Ask questions

That said, as always, if you have a specific question, or if you're lost on something I have no problem fielding questions. Maybe I overlooked something, or something was confusing. I'm not perfect. But if you're looking to see that I set a Gaussian Blur to a 2.4px radius, you're missing the forest for the trees.


Joe Clay | Aug 30, 2017

Artlist is awesome!

A couple of months ago I was watching an episode of Film Riot where they were talking about Artlist. It's an unlimited royalty-free music site. There's a ton of excellent stuff on there.

I paid for a subscription, and have been using it for a few months now and I dig it. And with a few projects a year you can pay off the subscription pretty easily—unlike a lot of the services out there—and there's not a lot of restrictions on use for video projects, and it even seems they allow podcasts. And even if you unsubscribe you don't lose your past licenses. About the only restriction on use has to do with hate content, so don't be racist—not just in your videos but always.

Referral program

This post isn't sponsored. It's my personal opinion. This post would have happened whether or not this program existed, but it's happening now because they just opened up a referral program last week—from what I can tell.

So if you use any of the links on this post to go to Artlist and you sign up for a subscription, we'll both get two months free, which is pretty rad. After ten referrals, you get a lifetime membership. I don't intend to cancel my subscription to Artlist, so that would definitely save me some money. So if you're considering this, and want to use my link it's win-win.

The competition

Before Artlist, I had been going along purchasing tracks individually, and I always hated it. Either the music was good and pricey—especially if you do TV for multiple markets—or you end up digging through cheaper sites to find good tracks that everyone else has already used.

So licensing through other sites means that if your budget doesn't allow it, you're kind of stuck with either junk music or stuff that's been everywhere. There are only so many indie ukulele tracks with hand claps, people. Sometimes you even find that great track and then find out that in the way you intend to use it, the licensing is 10x more expensive and the client doesn't have the budget.

Artlist makes that pretty easy. You just pick something and use it. Done. And since Artlist is still new and on the DL, you're less likely to run into music you've heard before, at least for now. But so far, I've found that there's also just a lot higher quality music on there. There's nothing I've passed over thinking, "who the hell would use that?"

I've found a lot of music that I just favorited because it didn't fit a project but I want to use it elsewhere. I need to cut more reels and work on more personal projects, because I've found a bunch of great tracks! The quality is closer to the higher priced sites, but the pricing competes with the lower priced, single-purchase sites, which is awesome.

Any downsides?

EDIT: When I made this statement, I was using Artlist on Safari. Safari is slow on Artlist. Chrome is nearly instant. Artlist on Chrome might even be faster than any other service I've ever used. Most of the time I could click anywhere in any song in search results and it would just play. So couple that with the amount of good tracks on Artlist, and it's quick to find music for any project.

Artlist's site is slow. It's not unbearable, but it's definitely noticeable going from track to track. However, on Artlist I tend to find a track that I like and that fits what I need a lot quicker. So for me, that offsets the slowness pretty handily. They also have curated items, and good categories. And their email blasts, if you choose to get them, spotlight new artists pretty frequently.

So if any of this sounds good to you, use my Artlist referral link to jump over there and get you some music!

Andrew Embury on Adobe Live

Joe Clay | Aug 25, 2017

I was on Adobe Live, kind of

The great Andrew Embury, friend of Workbench, was on Adobe Live with Paul Trani for three days. I've been busy, so I missed Day 1, but I caught up on Day 2 and Day 3. Go check them out! There's a lot of goofing around, but there's also a lot of solid stuff on there—that cat body with beam was a great idea! And you can play the drinking game every time Andrew says community, at the end of the day, and other great phrases. Sorry Andrew, I had to! Love you man.

Without intending to get a huge shoutout, I said just said, "HI. That is all. :)," in the chat on Day 2 and they actually pulled up Workbench on the stream! It was awesome! That happens at 58:05 in the stream, but be sure to check it all out!

Again, thanks to Andrew for the kind words! I really appreciate it. I also loved the expression in the frame above, so much so that I spent a little bit recreating it with Andrew and Paul a little larger in the frame.

Happy July 4th

Joe Clay | Jul 4, 2017

Shop Our 4th of July Sale

You don't even have to be an American, haha. Everything in the store is 20% off. If you click through it should automatically be applied, but if it's not for some reason, put in the offer code 'merica to get your 20% off.

And we're also launching StackIt today so be sure to check that out! I stayed up pretty late to get all of this out in time for the sale (it's past 6am now). I tested it out earlier this evening and added in a few things I felt were necessary after using it for a bit.

Also, if you've already purchased Layers to Grid/Layers to List in the past, you should've received an email with a link to jump to StackIt for free. If you didn't see that, let me know. Also, as far as I can tell, Gumroad puts a download button in every email for some reason. That one doesn't do anything. You have to click the other button to go through the gumroad process so that you can get notified about updates for StackIt in the future.

That's it. Have a happy 4th everyone!

JSplacement is pretty awesome

Joe Clay | Jun 17, 2017

Mmmmm, easy greeble

Yesterday, Sev sent me something someone (sorry, I'm not sure who!) posted to the Motion Design Slack Channel. It's an awesome, free tool for creating instant 8K displacement maps that's called JSplacement. Though you might want to tip them through Paypal (link next to their download link).

JSplacement offers three types of displacement maps—and an experimental fourth—you can generate. Each type is randomly created and there are sliders you can use to determine how they're generated. I built the image above using just one that I made in it. If you need any greebling, displacement, or time displacement, grab this program. It is awesome! And it's built in Electron, which is pretty awesome too!

The Bug that Keeps on Giving

Joe Clay | Jun 7, 2017


So I found another excellent reason to use this helpful tip that I wrote about last week. Remember that pesky bug that I keep mentioning that really annoys me? You know, the one where you try to save a preset in After Effects 2017 and it wants to save it in the 2015 location? Well it turns out that must be incorrect in the API too because that's also the location FX Console searches for your presets. I saved over a preset in my 2017 User Presets folder, but FX Console kept going to the 2015 version. So it must use a path provided by the API that is also incorrect.

So I symlinked my Dropbox User Presets folder over the 2015 folder and it still failed. I restarted AE and it worked. So either FX Console doesn't refresh or maybe it relies on AE refreshing the presets. And of course AE refreshes the correct 2017 User Presets folder, it just doesn't want to save to it. So if you rely on FX Console to quickly apply animation presets, be aware of this. And if you save a new preset, restart AE and make sure a copy is in the 2015 User Presets path too. Bummer.