Articles

Content You Need: The Ease Package

We want to add a little more life to your transitions. You’ve probably made a habit of using line, bline, or line~ to handle all of your smooth value changes. While this is very handy, these linear transitions can feel pretty robotic. In nature, things rarely move in a completely steady linear fashion. Often Max users turn to variations of the slide object to remedy this, but even that has its own predictable quality.

Disney animators recognized early on that “Slow In and Slow Out” transitions made for more energetic and lifelike animations. They would draw in-between frames close to the keyframe to add a little snap or realism to the movement. This kind of “easing” replaces linear, evenly spaced motion with movement that changes speed between keyframes. Robert Penner extended this idea to computer animation with a collection of equations that convert linear time values (between zero and one) into nonlinear curves. While the idea comes from animation, audio also benefits greatly from a little nonlinearity.

The Ease package brings all of this into Max with objects that apply these easing functions to Max floats, lists, MSP signals, and Jitter Matrix inputs. The easing equations include a variety of ease-in, ease-out, and ease-in-out, in addition to a few special effect equations like “bounce” and “elastic.”

In the Package

The Ease package includes ease, list.ease, ease~, and jit.ease objects that simply apply the specified easing function to the input. These utility objects make it simple to add easing to your existing patchers. Try inserting ease~ after a line~ to create a more interesting fade in and out.

While we were working on the package, I found that I was doing a lot of extra patching to support eased transitions from one list or value to another, especially for animation. To simplify this common need, we added ease.xfade (and the signal version ease.xfade~), which tweens successive values using a ramp input on the right. To see this in action, open the included Model_Ease patcher. In this patch, we generate random keyframe values, and animate them using ease.xfade and bline.

Tim Place also found that he could employ the easing functions to do some interesting audio waveshaping. Check out the Oscillator_Ease example to see what he came up with.

Since I added Ease to my Max toolkit, I’ve found myself dropping it in all sorts of patches to add a little extra flavor. It also pairs well with the Jit.mo Package (jit.ease) for some extra snappy generative animation.

Click here to download the examples used in this article. You will need to install the Ease Package to use them.

The Ease Package is available in the Max 7 Package Manager (Max 7 > File > Show Package Manager). We look forward to seeing and hearing what you make with it.

by Andrew Benson on March 28, 2017

Creative Commons License
larme's icon

Great package! I wonder what's the relationship between externals objects and gendsp objects.

Max Gardener's icon

The gendsp objects are ports of the same code that the Ease externals use. They're included in the package so that gen~ and Jitter users can add the functions to their codeboxing.

TConnors's icon
Gary Lee Nelson's icon

Do you have some examples that use jit.ease for easing jit.matrix?

Gary Lee Nelson's icon

Here's my context...

Mathieu Chamagne's icon

ease.xfade~: unable to load object bundle executable
2018-08-21 12:00:33.675 Max[19789:474646] Cannot find executable for CFBundle 0x87023fe0 </Users/mathieuchamagne/Documents/Max 7/Packages/ease/externals/ease.xfade~.mxo> (not loaded)

same problem in 32 & 64 bits, Max 7.3.5 / MacOs 10.13.6, latest ease package (1.0.2)

Gary Lee Nelson's icon

Thanks for this. I did get it in May and have been delighted with what I have been able to do with it. Made a harmony cross fader that is very smooth.

Diego Proietti Timperi's icon

Hi all! Is Ease package only for max 8? Thanks

Oni Shogun's icon

ease~: unable to load object bundle executable

the only way this got solved was by removing various search path entries which were meanwhile redundant and conflicting. since then the external gets loaded correctly.

This is also why I was able to uninstall, install and load the externals but not after a reboot of Max, prior to removing the other folders from the search path.

Francesco Di Maggio's icon

Thanks for this great package! I'm loving it. One question: each time I change the function the next number value drops too quickly. Is there any way to make the next function take over without resetting? Thanks a lot!

ease_test_ramp.maxpat
Max Patch