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.

    • Mar 28 2017 | 3:23 pm
      Great package! I wonder what's the relationship between externals objects and gendsp objects.
    • Mar 28 2017 | 5:45 pm
      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.
    • Mar 31 2017 | 10:49 pm
      Nice!
    • May 22 2018 | 12:13 am
      Do you have some examples that use jit.ease for easing jit.matrix?
    • May 22 2018 | 1:15 am
      Here's my context...
    • Aug 21 2018 | 10:19 am
      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)
    • Aug 21 2018 | 2:19 pm
      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.
    • Dec 25 2018 | 10:39 pm
      Hi all! Is Ease package only for max 8? Thanks
    • Nov 10 2019 | 6:07 pm
      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.
    • Nov 07 2020 | 1:09 pm
      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!