f00. FTM Basics — Introduction

 

What is FTM?

 

FTM is a set of objects that extend the capabilities of Max, similarly to the way that MSP objects (for audio) and Jitter objects (for matrices and visualization) added new capabilities. FTM provides objects for storing, modifying, and accessing data—especially audio and other time-based data—and additional objects for using those data structures for sound analysis, synthesis, and processing, as well as for mapping, gesture following, and score following.

 

FTM stands for "faster than music". The name is a reference to an earlier project at IRCAM called FTS ("faster than sound") which was the first system for realtime sound processing in Max. FTM provides tools that can be useful for a variety of tasks related to sound and music processing. At its base FTM is a general set of objects for managing data, but other more specialized objects allow the programmer to use that data in specific contexts. The Gabor objects use data for sound analysis and processing related to granularization of sounds: windowing, FFTs, granular synthesis, etc. The MnM objects help translate data from one context to another. The Suivi objects assist in analyzing and tracking the content of a set of data. These objects are collectively known as FTM & Co.

 

Why Should I Use FTM?

 

Given that you've already taken the time to learn Max, and MSP, and Jitter—and perhaps various other computer music programming environments such as Csound or SuperCollider, as well as who-knows-how-many useful but complicated computer music applications such as Pro Tools, Logic, Reason, Live, etc.—you may well ask why you should take up valuable brain space learning one more set of computer music tools. The following tutorials and examples will attempt not only to help you understand how FTM works, but also to see its potential value.

 

Max is powerful for charting networks of messages between different objects, scheduling events, and for programming actions in response to user-generated events such as MIDI. However, it is arguably not as strong as some programming environments in terms of managing data. Most programming languages provide a variety of ways to arrange and access information, such as arrays (indexed lists) of a particular type of data like integers or floats, linked lists (arrays in which each element also contains a pointer to another element), matrices (multi-dimensional arrays), data structures (definable arrangements of diverse data), and so on.

 

Max has several objects that act as containers of data: table contains an array of integers, buffer~ contains an array of floats particularly suited to audio samples, umenu contains an array of messages, coll contains arbitrarily indexed messages, and Jitter provides matrices for containing two-dimensional or multi-dimensional arrays of integers, floats, or characters particularly suited to frames of video. With the MSP object sfplay~ and the Jitter object jit.qt.movie one can also access data continuously from disk. So that's a fairly good variety of ways of managing data, but each has its own purpose (messages, numbers, audio, video, etc.) and its own set of methods (messages that it understands).

 

If you want to store an array of numbers in memory for easy access in Max, the table object, or the coll object, or the MSP buffer~ object, or the Jitter jit.matrix object are the most likely ways to do that, depending on whether you want to store ints, floats, audio, or video (viz. multi-dimensional arrays).

 

Objects like table and coll are most suited for accessing single numbers or messages from the collection, while jit.matrix and buffer~ allow access to many numbers at once or as a continuous audio stream respectively. Max has as a strength the ease with which it permits one to repurpose data; for example, in Max one can visualize audio data, use a characteristic of audio or video as control data, use MIDI data to control other media, and so on.

 

Some of the advantages that FTM provides are:

1)    FTM has a consistent syntax for accessing and modifying a variety of data structures, thus operating on sizable chunks of data all at once.

2)    FTM enables one to modify data in-place (without passing it from one object to another) and often remotely (without patch cords).

3)    Whereas Max's message timing and MSP's audio timing are related-but-separate, and the two only can interact once per sample vector (an interval of time determined by how many samples of audio MSP is set to process at one time), FTM enables one to enact processing of audio data with sub-sample accuracy, which is crucial for high quality accurate signal processing and granular synthesis.

4)    FTM allows one to relate various kinds of time-based and time-tagged data such as audio samples, breakpoint functions and other arbitrary curves, MIDI events, and descriptive musical "score" objects, with a set of objects that are designed to work together.

5)    FTM presents some new and useful ways of visualizing and editing that data.

6)    While FTM establishes its own object set and syntax for managing data, it also provides ways to convert that data for, or share it with, standard Max, MSP, and Jitter objects.

 

Tutorials and Examples

 

The following chapters endeavor to explain FTM in simple terms, demonstrate its power, and show some applications for which it is particularly well suited.