CNMAT's expanding collection of Max/MSP/Jitter patches designed for composers, programmers, performers and music educators. The MMJ-Depot includes basic programming tips, modular programming units for copy and paste, interactive tutorials on all aspects of computer music, and functioning musical works with commentary and criticism.
Design and Implementation of CNMAT's Pedagogical Software (ICMC 2007) explains the genesis and structure of the Max/MSP/Jitter (MMJ) Depot.
Join the MMJ Depot Users Group to participate and receive news about MMJ Depot developments. Join the MMJ Depot Contributors Group to become an active software contributor to the Depot.
The MMJ-Depot is available as a single download
(Downloads>Major Packages>Max/MSP/Jitter Depot).
visit Cycling74 (commercial distributor/developer for Max/MSP/Jitter)
A generalized package, to be used in an application, demo, tutor, or tutorial. Modules are addressable with
OSC messages.
Below is a list of all modules by type. Click here to browse modules by categories.
A large group of patches derived from Ali Momeni's aLib, at: http://alimomeni.net/aLib
dump out contents of a collection as a list
Small UI in a bpatcher for generating read and write messages
Wrappers for a number of controllers. Many wrappers use OSC-style max messages.
OSC wrapper for the Behringer BCF2000, programmed in Javascript.
This patch was designed for use with the Pelican brand "Chameleon" wireless gaming controller.
OSC wrapper for the Peavey PC-1600 or PC-1600x “MIDI command station”
OSC wrapper for the propedals usb controller, made by ch products.
OSC wrapper patch for the Mercurial STC-1000 touchpad
OSC wrapper for the Xkeys controller
A package containing patches for processing data from Wacom Tablets.
display bar for wacom-interpreter data
interprets data from the wacom object for use with other CNMAT wacom objects
linearly scale wacom tilt to desired range
Modules pertaining to generating data
Creates numerical sequences that are "Lucas Sequences" -- such as fibonacci numbers.
Modules pertaining to storing and retrieving data.
records one data stream into a collection, and plays it back
records one data stream into an audio buffer, and plays it back
this patch records lists into a collection, and plays them back
modules relating to transformation of incoming data
A package of patches for calibrating incoming data.
adjusts a running stream of numbers to the required range
adjusts a running stream of numbers to the required range, and adjusts the zero point
changes OSC-style messages into other OSC-style messages
Modules related to spatialization, etc.
A package of patches for controlling signal panning using Ville Pulkki's VBAP
gui for defining loudspeaker placement
controls panning: 2-10 inputs, 4-8 outputs
controls panning -- 1 in x (4-8) out
This module is a collection of classic audio "effects."
a simple, mono chorus with variable feedback
see: Roads, The Computer Music Tutorial, p. 439
granularly transposes playback from tapin~ buffer
public domain reverb
a simple ring-modulator
modules relating to MIDI data
map midi pitch bend values (0-127) to values between -1 and 1
map midi vel to gain (dB)
Modules related to Sample recording and playback
Groovewrap is a playback wrapper for the groove~ object with memory and recall.
Groovewrap~ is a playback wrapper for the groove~ object with memory and recall.
a graphical user interface for groovewrap~
Modules related to synthesis
A collection of simple synths.
simple, old-school drum machine
monophonic sawtooth wave synth with filter
step sequencer for mz.sawsynth~
all the synths in one handy grouping
five triangle waves in a delicious sauce
This module frees the user from the tedious details of synthesizing sinusoidal models from SDIF files.
Depot modules pertaining to Timing and Rhythm
A package for scheduling events based on a signal-driven metronome.
simple auditory feedback for sub-beat
an interface for triggering events on specific sub-beats
an interface for triggering events on specific sub-beats
a phasor~-based metronome
reports beat groups and subdivisions from a master tempo
A generally useful patch with a complete enough GUI that it can be used without doing any Max programming. An Application is a turnkey solution to some problem, not a reusable software component. Applications are suggested when a composer or researcher desires to share an activity that has become habitual to the point where a fixed environment can exist. Applications might edit or reformat data, provide composer or audio engineering assistance, as well as operate on or perform digital sound in a specified way.
A standalone, 8-track recorder, with or without nixie tubes
A general purpose cue player for pieces including instrument and "tape" where the tape part might be several different cues as several different audio files.
Quickly sets up the internal General MIDI Synthesizer in a traditional orchestra.
Handy calculations for computer music.
some ways to visualize audio signal with (and without) jitter
Provides a workspace for transforming sinusoidal models into resonance models, auditioning, and editing.
Lets the user create, edit, and record phrases base on sets of samples.
Downloads and reports current weather conditions in United States Locations.
The tutorials explain specific topics in depth; they cover programming details as necessary but tend to focus on core theoretical and conceptual issues in computer music, synthesis, signal processing, etc. Tutorials are designed primarily for learning purposes, but are also available to be plundered.
A large number of tutorials on using CNMAT objects for spectral (additive and resonant) synthesis. Includes use of SDIF and OSC.
All the in-class and activity patches from the Day School
A Max/MSP/Jitter (MMJ) patch and reference document that serves as a single collection point for the expanding communal wisdom on a particular MMJ object or programming topic. For an advanced user it is a mnemonic aid and for entry level users it is learning space.
A tutor demonstrating aliasing.
Basic ideas about DSP and scheduler settings
Beginning Max users see the manual with a couple hundred max objects and get intimidated. But this is like trying to learn English by looking at the Oxford Unabridged Dictionary. In fact", most of those 200 objects are special-purpose, or could be programmed with a few more "primitive" objects. If someone really takes the time to thoroughly understand a small group of max objects, then they are well on their way to successful programming.
Tutors about specific objects
Max's expr and sprintf externals are essential tools because of their extreme generality. expr allows the construction of almost any mathematical expression, and sprintf provides the full generality of C's sprintf() procedure for formatting text strings.
Unfortunately, both of these tools are hampered in critical and confusing ways by the way Max itself deals with text.
sends a bang to all loadbangs
"set" message: theory and practice
tutor for sprintf syntax and uses
objects that reassign the priority of max messages
A few patches for exploring ratio-based intervals and tuning.
An example patch for auditioning arbitrary stoppings of a string. Both sides can be plucked.
A patch for exploring relationships between various ratio-derived intervals.
Kind of a disturbing patch that confuses shows how to get the most out of your patch cords.
Demonstrates some techniques for dealing with a data stream, perhaps from a sensor.
A patch that shows one (impressive) idea, not necessarily with enough flexibility or generality to be useful for extended work (Desired reaction: “Wow!”) Formatted for projection.
Based on David Wessel's "migrators" patch, this patch demonstrates control of multiple oscillator banks with OSC Max messages. The user can control wavetables, pitch profiles, and "gaussian blur" for each voice. Presets may be saved and recalled with pattr.
Music 158 demos
In the Spring of 2007 I was lucky enough to enroll in Music 158 at UCB. I had been spending all of my free time sequencing and synthesizing before attending Berkeley and was upset to see that I didn’t have many options to continue with that at Cal. However, when I discovered 158 I was pumped! This project is a culmination of my programming in that class and I presented it as my final project at the end of the semester. I ended up fashioning three main patches to make up my mini techno orchestra. The orchestra is made up of one drum machine, one bass machine and one sequencing synth.
The first window that opens is the Master Window. From this window you can monitor the gain of each synth and pan the sounds to either the left or right. You can open each instrument by clicking the button next to the patch. Most importantly you can open the Audio Out window and record your song using the application inside of that window. The best way to record is have your sequences running. While this is happening click the open button. Save your file name and then click record. When you click record it automatically goes to beat one— there will sound like there is some clipping but it won’t come through in the recording. When you are done recording hit the stop button. If you stop the sequencer it will to continue recording until you click stop.
The Sequencer Synth has only one channel and plays up to an octave chromatically. Each sixteenth note can be a 5 different velocities including off. You can store pitch and velocity patterns separately. Make sure it is paused when loading up presets. The harmonic table on the right is real time. Make sure to turn off the interpolator if you are trying to build and save your own wavefoms. The envelope is also realtime. Click and drag to shape it. Shift click deletes dots. Hit play (the spacebar) and experiment.
In the Machines you can load up 8 different sounds by clicking the load button and finding an AIFF drum sound you would like to import. Then you can click the toggles to trigger that sound. To mod the sound use the 3 different velocities, use the knob on the left to adjust pitch&length, the knob on the right for channel volume and the “M” button for mute. There is also an overdrive slider and a bit crushing slider. Both the Bass and Drum Machines have what I named “scorers”. I wrote a score using binary messages sent to the toggles to play the demo.
A demonstration of voice synthesis using harmonics~ to simulate the glottis and resonators~ to simulate the vocal tract.
A specific kind of Application that is "branded" by a composer. Repertoire is intended for performance (concert, installation, internet, CD) and involves a special intent (to form one musical world or specific piece).
It is not enough to ask “What can this software do?” By presenting technologies in an aesthetic context, the repertoire integrated into the Depot answers to the question: “What is this software good for?”
pieces by Edmund Campion
Pieces by Michael Zbyszynski
Alone in a Crowded Room a situation for solo alto flute and live electronics (2005)
Michael Ferriell Zbyszynski
My musical interests in Alone in a Crowded Room are twofold. Electronically, I am exploring macroscopic and microscopic processes in the time domain. At the same time, I am engaged with the physical reality of the alto flute and by extension, the flautist.
The long delay lines at the beginning of the piece are an example of macroscopic process; the technique has long been a part of compositional vocabulary from analogue tape loop to cannon at the unison. In this piece it creates the situation for an interior monologue between the player and himself. Concepts repeat, decay, and interact with one another, creating new layers of meaning with each recontextualization. As the piece progresses, microscopic process come to the foreground. The sound of the flute is broken into individual grains that gradually loose cohesion. The monologue branches out, as memories of the original performance split into fragments.
Daguerreotype for Violoncello and Electronics
pieces by Ronald Bruce Smith
Five pieces for Guitar and Live Electronics was commissioned under a UC Discovery grant from the University of California’s Industry-University Cooperative Research Program (IUCRP) and Gibson Guitar Corporation. It was made possible through the support of the Center from New Music and Audio Technologies (CNMAT), Department of Music, University of California, Berkeley. The aim of the commission was to incorporate into a concert piece for solo guitar the guitar-centered software technology that researchers there had developed. These guitar effects were developed in the Max/MSP environment and I make use of a number of them as well as a few other things that are not in the specific package.
The composition consists of five short pieces and, as might be gathered by the titles of each piece, it is reflective of our current time of conflict. Much of the music in this composition requires a high-level of guitar virtuosity. It was written with the outstanding technique and musicianship of David Tannenbaum in mind.
Some of the CNMAT Depot may rely on the following third party objects:
Also recommended, but not required, are:
searching for Max/MSP/Jitter objects:
for Jitter:
CNMAT Baseline is the set of softwares that MMJ-Depot software (tutors, apps, modules etc.) may depend on. Always include the current Baseline collection in your Max search path.
a collection of patches for common DSP situations
Asymmetrically applies a hyperbolic tangent function to a signal.
rms-based amplitude envelope follower with lowpass filter
controls overall gain for 2-24 audio signals
half-wave rectifier
controls stereo panning and amplitude in dB for a mono audio signal
Signal-domain version of scale
Like selector~ but with a settable ramp time instead of abrupt click.
A collection of small patches that solve common programming problems
Like "change" but works for symbols.
Outputs difference between current and previous input.
Given a float, output the integer part (rounding towards zero) and the fractional part (a float of the same sign as the input, with absolute value between 0 and 1).
version 1.1
outputs list of last n inputs
Just like ==, except that there's tolerance factor for the maximum allowable difference between two "nearly" equal values.
The nothing object doesn't do much, but it can be handy for wiring.
single-pole lowpass filter
Like "pipe" but accepting lists and messages as well as floats and ints.
round to nearest integer, even if negative
By default, Max "truncates" floats when turning them into integers. That is 1.01 would turn into 1, as would 1.999. If you want 1.999 to be rounded to 2, then use this abstraction.
randomly reorders a list
Like "select" with one argument, except that the value it's looking for must be held for long enough (i.e., no different inputs may come) to get the bang out the left outlet.
A gate for floats that outputs a zero when closed and then outputs the most recently received input when its reopened.
this abstraction helps you read sound files into buffer~'s
simplified way to load lots of coll files
creates a number of SDIF buffers with common names and OSC addressing
There are two important aspects to the programming style of the CNMAT MMJ Depot. First, it should be relatively easy for developers to add new patches and second, it should invite users to copy and paste elements into their own patches. To facilitate these, the number of required elements are minimal. Specifically:
Another important consideration is avoiding duplication. Whenever there are two copies of a piece of software, inevitably one ends up changing (like when a bug is fixed), and then the other copy doesn't get updated, so they go out of synch. (This is called "version skew" and it drives people like Matt and Michael crazy.) So never have two copies of the same patch in two different places in the Depot; instead move that useful patch into a module or the baseline. And before you add something new to the Depot, see if you can find something already there that does the same job.
Finally, we are recommending that patches accept control parameters in the form of OSC-style Max messages. This is especially relevant in Modules -- groovewrap is a good example.
##
Every patch or textual source code file should contain a comment listing the names of the authors and the year(s) it was written.
Software developed by CNMAT students, faculty, and staff almost always belongs to the University.
We generally use the standard UC Regents license, which grants "Permission to use, copy, modify, and distribute this software and its documentation for educational, research, and not-for-profit purposes" along with a lot of legal language protecting the University.
There is an even more open license that grants "Permission to use, copy, modify, distribute, and distribute modified versions of this software and its documentation without fee and without a signed licensing agreement", even for for-profit purposes. This is our "open source" license, used, for example, by our OSC libraries, which are included in commercial products by, e.g., Native Instruments.
In the event that we don't have permission to assert a UC copyright, such as with Public Domain Software, the disclaimer should still be included.
License and disclaimer patches can be found in /MMJ-Depot/baseline/support/
While not every patch implements all of these messages, these are some very common and desirable messages for a patch to understand:
Each patch or external should have a help patch listing all of its features. The help patch should show how the object would be used in context and designed for easy cut and paste.
For a file named something.pat, something.mxb, or something.mxt, its help patch should be named something.help.pat
A generic help file can be found in the repository in /MMJ-Depot/baseline/support/
Every filename must end with a valid suffix to ensure cross-platform compatibility.
It must be possible to have “everything from CNMAT” (the MMJ Depot, all CNMAT’s externals, our recommended third-party externals, etc.) in one’s search path with no name conflicts.
Whenever possible avoid name conflicts with other third-party externals, patches, packages, etc.
CNMAT does not have a filename prefix for all the patches in the MMJ Depot. (E.g., our envelope follower is called “envelope-follower~”, not “cnmat.envelope-follower~”.)
Patches names should say what the patch does clearly and succinctly. It’s a bit of an art to find the “sweet spot” between completely descriptive byt annoyingly long and hard to type patch names versus terse and noninformative patch names.
The name of a patch should say what the patch does, not what context the author of the patch originally intended it to be used in. E.g., a GUI wrapper around lookup~ should not be called “phasor-groove~” just because it was written to sit between a phasor~ object and a groove~ object.
## Version numbers
Each external should include its version number as described here. Packages of patches that we release with the old new Max downloads page can have their version and other information in the same format in a separate "infosource.txt" file.
Each patch or at least package should have a comment listing the version number. (E.g., the individual patches in the Spectral Tutorials don't have version numbers, but the entire tutorial package does.)
We're not consistent about the exact form of the version number, like 1.2 vs. 1.2.3. Sometimes the version number has text in it, like 1.9test. Sometimes the version number encodes the alpha/beta status, like "version 0.9alpha".
Some people use the convention that versions beginning with "0" are pre-release, and that 1.0 is the number of the first released version.
Bottom line: higher numbers are usually more recent.