Since its introduction in 1998, Max/MSP has quickly become one of the premier development tools for sound design and music composition. Max is a powerful, graphical-object-oriented, interactive programming language for MIDI. It was developed at IRCAM and has remained under continuous development by David Zicarelli and Cycling '74 since 1989. MSP expands on Max by adding a powerful suite of real-time audio Objects. Combined with the extensive support provided by third-party developers, the two programs give you one of the most complete programming environments for multimedia production available today.
Unlike sequencers and audio editors, Max/MSP does not have one primary purpose. You can use it to build your own application or to customize someone else's to fit your needs. In this review, we'll focus on the new features of Max 4.0 and MSP 2.0 and look at the software's ability to construct real-time synths and sound processors.
Although Max is available separately, Max and MSP are typically sold as a bundle. The bundle also includes a utility that lets you use the audio plug-ins you develop in Max/MSP within a VST, a MOTU Audio System (MAS), and, soon, a Real Time AudioSuite (RTAS) host. Max/MSP runs only on the Mac, but a Windows version is currently in development.
MSP has received two EM Editors' Choice awards, in 1999 for the first release of the program, and again in 2002. Max was also a 2002 winner. MSP 1.0 was reviewed in the October 1998 issue.
To write programs (which are called patches in Max/MSP), you can start from scratch or modify one of the plentiful examples. Programming takes place in the Patcher window, where you connect Max/MSP Objects (represented as boxes) together with patch cords. Max/MSP comes with several hundred Objects that perform a huge range of tasks, from adding two numbers together to waveform editing. You can write your own Objects in Max/MSP or in the C programming language. Hundreds of Objects written by users are available on the Internet.
KNOW THE CHANGES
Max 4.0/MSP 2.0 is more than just the first major revision in almost five years — it is an explosion of creative thinking and innovation. This release further advances a sound synthesis and MIDI environment that is terrifically deep, accessible to users of varying levels of expertise, and eminently well organized and thought out.
Users acquainted with previous versions should have few problems adapting to Max 4.0/MSP 2.0. Many changes involve enhancements to the editing interface of the Patcher window and the addition of tools that are used to create spiffy graphic interfaces. But with more than 40 new Max 4.0 Objects and 70 new MSP 2.0 Objects, the revision is far from just cosmetic. Important capabilities for the treatment of polyphonic Objects and for building frequency-domain processors are among the many enhancements.
SOUND INS AND OUTS
Whereas earlier MSP versions included specific drivers for various audio cards, MSP 2.0 relies on ASIO drivers (an MSP Sound Manager driver is still provided). Not surprisingly, users must provide ASIO drivers for their audio interfaces.
For this review, the software was tested on a G3/400 MHz using two audio cards: a Korg 1212 I/O and an Audiomedia III. Each card offered challenges involving Web scavenging and trial and error. For example, the ASIO driver for the Korg was hard to find but worked flawlessly when it was installed in the MSP ASIO Drivers folder. The driver for the Audiomedia III has yet to work with both analog and S/PDIF outputs functioning simultaneously.
The driver story doesn't stop with ASIO: four other audio protocols are supported in MSP 2.0. The ReWire driver lets you route MSP output to applications such as Steinberg Cubase and Mark of the Unicorn (MOTU) Digital Performer. The DirectConnect driver allows you to play MSP into Digidesign's ProTools (when used with version 5.0 or later of the DigiSystem Init).
The VST driver lets MSP talk to a special VST plug-in, which allows MSP to be used as an effects plug-in for a VST-compatible sequencer. Finally, the NonRealTime driver permits complex processing operations that exceed real-time playback to be recorded to disk — a nice touch.
Driver options are set in the first pane of the DSP Status window (see Fig. 1). The top pane includes Audio on/off, Driver selection, Clock Source, and Prioritize MIDI, a control that runs audio processing at a lower priority to permit more frequent MIDI interrupts.
MSP has 512 logical channels and as many physical-device channels as your sound card can handle — a decided improvement to the previous limit of 16. To assign the other 510 channels to your sound-card farm, click on the I/O Mappings button to open a subwindow that displays all channel mappings.
Next, let's look at the revision of items and controls in the Max/MSP menu bar. The Edit menu is much the same, though it now contains a clever and useful new command called Paste Replace. That command lets you replace a group of Objects with a single Object. The contents of other menus have been altered, and two new menus have been added.
The new View menu controls the appearance of the Patcher window during editing. There you'll find one of the program's most used commands, Edit, along with a number of other useful commands. Edit is used to toggle between locked and unlocked (Edit mode) states of the Patcher window. The View menu also contains commands to facilitate the manipulation of Objects in the Patcher window, such as Hide/Show Object Palette, Hide/Show Connections, and Restore Origin.
The new Extras menu is a handy and customizable repository for useful utilities such as Audiotester, which helps you diagnose audio-output problems; an input/output monitor; Quickrecord, for recording the output of a patch to an audio file; and a Tips section, which contains practical information about working with Max/MSP.
One of the most remarkable additions to the Max/MSP interface, Contextual menus, isn't found on the menu bar at all. A Contextual menu appears when you Control-click on an Object; the resulting pop-up menu lists the commands for that particular Object.
For example, Control-clicking on a patch cord produces a Contextual menu in which you can invoke the Align feature (to make neat, straight, or right-angle patch-cord paths), color the patch cord using the customizable Color-Palette submenu, or hide or show the patch cord when the Patcher window is locked.
Control-click on the blank area of a Patcher, and an all-purpose menu appears that lets you accomplish simple tasks, including Lock the Patcher, Select All, and Get Info on an Object. It also provides a pop-up, vertical version of the horizontal Object palette (usually seen running along the top of the Patcher window in Edit mode).
This all-purpose menu also includes a New Object option that shows a list of all the Max built-in Objects. Click on an Object in this menu, and it appears in the Patcher window. The New Object menu also duplicates certain items in the Options menu and includes a submenu to call up example Patchers.
There are other interface changes, as well. For example, almost all of the dialog boxes in Max/MSP have been replaced by Inspectors that open when you choose Get Info from the Object window. Inspectors are special Patchers that let you change properties of individual Objects. You can inspect multiple Objects by using the new Floating Inspector, a window that remains on the desktop and shows the properties of each selected Object in turn.
A cool and timesaving feature lets you easily duplicate Objects. Select an Object from the Object palette, drag it over the Patcher window, and hit Control + Shift, and then everywhere you click, you will deposit a copy of that Object. All of the previously mentioned shortcuts, Inspectors, and pop-up submenus are real time-savers, and it's obvious that the Max/MSP designers put a great deal of thought into streamlining their software's human interface.
A significant difference between version 2.0 of MSP and earlier versions relates to the management of polyphony. It was possible to achieve polyphony in previous versions, but doing so required a lot of copying and pasting and wasted CPU cycles. (In earlier versions of the program, sound-processing Objects ran continuously, whether you heard their signals or not). MSP 2.0's new strategy for dealing with polyphony is the poly~ Object, which takes two arguments: the name of a subpatcher to be played polyphonically and a number that indicates maximum polyphony.
The patch on the left side of Fig. 2 shows an example of poly~. This patch uses 16 voices of a patch called Plucker, which makes a plucked-string sound using the Karplus-Strong synthesis algorithm. By sending the poly~ Object a MIDI Note On message, notes are routed automatically to any Plucker patches that are not busy making sound. In hardware synthesizers, that is called dynamic voice allocation.
On the right of Fig. 2, you can see the structure of the Plucker patch. The actual synthesis part (written in Max/MSP) is encapsulated into its own Object, called ks~. The surrounding patch interfaces ks~ to the demands of the poly~ system by converting incoming MIDI note numbers to frequency and Velocity to amplitude. It also contains an Object called thispoly~, which reports when the patch is actually making sound. That is necessary for dynamic voice allocation to work.
That description gives some idea of how to work with the new MSP polyphonic management, but nothing can convey the fun of listening to the patch just described or the pleasure of working interactively in such a rich environment for sound production. It may be going too far to call it the nirvana or elysian fields of software-synthesis programming, but Max/MSP comes close.
The pfft~ Object greatly simplifies spectral-domain signal processing and lets you create subpatches that manipulate frequency-domain signal data independent of windowing overlap and fast Fourier transform (FFT) size. Pfft~, like poly~, works with a subpatcher as one of its arguments and is suitable for multiple applications.
Fig. 3 shows a pfft~ patch and subpatch (specdelay~) that use a delay line in the frequency domain, a spectral-processing algorithm that is similar to the one used by Native Instruments' Spektral Delay software. What does a frequency-domain delay line mean? Broadly speaking, the pfft~ Object processes FFT frequency bins sequentially from low to high frequency. When those bins are delayed, the energy in a low-frequency bin is shifted over to a higher-frequency bin, and eventually, the energy in the higher-frequency bins wraps around to lower frequencies. The effect is something like a filter, but not exactly. The specdelay~ subpatch also includes a feedback control that adds even more unusual effects.
The Examples section of the distribution CD contains many wonderful examples that illustrate the power of the pfft~ environment. Among the best of them are the pfft~ version of the Forbidden Planet Patcher and the Phase Vocoder Sampler. Forbidden Planet controls the output of the FFT bins with a graphic interface, which allows you to draw the shape of a filter on a graphic equalizer with as many as thousands of bandpass filters.
Speaking of graphic interfaces, the new Max/MSP is a much more image-oriented and colorful place to work. A variety of new color options are available for elements such as patch cords and comments. You can change color attributes simply by opening the Contextual menu (Control-clicking) on the item and selecting a color. Colors are selected from a palette of 15 colors that you can customize using a hue and saturation control.
Fig. 4 shows some of those options at work. Clockwise from top left are a yellow slider with Windows-style pop-up help, a swatch Object that is connected to a panel to determine its color, a pictslider control with graphic image and slider, a radiogroup radio-button control group, a purple button with shading, Object boxes with colored patch cords, and a graphic dial (for a pink-noise generator) with a colored number box.
With all the new Objects in Max 4.0 and MSP 2.0, this review can only begin to communicate the wealth of processing capabilities they represent. Special attention was given to the all-important area of filters — not that the programs were lacking there before.
The centerpiece of the MSP 2.0 filter suite is the filtergraph~ Object. Filtergraph~ is not a signal processor by itself; instead, it generates filter coefficients that are then used by the MSP biquad~ filter Object. That permits you to build filters simply and directly and also allows you to input your own filter coefficients.
Other new filter Objects include fffb~, an efficient bank of bandpass filters; svf~, a state-variable filter that provides simultaneous output from different filter types; teeth~, a comb filter with independent feedback and feedforward delay times; onepole~, a single-pole lowpass filter; and buffir~, a finite impulse-response filter that uses a buffer to store data points convolved with the input signal.
There are other important new additions, as well. The oscbank~ and ioscbank~ Objects are noninterpolating and interpolating wavetable oscillator banks, respectively. Those Objects are capable of generating hundreds of sine-wave oscillators simultaneously and are a welcome addition to the MSP Object repertoire. They are also very computationally efficient.
The sfplay~ and sfrecord~ Objects have been improved, with sfplay~ sporting new features such as variable-speed playback, sample-accurate cue looping and triggering, signal outputs for playback position, and correct playback of files with sampling rates other than the current MSP sampling rate. Those Objects support several new file formats — including NeXT/SUN(AU), WAV, and Raw Data — and new sample formats, such as 32-bit float, 64-bit double, and 8-bit µlaw. The sfrecord~ Object offers support for as many as 28 audio channels, and you can load multiple instances of sfrecord~ until you hit the 512 limit or your computer gives out.
There are also enhancements to the Patcher, specifically in the areas of scripting and automatic patch generation. The tutorials illustrate some impressive concepts, and the new feature shows terrific promise.
PATCH IT UP
Max/MSP's first major revision in almost five years is both a resounding and an unqualified success. New Objects abound, among them new methods for polyphony management and spectral-domain signal processing. The user interface has been improved, and new tools for designing custom graphic interfaces have been included.
The documentation for Max/MSP is thorough and complete, both in quality and in quantity, and weighs in at about 1,500 electronic (PDF) pages. A group of 88 tutorials included in the distribution represents a well-thought-out introduction to Max/MSP and is designed to assist those who do not have any previous programming experience. Manual pages are complete, with plenty of illustrations. A terrific Help facility with working examples and a library of example patches add another avenue to this fertile environment for multimedia development.
Thomas Wellshas been involved in computer music for more than 25 years. He teaches at Ohio State University. Dennis Milleris an associate editor ofEM.Thanks to Professor Todd Winkler of Brown University for his assistance with this article.
Minimum System Requirements
PPC 604e/300; 64 MB RAM; OS 8.1
Max 4.0/MSP 2.0 (Mac) programming environment
Max 4.0/MSP 2.0 bundle $495
Max 4.0 $295
Max 4.0/MSP 2.0 upgrade $135
FEATURES5.0EASE OF USE4.0DOCUMENTATION4.5VALUE4.0
RATING PRODUCTS FROM 1 TO 5
PROS: Excellent tool for real-time sound synthesis and multimedia development. Elegant user interface. Terrific documentation. Large number of third-party Objects and Patchers available.
CONS: Doesn't support Mac OS X.