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.