Max 9 is available today, bringing benefits for casual tinkerers and hardcore devs alike. There’s more code, more performance, more livecoding, more visual powers, and – one more thing: you get the building blocks Ableton uses for sound.
Crucially, this release adds depth while opening up accessibility to different audiences. Max has never been more approachable than before for these groups, thanks to these feature additions:
- ABL: for casual music users (especially with an Ableton Live background)
- V8/codebox: for JavaScript users
- Jitter UIs: for people building interfaces
- Jitter Geometry: for folks coming from Blender and other similar environments
- Jitter FX: for VJs
- Parameter Control, Remote Control: for everyone, really
Ableton building blocks and Devices
Ableton Audio Objects (ABL) will steal the show right away. Cycling ’74 has built direct access to Ableton’s sound tools directly into the Max environment. That means you can open up versions of complete devices like the Roar distortion/shaper/modulation effect, gorgeous Drift synth, and multi-faceted Echo, and integrate them with your patches. There are also lower-level DSP building blocks so you can construct your own devices using the same materials Ableton uses. You’re basically getting access to Ableton’s kitchen of DSP. What’s in there:
- 10 Devices: Drift, Roar, Compressor, Limiter, Reverb, and more… (abl.device.xxx~)
- 55 DSP objects: oscillators, filters, reverb, distortion, etc… (abl.dsp.xxx~)
- Connect individual Devices (like device.roar~) or components (like the excellent dsp.swarmsaw~)
So look, a device like Drift or Roar is now just – an object you can patch (check the parameters for roar~):
Here it is in action:
These are “black boxes” in that you can patch them and get parameter control, but you can’t open them up. That said, with all the DSP building blocks, who’s complaining? Look:
Each of those is its own world to explore:
Parameter connect, OSC connections
The old way of connecting parameters to other parameters – catch and throw, send and receive, etc. – requires a lot of manual labor. Parameter Connect now lets you do this interactively, magically, without even patch cords. It’s accessed via the param object, and it’s ridiculously intuitive. Since connecting stuff to stuff is what Max is all about, this is an especially big deal.
It’s not supported through Max yet, but where it is supported is really essential – and this could be a reason to upgrade for RNBO and Gen developers:
- ABL
- jit.fx
- Gen
- jit.gl.slab
- JavaScript V8 (via the new JavaScript attribute API)
Even better, you can now automatically communicate parameter values to and from patches via Open Sound Control (OSC). (I remember having a conversation about wanting to do this with OSC like 20 years ago!) Auto-discovering parameters and interactively configuring controllers and interaction now becomes possible.
(This also looks especially great as it’s something we tried to do back in the day with libpd and other efforts.)
Powerful UIs with Jitter
This takes a once headache-inducing task and makes it mind-searingly easy. jit.ui builds interface elements in the Jitter rendering window, with full-3D widgets you can easily interact with. You have to see this in action to really appreciate it, because you can use your mouse and keyboard to directly edit position and size, with the whole thing scaling to the window.
Here’s how it looks in a patch (note the slide object, for instance):
And here are some awesome examples of the kind of UIs you can build with striking ease. Duckie, I choose you!
Jitter FX and Jitter Geometry
If ABL is the main reason for sound folks to be excited about Max 9, Jitter FX and Jitter Geometry give an equally hefty update on the visual side.
First, there’s jit.fx, an all-new library of real-time filters, effects, blends, and other live visual processing. This alone is a big departure for Jitter, as it makes Jitter more accessible for casual visual hackers and artists. They’ve wrapped all their shader-based effects into a format that lets you easily play with them so that GPU-accelerated goodness is ready for your hacking enjoyment. That includes all the Max 8 effects plus a bunch of new Max 9 effects.
Here’s how it looks (rapid visual sequence warning):
There are plenty of environments that let you run shaders these days, but not necessarily that make it easy to play with them. With macro controls ready to go, jit.fx is different. So send that squirrel into another dimension:
The bigger news, though, is jit.geometry, which brings computational geometry as you know from environments like Blender into the powerful, patchable world of Max. That also makes Max a fluid, realtime, hackable environment to mess with geometry when working with other environments like Blender, Unity, TouchDesigner, and Unreal. The breakthrough of Jitter Geometry is working outside Jitter’s previous triangle soup and primitive grid world, instead navigating meshes by connections, which opens up options like:
- mesh subdivision
- mesh smoothing
- remeshing
- UV generation
- face properties
Plus you can export all of this – see below.
For those of us who love patch/node-based environments, the thought of opening things up and messing around with them in Max patches rather than just the tedium of 3D tools is a delight. And the whole thing is silky smooth. They even showed ray-traced examples, running comfortably on everyday hardware. (Or grab that new M4 Mac mini, of course…)
There are other key Jitter improvements, as well, making Jitter look better and manage time more efficiently than ever before:
- Improved jit.gl. pass architecture for advanced rendering, post processing
- Included pass effects like global illumination (ReSTIR), screen space ambient occlusion (SSAO), depth of field, vignetting, and more.
- Better with time: jit.line, jit.bang, jit.framecount now give you reliable timing for real-time and nonrealtime rendering alike. And the new fixed_delta locks timing across your whole patch.
- New Jitter Gizmos for orienting jit.world rotation, translation, and scaling (including key modifiers for those).
- Macros – the same as was used for jit.fx above, presumably, helping out package developers.
- Jitter shader enhancements for better Shadertoy uniform support.
- Jitter transparency rendering
- Jitter Geometry Export: exports from any Jitter GL that uses geometry to PLY, STL, and GLTF (correct answers there, Cycling! no more crude OBJ …)
Unfortunately, Jitter is still bound to the now-deprecated OpenGL. I do hope we see Vulkan and Metal support soon. That’s a horrifyingly big task, so I’m glad this isn’t my job, but I’m cautiously optimistic based on the great results we’re seeing from software like VDMX. Performance now is great, and honestly, you can safely leave this to the developers, but I think it’ll be worth the wait when it does arrive. That’s an easy prediction based on the gains we’re seeing elsewhere. (To be clear, OpenGL’s implementation on macOS runs on Metal – so for now this is fine.)
Code everywhere
Code anywhere you like, and code faster – all while still taking advantage of visual patching. That’s the message here.
Codebox, the Max interface for typing in code for gen and RNBO, is now available all over the place in Max for text-based coding your way, right away, everywhere:
- v8.codebox
- node.codebox
- dict.codebox
- coll.codebox
- gen.codebox
- gen.codebox~
- jit.gen.codebox
- jit.pix.codebox
- jit.gl.pix.codebox
- osc.codebox
Then, JavaScript support now uses ES6+ and the V8 JavaScript engine, the same blazing-fast engine in Chrome and Node.js, via v8 and v8ui. (js and jsui are still there for backward compatibility.) You can save that code right in-patch with the embed attribute. This is a real breakthrough for what you can do in Max, and I’d say generally, now, Max’s in-patch browser support is unparalleled.
They don’t say this, but this to me also opens up rapid prototyping options for JavaScript developers even if the ultimate target is the Web. (Maybe that’s because I have a mixed code and patch background, but the chance to quickly play around with parameters while perfecting JavaScript code is far faster than having to rely on just one or the other when in that rapid hack mode.)
But the code element I’m most excited by is the new REPL object – imagine live coding in Max, and then imagine that it lives inside the Max console. (Whaaaaat??) REPL = read–eval–print loop, but what that means for live coding is, you make code changes and stuff happens right away. This looked incredible in the demo:
Quality of life
Other good stuff:
- hi is replaced with hid! Yeah, USB user fans, now you finally get modern interaction device support and exclusive control on macOS X.
- Color-code object syntax
- Global Record so you can grab audio from any Max patch immediately – sample away, then bring the results into a DAW/other software/hardware!
- List View and Media Browser – this looks far better
- FPS, CPU meters, and other toolbar enhancements
- loudness~ with EBU and LUFS support! Hey, mastering in Max!
- jweb~ sticks a webpage in your patch and renders audio out to Max (I said this was the best environment now for Web devs)
- Revert to Saved!
- Clearer documentation browser (all easier to find)
- New String stuff: string.regexp, string.sprintf – excellent.
- New Array Objects: also huge, if buried in the news. Think array.expr, array.fill, array.random, array.min, array.max, array.mean, array.median, array.mode, array.stddev
And there’s this new icon.
What does this mean for Gen, RNBO, and Max for Live users?
The updates here are generally for Max and Jitter proper, not the other environments. But RNBO and Gen users do benefit from some of the new workflow stuff, Cycling ’74 confirms.
Both RNBO and Gen automatically work with the Parameter Connect feature. That also means you can quickly create UIs for those environments.
And then there’s the Gen integration with codebox, as Cycling ’74’s Andrew Benson explains:
There are Gen object variants of codebox (gen~, gen, jit.gen, jit.gl.pix, jit.pix) so you can author Gen codebox code (genexpr) directly in a top-level patcher and it will work exactly as if it were inside of a Gen object. This is really great when you have an idea for some DSP code or a visual effect but you don’t want to jump into another patching window.
Max for Live users not worried about distributing their patches can start using Max 9 with Ableton Live right away. For distribution, though, the usual applies – Max for Live typically lags the mainstream Max release by a bit, as we await the testing and delivery of the bundled version of Max in Ableton Live. The good side of that is, it means greater predictability when distributing patches.
I’ve covered some other recent updates for RNBO:
I’ve got Max 9 now. Stay tuned – lots more to say. Let us know what you want to know or see.