It's the dog days of summer, a great time to go digging through the package manager for some new tools to add to your Max toolkit. Today I'm going to share one that holds a special place in my heart and was recently added to the Max Package Manager — CNMAT's ODOT.
When I first learned Max, I was in an algorithmic composition course taught by a visiting scholar from CNMAT, Matt Schumaker. Naturally, that meant I started out my Max journey with the full set of CNMAT externals. Any time I'm without the objects, I notice just how integral they are to my patching!
In this article, we'll take a look at two quick reasons to check out ODOT in particular: 1. the OpenSoundControl object 2. o.expr.codebox
Open Sound Control
At its core, ODOT works with the Open Sound Control (OSC) protocol, a flexible data serialization protocol that is used throughout the computer music world, such as with monome grid devices and the TouchOSC iOS application. OSC uses UDP networking, so to use OSC with native Max objects, you can use udpsend or udpreceive objects. However, as you might have learned from the help patcher tabs of those native Max objects, those objects contain only a subset of the features of CNMAT’s OpenSoundControl external available in the ODOT package.
If you open the OpenSoundControl help patch, you’ll see all of the capabilities available, including debugging options, time tags, type tags, and much more. I’m particularly a fan of the string substitution options available.
If you spend any time at all sending and/or receiving OSC messages, this object is worth checking out.
I suspect some readers are like me and sometimes just want to sprinkle in some codeboxing into non-gen~ patchers. The o.expr.codebox is an easy way to write out procedural code directly in the patch without whipping out a js or node.script object. Besides evaluating mathematical expressions, o.expr.codebox is capable of performing recursion, working with dynamic OSC addresses, handling conditional operators, and more.
In this quick example, you can see how easy it is to grab the minimum and maximum values of a multislider without using a single zl object.
There are dozens more useful built-in functions besides the extrema function in this example, and each has its own help patch readily available in the o.expr.overview.maxpat documentation.
If you’re not in the mood to write any code yourself, there are clever examples available that you could easily grab and incorporate into your own patches, too. One of my favorites is o.demo.cellular.automata.maxpat for visualizing cellular automata:
Now that you’ve seen two of the reasons I am constantly reaching for ODOT, I hope you’ll take the chance to give it a whirl yourself. Follow along with the package's extensive built in tutorials or play around with their examples and see what speaks to you!