The rapid rise in desktop computing power has spawned a number of programming environments dedicated to music. Languages such as Csound and Cycling '74's Max, originally designed for institutional minis and mainframes, have been ported to desktop computers and enhanced with graphic interfaces and advanced audio-processing capabilities. Other programs, such as Native Instruments' Reaktor and Sound Quest's Infinity, have been developed specifically for the desktop musician. Those programs and others like them offer unlimited freedom of expression but require significant dedication to achieve it. In the words of the Infinity manual, “Make no mistake here, when building patches in Infinity you are programming.”
Infinity is an object-based graphical programming environment for Windows, similar in format to Max/MSP for the Mac OS. Version 2 adds extensive audio processing to Infinity's already robust MIDI capabilities. There have also been major upgrades to the user interface and programming structure. Among them is a new Explorer-style Tree View that lets you browse through SubPatches without opening and closing scads of separate windows. The number of objects for creating your own patches has more than doubled to 360, and the number of prebuilt synthesizers, effects processors, and SubPatches has also grown significantly.
In this review, I'll concentrate on Infinity's audio-processing capabilities. For a review of the MIDI side of Infinity, including MIDI and automation sequencing, see the September 2000 issue. (To find past articles about other programming environments, see the sidebar “Further Reading.”)
USE IT OR LOSE IT
Instruments created in Infinity can operate as standalone soft synths; they can also be used in any suitable VSTi or DXi host. Audio effects can be used in any VST or DirectX host, and MIDI effects can be used in any application supporting Cakewalk's MFX MIDI plug-in standard. What's more, Infinity can host plug-ins in VSTi, DXi, VST, and DirectX formats. That means you can use plug-ins in any of those formats in an Infinity patch, and then use that patch as a plug-in in any of those formats. Infinity supports any MIDI interface with Windows drivers and any audio card with MME, DirectSound, or ASIO drivers.
The Infinity package includes an installation CD and two printed manuals: the version 1 manual covers Infinity basics and MIDI programming, and the version 2 manual covers audio and all changes since version 1. Installation requires a serial number contained in the package, but no other form of copy protection is involved. Updates, additional documentation, and links to third-party developers and user groups are available on Sound Quest's Web site.
FROM HERE TO INFINITY
It's unusual to begin a product review with a discussion of its documentation, but with software as extensive as Infinity, documentation is a key issue. Infinity's is outstanding. For one thing, there are four separate paths to Infinity: an automated demo with individually playable segments covering various aspects of Infinity's operation and an animated HTML tutorial giving you a quick-start look at Infinity programming. Extensive online help is available, including step-by-step tutorials and complete descriptions of all Infinity objects, menus, and features; in addition, there are 270 pages of detailed, printed documentation.
Infinity's automated demo is part of the downloadable Infinity demo package, which includes a feature-limited version of the Infinity software. If you are on the fence about buying Infinity, I strongly suggest downloading the demo. You'll see that Infinity really is accessible to anyone willing to make the effort (see the sidebar “Infinity 1,2,3”).
For users with some experience with graphical music programming, the HTML tutorial is the place to start. It gives you a quick rundown of how Infinity works, what makes it different, and how to build devices in various categories. The manuals and online help provide complementary views of Infinity. Details such as the function of each of an object's inputs and outputs are in the online help, putting them under your fingertips where you need them. Larger concepts — processing priorities, for example, and why things work as they do — are discussed in the manuals. I perused the manuals away from the computer for a few hours and found it to be time well spent.
INTO THE BRIAR PATCH
Like most graphical user interfaces for music programming, Infinity uses the model of objects connected by patch cords. The objects do the processing and the cords carry information between objects. The structure is hierarchical in that any combination of objects and their connections can be collected together in a SubPatch, which then appears as an object with its own inputs and outputs.
Fig. 1 shows a typical patch in Tree View. The file tree on the left allows you to select the root patch or any of its SubPatches for viewing and editing in the patch section on the right. The patch shown is an electric piano and is one of several Infinity patches available from Dash Synthesis, a Web-based group of synth and sound designers (www.dashsynthesis.com). The patch's blue and yellow objects (center) constitute the actual electric piano, and the purple and gray objects to their right are for the panel graphics (see Fig. 2). You can guess from the size of the tree on the left (each folder represents a SubPatch) what a tangled mess the patch would be without SubPatches.
In addition to using SubPatches within patches, Infinity allows you to use patches that are stored on your hard drive as SubPatches. That helps save on memory by letting you store a patch once and use it in numerous different applications. It also gives you the added flexibility of changing the SubPatches used in a patch without doing any reprogramming. For example, you could design a synth without any built-in effects and provide a menu on its control panel for selecting among various effects saved on your hard drive.
Panel graphics are just another part of the patch in Infinity. There are four graphic objects: Background, Bitmap, Display, and GraphicWin. The first two let you import BMP-format bitmaps, and the other two are for drawing your own graphics. GraphicWin allows you to manage as many as 49 layers of graphic elements that can be addressed and automated from within the patch. In addition to background graphics, you can use your own BMP graphics for control elements, such as knobs and sliders, or use the large graphics library supplied with Infinity. The control panel in Fig. 2 illustrates those options.
In any programming environment, debugging is a fact of life, and Infinity provides a full assortment of debugging tools. The simplest is the Print object, which sends any message it receives to Infinity's Print Window. You can have multiple Print objects, and the Print Window shows the output of all Print objects since it was opened. That allows you to track the history of messages passing through one or more cords. In addition to the Print object, there are frequency-spectrum, oscilloscope, histogram, and audio-statistics displays. Fig. 3 shows examples of each display applied to a plucked-string sound. The audio-display objects can also be used as eye candy on Infinity control panels.
Beyond data display, Infinity has step- and trace-debugging modes. They allow you to set break-points anywhere within a patch and execute processing one message at a time after a break-point. With each message, the cord flashes, and the source and destination objects as well as the message content appear in the Print Window.
SOUND AND EFFECT
For sound processing, Infinity has four categories of objects: sources, filters, transformers, and delays. Rather than offering several objects of the same type with different characteristics (such as separate oscillators with different waveforms and modulation inputs), each category usually gives one object of each type that can be configured many ways.
For example, one Oscillator object offers all the standard waveforms and the option of defining your own custom waveform. The Oscillator has FM, pulse-width modulation, hard-sync inputs, and a built-in amplitude-envelope generator. Other objects intended primarily as sound sources include a Plucked-String object for Karplus-Strong-style physical modeling, a Sample player with as many as 128 key zones and 8 Velocity zones per key zone, a wavetable player, a six-operator FM oscillator, and a noise generator. Audio-rate control sources include an Envelope Follower (which actually generates envelopes), an LFO, and a Ramp generator.
Filters make up Infinity's largest class of processors. All the usual suspects are included, and as with the sources, fewer objects with more options is the strategy. Although all the filters' parameters can be modulated using the objects' event inputs, there is a special class of Infinity filters called modulatable, the parameters of which can be modulated on a sample-accurate basis using audio inputs. Generic finite-impulse-response (FIR) and infinite-impulse-response (IIR) filters are also provided for building a variety of theoretical filter types.
Infinity's complement of delay objects includes an allpass filter (for dispersion effects associated with reverb processing), two time-based delays (with and without modulation), and two sample-based delays (one with multiple taps). Other audio processing includes smoothing, panning, distortion, table lookup, and basic mathematical operations.
For all of its audio-processing power, Infinity's weakest area is in sample playback and management. No real tools are provided for granular synthesis, frequency-domain processing, pitch and formant shifting, or time stretching. Furthermore, though the Sampler object offers flexible key- and Velocity-zone mapping, sample maps cannot be saved to disk for loading into another Sampler object. Sound Quest is making an active effort to address all those areas, however, and improvements are sure to come in future releases.
GETTING PLUGGED IN
You can use Infinity's plug-in features to enhance and even combine plug-ins in any format supported by Infinity, and then use the resulting patch as a new plug-in in any of the supported formats. That means, for one thing, that Infinity can function as a plug-in translator between supported formats. The VST Instrument shown in Fig. 4 combines two VSTi instruments and two Infinity-built effects into a super VSTi instrument.
To build the patch in Fig. 4, I first created two VSTi Host objects and set them to host two free Steinberg plug-ins: Neon and VB-1. The idea was to build (as quickly as possible) a layered bass instrument that would play VB-1 sounds and layer them with Neon sounds above a certain Velocity threshold. Once I had the threshold circuitry working properly, I decided to drop in a distortion stompbox — which is one of the Infinity factory-effects patches — after Neon. Finally, I built a little feedback delay to process the VB-1 output and added an Oscilloscope object to display the final output. Even with some serious fumbling around, the whole process took only about an hour, and none of the SubPatches had more than 15 objects.
Once I had the layered bass patch working correctly in Infinity, I registered it as a VSTi synth in Cubase and Logic. Infinity does that for you with a single selection from its File menu once you have chosen your desired VST hosts in Infinity's preferences. The plug-in worked in both VST hosts with no problems. The file LayerBass.mp3 on the EM Web site was made in one pass using the layered-bass VSTi.
The question that naturally arises is whether you can distribute your Infinity-built VST plug-ins to other VST users. At this time, only other Infinity users will be able to use them as VST plug-ins. However, Infinity comes with a freely distributable Infinity Player that supports instruments and effects plug-ins. Sound Quest is planning to release a pro version of the Player (called Omega) in the near future that will support the use of Infinity-built plug-ins in any VST host.
MAKE THE CALL
If you have any inclination to find out what creating your own MIDI and audio applications under Windows is all about, Infinity is certainly an excellent place to start. As mentioned, the documentation makes getting started as easy as possible, you can learn a great deal from the provided examples, and you can actually design some creative musical tools without too much struggle.
If you have some experience with music-programming applications such as Reaktor, Max/MSP, or Csound, you will have no problem getting up to speed with Infinity. Although there are plenty of idiosyncrasies to master, the basics are the same. Infinity offers a broad spectrum of objects for both MIDI and audio processing, and if you are a C++ programmer, you can create your own where needed. (Infinity comes with an extensive Developers Kit for that purpose.)
At $399, Infinity is certainly fairly priced and right in line with other applications of its type. Given that you can get your feet wet by downloading the free demo version, a visit to Sound Quest's Web site is well worth the trip.
Len Sassocan be contacted through his Web site atwww.swiftkick.com.
Minimum System Requirements
Pentium II/333; 64 MB RAM; Windows 95/98/ME/2000/NT 4.0/XP
Infinity 2.05 (Win)
MIDI and audio programming environment
Upgrade from Infinity 1.0 $169
FEATURES4.0EASE OF USE3.5DOCUMENTATION4.5VALUE4.0RATING PRODUCTS FROM 1 TO 5
PROS: Powerful audio-processing and MIDI capabilities. Excellent user interface and documentation. Large factory library of examples and SubPatches.
CONS: Limited sample manipulation capabilities. Sample maps cannot be saved to disk for reuse.
INFINITY 1, 2, 3
Here's a brief look at programming with Infinity. I will start with the simplest possible synth patch and add enhancements until I have a basic FM synth.
The top left of Fig. A shows the simplest synth you can build with Infinity. It uses three Infinity objects: MIDI In, Oscillator, and Audio Out. When you play a key on your MIDI keyboard, this patch plays a sine wave at a pitch corresponding to the MIDI note number at a level controlled by the note's Velocity. It holds the note until you release the key. The Oscillator object can recognize MIDI events and adjust its behavior accordingly; it also has a pop-up menu for selecting its waveform.
Infinity objects have inputs at the top and outputs at the bottom. An object's inputs and outputs are color-coded: yellow for audio, blue for MIDI, and gray for regular Infinity messages (numbers and text). The Oscillator has one MIDI input, three regular inputs, and three audio inputs. The regular inputs are for setting oscillator parameters, and the yellow inputs are for modulation options. The second gray input (the third input from the left) can be used to set the oscillator's overall level and to define an amplitude envelope.
At the top right of Fig. A, I've added an object called a Message that is used to send messages to control another object's behavior. This Message object is cabled to the level/envelope input of the Oscillator. The message in the object is “.5; 10 1 0 500 .25 0 10 0 0.” That's actually two messages separated by a semicolon. The first message, “.5,” is a floating-point number and causes the Oscillator to set its level to .5. (The level is relative to unity gain or 0 dB, the Oscillator's default level. A setting of .5 corresponds to -3 dB.)
The second message is called a List. Lists count as one message but can contain many numbers separated by spaces. The Oscillator object uses a List at its third input to set up its amplitude envelope. Each envelope stage takes three parameters: duration (in milliseconds), level, and shape. In this case, the envelope has three stages: a 10 ms attack to full level (10 1 0), a half-second (500 ms) decay to 25 percent level (500 .25 0), and a 10 ms release segment to off (10 0 0). (The last zero in each segment indicates a straight line.) The resulting envelope is an ADSR envelope because the level of the next-to-last stage of any envelope is understood as a sustain level.
At the bottom left of Fig. A, I've added a number of objects that, taken together, provide FM of the Oscillator object by the LFO object just above it. (Note that the LFO object is just another oscillator, that its output is audio, and that when set to audio-range frequencies, the result is standard FM.) In brief, I've set up another envelope message; the Envelope Follower object converts that to an envelope signal (audio), and the Audio to Event object samples the envelope signal every 10 ms to generate events that follow the envelope contour. Those events are multiplied by two to control the overall envelope amount. In addition, the MIDI note number is converted to a frequency (in hertz) and multiplied by 1.25 to set the LFO frequency. The LFO object's output is patched to the FM input of the Oscillator object.
So far, everything is controlled by entering numbers and selecting from pop-up menus in the objects making up the Infinity patch. For more complex patches, that approach would be unwieldy (though it's not a bad way to start when you're experimenting with a new process). Infinity provides a full spectrum of control-panel objects and graphics. The elementary control panel at the bottom right of Fig. A shows how a control panel for the basic FM synth might look. Of course, incorporating the controls requires extra structure, making the patch harder to decipher.
“Csound Comes of Age”7/02Cycling '74 Max 4.0/MSP 2.0 review4/02“Master Class: Building a Reaktor”9/00“Master Class: Building Blocks” (Csound)10/00Native Instruments Reaktor 3.0 review3/02