MaxAPI PDF
MaxAPI PDF
MaxAPI PDF
7.1.0
Objects in C: A Roadmap
Max has an extensive API for developing new objects in C.Before you start learning about it, however, we would like
to save you time and make sure you learn the minimum about the API for what you need to do. Therefore, we've
made a brief list of application areas for object development along with the sections of this document with which
you'll probably want to become familiar.
For logic and arithmetic objects, such as new mathematical functions or more complex conditional operations
than what is offered in Max, it should be sufficient to read the Anatomy of a Max Object section.
For objects that use Data Structures, you'll want to read, in addition, the Atoms and Messages section to learn about
Max's basic mechanisms for representing and communicating data.
If you are interested in writing interfaces to operating system services, you may need to learn about Max's Thread-
ing model and The Scheduler.
For objects that deal with time and timing you'll want to learn about The Scheduler. If you're interested in tempo-
based scheduling, you'll want to read the section on ITM and look at the delay2 example.
To create new user interface gadgets, you'll want to read all of the above, plus the section on Attributes and the
Anatomy of a UI Object. The section on JGraphics will also be helpful.
To create objects with editing windows, things are much more complicated than they used to be. You'll need to
learn everything about UI objects, plus understand the scripto example object project.
For patcher scripting and interrogation objects, the section on Scripting the Patcher, plus a few of the examples will
be very helpful. It is also helpful to have a clear conceptual understanding of the patcher, which might be aided by
reading the patcher scripting sections of the js object documentation.
Max 6 introduced support for passing structured data with the Dictionary Passing API.
To create audio filters and signal generators, read the Anatomy of a Max Object, then read the Anatomy of a
MSP Object section. MSP objects make use of Creating and Using Proxies when receiving multiple audio inputs,
so familiarity with that concept could be helpful.
For audio objects that output events (messages), you'll need to use the services of The Scheduler, so we suggest
reading about that.
For UI objects for analyzing and controlling audio, you'll need to learn about regular MSP objects as well as Max UI
objects.
Information on updating MSP objects from Max 5 or earlier for 64-bit audio (introduced in Max 6) is located in
2 Objects in C: A Roadmap
The Jitter Object Model outlines some important basic information about Jitter's flexible object model. Jitter Max
Wrappers describes how to write Max wrapper objects that contain Jitter objects for use in the Max patcher world.
Matrix Operator QuickStart and Matrix Operator Details describe how to create a particular type of Jitter object
called matrix operators, or MOPs. OB3D QuickStart and OB3D Details describe how to create OB3D Jitter objects
for use in rendering OpenGL scenes. Scheduler and Low Priority Queue Issues covers important threading and
timing issues when building Jitter objects. Jitter Object Registration and Notification explains how Jitter objects
can be registered by name and notify clients as they change or important events occur. Using Jitter Objects in
C provides some examples of how to instantiate and take advantage of Jitter objects from C, just as one would
from Java, Javascript, or the patcher. Finally, The JXF File Specification and Jitter Networking Specification contain
information relating to the data formats involved in the JXF file format and Jitter networking protocols, respectively.
2.1 Building
This SDK documentation is accompanied by a series of projects for compiling some example Max external objects.
The details of how to build these projects are documented below in separate sections for the Mac and Windows.
When you build the example projects, the resulting Max external will be located in a folder called "externals" at the
top level of the SDK package. This is located a couple of folders up from the project and source file.
Place the SDK package in your "Packages" folder in order to load and test the externals you build in Max itself.
We have provided a basic script that will build all of the projects in the SDK at once. This script is written using the
Ruby language. A Ruby interpretter is standard on the Mac. On windows you can download and install Ruby (1.9.3
recommended) from http://rubyinstaller.org/ .
Run from Terminal.app (Mac) or a Command Prompt (Windows) by cd'ing into the examples directory, and then
running:
ruby build.rb
2.3 Mac
Max external objects for the Mac are Mach-O bundles (folders that appear to be files) whose filenames must end
with the .mxo extension. The example projects have been tested using Xcode 6.2. Xcode is available through the
Apple Mac Store.
After installing Xcode, if you wish to run the aforementioned Ruby script, you will also need to install the Command
Line Tools. This is done via the menu item: Xcode > Open Developer Tool > More Development Tools...
The example projects are set up to have Development and Deployment build configurations. The Development
configuration does not optimize and ensures debugging symbols are present. The Deployment configuration creates
a universal binary and performs optimization.
The files required for the projects are included in the project folders with the exception of the following two files:
• Info.plist
4 Development System Information
• maxmspsdk.xcconfig
These two files are located one folder-level up from the project folder, and are required for the Xcode project to build
the Max external.
External objects use dynamic linking to access the API functions provided by the Max application. When an object
is loaded, calls to functions inside the application are resolved by the operating system to the correct memory
address. Due to the fact that "Max" could exist as an application, a standalone you create, or a library inside
another application, an object's Xcode project does not link directly to a framework, library, or application. Instead,
the list of permitted symbols is provided to the linker. This list is defined in the aforementioned maxmspsdk.xcconfig
file.
Audio objects will link against MaxAudioAPI.framework and Jitter objects link against JitterAPI.framework. Alterna-
tively, you could also provide linker flags as we have provided for Max itself. The most recent version of all frame-
works will be found inside the application you are using (they are found inside the application bundle in Contents/←-
Frameworks). In addition, there are versions inside the c74support folder provided with the SDK. These will be used
only to link your objects; they are never actually executed.
Xcode uses something called the Frameworks Search Path to locate frameworks when linking. The example SDK
projects use a frameworks search path with a c74support folder two levels up from your the folder containing your
Xcode project. If you rearrange the SDK folders, projects may not find the frameworks and will fail to link properly.
Furthermore, even though we specify the frameworks search path, Xcode seems to look in /Library/Frameworks
first. If you have installed a version of the Max SDK for version 4.6 or ealier, you may have older versions of
MaxAPI.framework and MaxAudioAPI.framework in /Library/Frameworks. When you try to link objects that contain
references to functions only defined in the newest MaxAPI.framework, the link may fail because the projects are
using the old frameworks. To fix this, you'll need to remove the Max frameworks from /Library/Frameworks. If you
want to develop objects for both the Max 4.6 and Max 5 SDKs on the same machine, you'll need to modify your 4.6
projects to specify a Frameworks Search Path, and relocate the 4.6 frameworks to the specified location.
2.4 Windows
Max external objects for Windows are Dynamic Link Libraries (DLLs) whose filenames must end with the .mxe
extension (for 32-bit builds) or .mxe64 (for 64-bit builds). These DLLs will export a single function called "ext_←-
main" which is called by max when the external object is first loaded. Generally these DLLs will import functions of
the Max API from the import library "MaxAPI.lib" which is located in the c74support\max-includes\ folder. External
objects that use audio functionality will import functions from the import library "MaxAudio.lib" which is located in
c74support\msp-includes\. External objects that use Jitter functionality will import functions from the import library
"jitlib.lib" which is located in c74support\jit-includes\.
The example projects are in Visual C++ 2013 format (vcxproj files). A free version of Visual C++ can be obtained
from Microsoft at http://www.microsoft.com/express/. You will want to choose "Visual Studio Express
2013 for Windows Desktop".
The projects are set up to have both a Debug and a Release configuration. The Release configuration is optimized
whereas the Debug one is not. Note that for debugging purposes you can exercise your object in the Max Runtime
since the copy protection for the Max Application will interfere when run under the debugger.
Another thing to note is that Max has a private build of the Microsoft C Runtime Library for historical and backward
compatibility reasons. It is recommended that you link with Microsoft's standard C runtime library rather than the
Max C runtime library. When you include "ext.h" from the max API it will include ext_prefix.h which for the release
build will automatically cause your project to use the max C runtime library. To use the Microsoft C Runtime define
the C preprocessor macro MAXAPI_USE_MSCRT before including ext.h.
The easiest way to create a new external is to choose one of the existing SDK examples, duplicate it, and then
change only the settings that need to be changes (such as the name of the project). This will help to guarantee that
important project settings are correct. Project settings of particular importance are noted below.
2.5.1 Mac
Particularly important for Max externals on the Mac are that the Info.plist is correct set up and that the "Force
Package Info Generation" is set to true. Without these your object may fail to load on some machines.
2.5.2 Windows
In the preprocessor definitions for the Visual Studio project it is important to define WIN_VERSION and EXT_WI←-
N_VERSION to ensure that the headers are set up properly.
2.6 Platform-specificity
If you are writing a cross-platform object and you need to do something that is specific to one platform, the Max API
headers provide some predefined symbols you can use.
#ifdef MAC_VERSION
// do something specific to the Mac
#endif
#ifdef WIN_VERSION
// do something specific to Windows
#endif
Another reason for conditional compilation is to handle endianness on the Mac platform. If you are still supporting
PowerPC, you may have situations where the ordering of bytes within a 16- or 32-bit word is important. ext_←-
byteorder.h provides cross-platform tools for manipulating memory in an endian-independent way.
2.7 Configuration
As the Max API evolves, the use of a number of older legacy functions are discouraged. Use of said functions will
issue a 'deprecation' warning when you try to compile the code. To disable these deprecation warnings you can
define the preprocessor symbol C74_NO_DEPRECATION in the target preprocessor section of your IDE.
Max objects are written in the C language, and the Max API is C-based.
You could use C++ but we don't support it at the API level. Writing a Max object in C, you have five basic tasks:
1) including the right header files (usually ext.h and ext_obex.h)
2) declaring a C structure for your object
3) writing an initialization routine called ext_main that defines the class
4) writing a new instance routine that creates a new instance of the class, when someone makes one or types its
name into an object box
5) writing methods (or message handlers) that implement the behavior of the object
Let's look at each of these in more detail. It's useful to open the simplemax example project as we will be citing
examples from it.
Most of the basic Max API is included in the files ext.h and ext_obex.h. These are essentially required for any object.
Beyond this there are specific include files for more specialized objects.
The header files are cross-platform.
#include "ext.h" // should always be first, followed by ext_obex.h and any other files.
Basic Max objects are declared as C structures. The first element of the structure is a t_object, followed by whatever
you want. The example below has one long structure member.
Your structure declaration will be used in the prototypes to functions you declare, so you'll need to place above these
prototypes.
8 Anatomy of a Max Object
The initialization routine, which must be called ext_main, is called when Max loads your object for the first time. In
the initialization routine, you define one or more classes. Defining a class consists of the following:
1) telling Max about the size of your object's structure and how to create and destroy an instance 2) defining
methods that implement the object's behavior 3) in some cases, defining attributes that describe the object's data
4) registering the class in a name space
Here is the simp class example initialization routine:
static t_class *s_simp_class; // global pointer to our class definition that is setup in ext_main()
class_register(CLASS_BOX, c);
s_simp_class = c;
}
In order for Max to call the ext_main() function on your compiled external, that function must be "exported" or made
public. This is accomplished by using the C74_EXPORT macro in the prototype of the ext_main() function, which is
provided for you automatically in the "ext.h" header file.
class_new() creates a class with the new instance routine (see below), a free function (in this case there isn't one,
so we pass NULL), the size of the structure, a no-longer used argument, and then a description of the arguments
you type when creating an instance (in this case, there are no arguments, so we pass 0).
class_addmethod() binds a C function to a text symbol. The two methods defined here are int and bang.
class_register() adds this class to the CLASS_BOX name space, meaning that it will be searched when a user tries
to type it into a box.
Finally, we assign the class we've created to a global variable so we can use it when creating new instances.
More complex classes will declare more methods. In many cases, you'll declare methods to implement certain API
features. This is particularly true for UI objects.
The standard new instance routine allocates the memory to create an instance of your class and then initializes this
instance. It then returns a pointer to the newly created object.
Here is the simp new instance routine
void *simp_new()
{
t_simp *x = (t_simp *)object_alloc(s_simp_class);
x->s_value = 0;
return x;
}
The first line uses the global variable s_simp_class we defined in the initialization routine to create a new instance
of the class. Essentially, the instance is a block of memory of the size defined by the class, along with a pointer to
the class that permits us to dispatch messages correctly.
The next line initializes our data. More complex objects will do a lot more here, such as creating inlets and outlets.
By default, the object being created will appear with one inlet and no outlets.
Finally, in the last line, we return a pointer to the newly created instance.
We are now ready to define some actual behavior for our object by writing C functions that will be called when our
object is sent messages. For this simple example, we will write only two functions. simp_int will be called when our
object receives numbers. It will store the received number in the s_value field. simp_bang will be called when our
object receives a bang. It will print the value in the Max window. So, yes, this object is pretty useless!
The C functions you write will be declared according to the arguments the message requires. All functions are
passed a pointer to your object as the first argument. For a function handling the int message, a single second
argument that is a long is passed. For a function handling the bang message, no additional arguments are passed.
Here is the int method:
This simply copies the value of the argument to the internal storage within the instance.
Here is the bang method:
The post() function is similar to printf(), but puts the text in the Max window. post() is very helpful for debugging,
particularly when you cannot stop user interaction or real-time computation to look at something in a debugger.
You can also add a float message, which is invoked when a floating-point number is sent to your object. Add the
following to your initialization routine:
Then write the method that receives the floating-point value as follows:
You are familiar with inlets and outlets when connecting two objects together in a patcher.
To receive data in your object or send data to other objects, you need to create the C versions of inlets and outlets.
In this section, we'll explain what inlets and outlets are, how to create them, and how to use them. We'll also discuss
a more advanced type of inlet called a proxy that permits a message to be received in any of your object's inlets.
Proxies are used by audio objects to permit inlets to handle both signals and normal Max messages.
By default, every object shows one inlet. Additional inlets appear to the right of the default inlet, with the rightmost
inlet being created last.
Inlets are essentially message translators. For example, if you create an int inlet, your object will receive the "in1"
message instead of the "int" message when a number arrives at this newly created inlet. You can use the different
message name to define special behavior for numbers arriving at each inlet. For example, a basic arithmetic object
in Max such as + stores the number to be added when it arrives in the right inlet, but performs the computation and
outputs the result when a number arrives in the left inlet.
Outlets define connections between objects and are used to send messages from your object to the objects to
which it is connected. What is not obvious about an outlet, however, is that when you send a number out an outlet,
the outlet-sending function does not return until all computation "below" the outlet has completed. This stack-based
execution model is best illustrated by observing a patch with the Max debugger window. To understand this stack-
based model it may be helpful to use the breakpoint and debugging features in Max and follow the stack display as
you step through the execution of a patch. Outlets, like inlets, appear in the order you create them from right-to-left.
In other words, the first inlet or outlet you create will be the visually farthest to the right.
Proper use of an inlet involves two steps: first, add a method that will respond to the message sent via the inlet
in your initialization routine, and second, create the inlet in your new instance routine. (Creating inlets at any other
time is not supported.)
There are three types of inlets: int, float, and custom. We'll only describe int and float inlets here because proxies
are generally a better way to create an inlet that can respond to any message. For int inlets, you'll bind a function
to a message "in1", "in2", "in3" etc. depending on the inlet number you assign. Here's how to create a single inlet
using "in1"...
In your initialization routine:
In your new instance routine, after calling object_alloc() to create your instance:
intin(x, 1);
The method that will be called when an int is received in the right inlet:
12 Inlets and Outlets
Creating a single inlet in this way gives your object two inlets (remember that it always has one by default). If you
want to create multiple inlets, you'll need to create them in order from right to left, as shown below:
intin(x, 2); // creates an inlet (the right inlet) that will send your object the "in2" message
intin(x, 1); // creates an inlet (the middle inlet) that will send your object the "in1" message
Inlets that send float messages to your object are created with floatin() and translate the float message into
"ft1","ft2","ft3" etc. Example:
In initialization routine:
floatin(x, 1);
Method:
Note that you can mix int and float inlets, but each inlet must have a unique number. Example:
intin(x, 2);
floatin(x, 1);
You create outlets in your new instance routine. Outlet creators return a pointer that you should store for later use
when you want to send a message. As with inlets, outlets are created from right to left.
Here's a simple example. First we'll add two void pointers to our data structure to store the outlets for each instance.
x = (t_myobject *)object_alloc(s_myobject_class);
x->m_outlet2 = bangout((t_object *)x);
x->m_outlet1 = intout((t_object *)x);
return x;
These outlets are type-specific, meaning that we will always send the same type of message through them. If you
want to create outlets that can send any message, use outlet_new(). Type-specific outlets execute faster, because
they make a direct connection to the method handler that will be called at the time you send a message. When we
want to send messages out these outlets, say, in our bang method, we do the following:
The bang method above sends the bang message out the m_outlet2 outlet first, then sends the number 74 out the
m_outlet1. This is consistent with the general design in Max to send values out outlets from right to left. However,
there is nothing enforcing this design, and you could reverse the statements if you felt like it.
A more general message-sending routine, outlet_anything(), will be shown in the Atoms and Messages section.
A proxy is a small object that controls an inlet, but does not translate the message it receives. Instead it sets a
location inside your object's data structure to a value you associate with the inlet. If the message comes "directly" to
your object via the left inlet, the value will be 0. However, in order to be thread-safe, you should not read the value
of this "inlet number" directly. Instead, you'll use the proxy_getinlet() routine to determine the inlet that has received
the message.
The advantage of proxies over regular inlets is that your object can respond to any message in all of its inlets, not
just the left inlet. As a Max user, you may already appreciate the proxy feature without knowing it. For example, the
pack object can combine ints, floats, lists, or symbols arriving in any of its inlets. It uses proxies to make this happen.
MSP audio objects that accept signals in more than one inlet use proxies as well. In fact, the proxy capability is built
into the way you create audio objects, as will be discussed in the Anatomy of a MSP Object section.
If your object's non-left inlets will only respond to ints or floats, implementing proxies is usually overkill.
4.4 Example
First, add a place in your object to store the proxy value. You shouldn't access this directly, but the proxy needs it.
Second, you'll need to store the proxy, because you need to free it when your object goes away. If you create many
proxies, you'll need to store pointers to all of them, but all proxies share the same long integer value field.
In your new instance routine, create the proxy, passing your object, a non-zero code value associated with the proxy,
and a pointer to your object's inlet number location.
If you want to create regular inlets for your object, you can do so. Proxies and regular inlets can be mixed, although
such a design might confuse a user of your object.
Finally, here is a method that takes a different action depending on the value of x->m_in that we check using
proxy_getinlet().
When a Max object receives a message, it uses its class to look up the message selector ("int", "bang", "set" etc.)
and invoke the associated C function (method).
This association is what you are creating when you use class_addmethod() in the initialization routine. If the lookup
fails, you'll see an "object doesn't understand message" error in the Max window.
Message selectors are not character strings, but a special data structure called a symbol (t_symbol). A symbol
holds a string and a value, but what is more important is that every symbol in Max is unique. This permits you to
compare two symbols for equivalence by comparing pointers, rather than having to compare each character in two
strings.
The "data" or argument part of a message, if it exists, is transmitted in the form of an array of atoms (t_atom). The
atom is a structure that can hold integers, floats, symbols, or even pointers to other objects, identified by a tag. You'll
use symbols and atoms both in sending messages and receiving them.
To illustrate the use of symbols and atoms, here is how you would send a message out an outlet. Let's say we
want to send the message "green 43 crazy 8.34." This message consists of a selector "green" plus an array of three
atoms.
First, we'll need to create a generic outlet with outlet_new in our new instance routine.
The second argument being NULL indicates that the outlet can be used to send any message. If the second
argument had been a character string such as "int" or "set" only that specific message could be sent out the outlet.
You'd be correct if you wondered whether intout() is actually just outlet_new(x, "int").
Now that we have our generic outlet, we'll call outlet_anything() on it in a method. The first step, however, is to
assemble our message, with a selector "green" plus an array of atoms. Assigning ints and floats to an atom is
relatively simple, but to assign a symbol, we need to transform a character string into a symbol using gensym().
The gensym() function returns a pointer to a symbol that is guaranteed to be unique for the string you supply. This
means the string is compared with other symbols to ensure its uniqueness. If it already exists, gensym() will supply
a pointer to the symbol. Otherwise it will create a new one and store it in a table so it can be found the next time
someone asks for it.
atom_setlong(argv, 43);
atom_setsym(argv + 1, gensym("crazy"));
atom_setfloat(argv + 2, 8.34);
In the call to outlet_anything() above, gensym("green") represents the message selector. The outlet_anything()
function will try to find a message "green" in each of the objects connected to the outlet. If outlet_anything() finds
such a message, it will execute it, passing it the array of atoms it received.
16 Atoms and Messages
If it cannot find a match for the symbol green, it does one more thing, which allows objects to handle messages
generically. Your object can define a special method bound to the symbol "anything" that will be invoked if no
other match is found for a selector. We'll discuss the anything method in a moment, but first, we need to return to
class_addmethod() and explain the final arguments it accepts.
To access atoms, you can use the functions atom_setlong(), atom_getlong() etc. or you can access the t_atom
structure directly. We recommend using the accessor functions, as they lead to both cleaner code and will permit
your source to work without modifications when changes to the t_atom structure occur over time.
In the simp example, you saw the int method defined as follows:
The A_LONG, 0 arguments to class_addmethod() specify the type of arguments expected by the C function you
have written. A_LONG means that the C function accepts a long integer argument. The 0 terminates the argument
specifier list, so for the int message, there is a single long integer argument.
The other options are A_FLOAT for doubles, A_SYM for symbols, and A_GIMME, which passes the raw list of
atoms that were originally used to send the Max message in the first place. These argument type specifiers define
what are known as "typed" methods in Max. Typed methods are those where Max checks the type of each atom in
a message to ensure it is consistent with what the receiving object has said it expects for a given selector.
If the atoms cannot be coerced into the format of the argument type specifier, a bad arguments error is printed in
the Max window.
There is a limit to the number of specifiers you can use, and in general, multiple A_FLOAT specifiers should be
avoided due to the historically unpredictable nature of compiler implementations when passing floating-point values
on the stack. Use A_GIMME for more than four arguments or with multiple floating-point arguments.
You can also specify that missing arguments to a message be filled in with default values before your C function
receives them. A_DEFLONG will put a 0 in place of a missing long argument, A_DEFFLOAT will put 0.0 in place
of a missing float argument, and A_DEFSYM will put the empty symbol (equal to gensym("")) in place of a missing
symbol argument.
The symbol argument s is the message selector. Ordinarily this might seem redundant, but it is useful for the
"anything" method as we'll discuss below.
argc is the number of atoms in the argv array. It could be 0 if the message was sent without arguments. argv is the
array of atoms holding the arguments.
For typed messages, the atoms will be of type A_SYM, A_FLOAT, or A_LONG. Here is an example of a method
that merely prints all of the arguments.
case A_LONG:
post("%ld: %ld",i+1,atom_getlong(ap));
break;
case A_FLOAT:
post("%ld: %.2f",i+1,atom_getfloat(ap));
break;
case A_SYM:
post("%ld: %s",i+1, atom_getsym(ap)->s_name);
break;
default:
post("%ld: unknown atom type (%ld)", i+1, atom_gettype(ap));
break;
}
}
}
You can interpret the arguments in whatever manner you wish. You cannot, however, modify the arguments as they
may be about to be passed to another object.
As previously mentioned, your object can define a special method bound to the symbol "anything" that will be
invoked if no other match is found for a selector. For example:
Your function definition for an anything method follows the same pattern as for all other A_GIMME methods:
The Scheduler
• The Overdrive setting determines whether scheduler polling occurs in a high-prority timer thread or the main
thread
• The Interval setting determines the number of milliseconds elapse between polling the scheduler
• The Throttle setting determines how many tasks can be executed in any particular scheduler poll
Similar Throttle and Interval settings exist for the low-priority queue as well.
For more information refer to the Timing documentation. While the details might be a little overwhelming on first
glance, the important point is that the exact time your scheduled task will execute is subject to variability. Max
permits this level of user control over the scheduler to balance all computational needs for a specific application.
void *m_clock;
} t_object;
2. Write a task function that will do something when the clock is executed. The function has only a single argument,
a pointer to your object. The example below gets the current scheduler time and prints it.
{
double time;
sched_getftime(&time);
post("instance %lx is executing at time %.2f", x, time);
}
3. In your new instance routine, create the clock (passing a pointer to your object and the task function) and store
the result in your object's data structure.
4. Schedule your clock. Use clock_fdelay() to schedule the clock in terms of a delay from the current time. Below
we schedule the clock to execute 100 milliseconds from now.
clock_fdelay(x->m_clock, 100.);
If you want to cancel the execution of a clock for some reason, you can use clock_unset().
clock_unset(x->m_clock);
object_free(x->m_clock);
Note that if you call clock_delay() on a clock that is already set, its execution time will be changed. It won't execute
twice.
A qelem ("queue element") is used to ensure that an operation occurs in the low-priority thread. The task function
associated with a t_qelem is executed when the low-priority queue is serviced, always in the main (user interface)
thread. Any qelem that is "set" belongs to the low-priority queue and will be executed as soon as it serviced.
There are two principal things you want to avoid in the high priority thread: first, time-consuming or unpredictable
operations such as file access, and second, anything that will block execution for any length of time – for example,
showing a dialog box (including a file dialog).
The procedure for using a qelem is analogous to that for using a clock.
1. Add a member to your object's data structure to hold a pointer to the qelem
void *m_qelem
} t_myobject;
2. Write a task function that will do something when the qelem is executed. The function has only a single argument,
a pointer to your object.
3. In your new instance routine, create the qelem (passing a pointer to your object and the task function) and store
the result in your object's data structure.
4. Set the qelem by using qelem_set(). You could, for example, call qelem_set() in a clock task function or in direct
response to a message such as bang or int.
qelem_set(x->m_qelem);
If you want to cancel the execution of a qelem for some reason, you can use qelem_unset().
qelem_unset(x->m_qelem);
5. In your object's free routine, call qelem_free(). Do not call object_free() or freeobject() – unlike the clock, the
qelem is not an object.
qelem_free(x->m_qelem);
Note that if you call qelem_set() on a qelem that is already set, it won't execute twice. This is a feature, not a bug,
as it permits you to execute a low-priority task only as fast as the low-priority queue operates, not at the high-priority
rate that the task might be triggered. An example would be that a number box will redraw more slowly than a counter
that changes its value. This is not something you need to worry about, even if you are writing UI objects, as Max
handles it internally (using a qelem).
6.3 Defer
The defer function and its variants use a qelem to ensure that a function executes at low-priority. There are three
variants: defer(), defer_low(), and defer_medium(). The difference between using defer() and a qelem is that defer()
is a one-shot deal – it creates a qelem, sets it, and then gets rid of it when the task function has executed. The
effect of this is that if you have some rapid high-priority event that needs to trigger something to happen at low-
priority, defer() will ensure that this low-priority task happens every time the high-priority event occurs (in a 1:1
ratio), whereas using a qelem will only run the task at a rate that corresponds to the service interval of the low-
priority queue. If you repeatedly defer() something too rapidly, the low-priority queue will become backlogged and
the responsiveness of the UI will suffer.
A typical use of defer() is if your object implements a read message to ask the user for a file. Opening the dialog in
the timer thread and waiting for user input will likely crash, but even if it didn't, the scheduler would effectively stop.
To use defer(), you write a deferred task function that will execute at low priority. The function will be passed a
pointer to your object, plus a symbol and atom list modeled on the prototype for an anything method. You need not
pass any arguments to the deferred task if you don't need them, however.
To call the task, use defer() as shown below. The first example passes no arguments. The second passes a couple
of long atoms.
t_atom av[2];
atom_setlong(av, 1);
atom_setlong(av+ 2, 74);
Defer copies any atoms you pass to newly allocated memory, which it frees when the deferred task has executed.
6.4 Schedule
The schedule() function is to clocks as defer() is to qelems. Schedule creates a clock for a task function you specify
and calls clock_fdelay() on it to make the task execute at a desired time. As with defer(), schedule() can copy
arguments to be delivered to the task when it executes.
A schedule() variant, schedule_defer(), executes the task function at low priority after a specified delay.
Memory Allocation
char *ptr;
char **hand;
ptr = sysmem_newptr(2000);
post("I have a pointer %lx and it is %ld bytes in size",ptr, sysmem_ptrsize(ptr));
ptr = sysmem_resizeptrclear(ptr, 3000);
post("Now I have a pointer %lx and it is %ld bytes in size",ptr,
sysmem_ptrsize(ptr));
sysmem_freeptr(ptr);
hand = sysmem_newhandle(2000);
post("I have a handle %lx and it is %ld bytes in size",hand,
sysmem_handlesize(hand));
sysmem_resizehandle(hand, 3000);
post("Now the handle %lx is %ld bytes in size",hand, sysmem_ptrsize(hand));
sysmem_freehandle(hand);
24 Memory Allocation
An MSP object that handles audio signals is a regular Max object with a few extras.
Refer to the simplemsp∼ example project source as we detail these additions. simplemsp∼ is simply an object that
adds a number to a signal, identical in function to the regular MSP +∼ object if you were to give it an argument of 1.
Here is an enumeration of the basic tasks:
#include "z_dsp.h"
When creating the class with class_new(), you must have a free function. If you have nothing special to do, use
dsp_free(), which is defined for this purpose. If you write your own free function, the first thing it should do is call
dsp_free(). This is essential to avoid crashes when freeing your object when audio processing is turned on.
After creating your class with class_new(), you must call class_dspinit(), which will add some standard method
handlers for internal messages used by all signal objects.
class_dspinit(c);
Your signal object needs a method that is bound to the symbol "dsp" – we'll detail what this method does below, but
the following line needs to be added while initializing the class:
The new instance routine must call dsp_setup(), passing a pointer to the newly allocated object pointer plus a
number of signal inlets the object will have. If the object has no signal inlets, you may pass 0. The simplemsp∼
object (as an example) has a single signal inlet:
dsp_setup() will make the signal inlets (as proxies) so you need not make them yourself.
If your object will have audio signal outputs, they need to be created in the new instance routine with outlet_new().
However, you will never access them directly, so you don't need to store pointers to them as you do with regular
outlets. Here is an example of creating two signal outlets:
The dsp64 method specifies the signal processing function your object defines along with its arguments. Your
object's dsp64 method will be called when the MSP signal compiler is building a sequence of operations (known as
the DSP Chain) that will be performed on each set of audio samples. The operation sequence consists of a pointers
to functions (called perform routines) followed by arguments to those functions.
The dsp64 method is declared as follows:
void mydspobject_dsp64(t_mydspobject *x, t_object *dsp64, short *count, double samplerate, long
maxvectorsize, long flags);
To add an entry to the DSP chain, your dsp64 method uses the "dsp_add64" method of the DSP chain. The dsp←-
_add64 method is passed an a pointer to your object, a pointer to a perform64 routine that calculates the samples,
an optional flag which may alter behavior, and a generic pointer which will be passed on to your perform routine.
The perform routine is not a "method" in the traditional sense. It will be called within the callback of an audio driver,
which, unless the user is employing the Non-Real Time audio driver, will typically be in a high-priority thread. Thread
protection inside the perform routine is minimal. You can use a clock, but you cannot use qelems or outlets.
Here is a perform routine that adds a constant of 1 to any incoming signal:
void mydspobject_perform64(t_mydspobject *x, t_object *dsp64, double **ins, long numins, double **
outs, long numouts, long sampleframes, long flags, void *userparam)
{
double *in = ins[0]; // first inlet
double *out = outs[0]; // first outlet
int n = sampleframes; // vector size
t_double value;
The free function for the class must either be dsp_free() or it must be written to call dsp_free() as shown in the
example below:
Here are some techniques for implementing additional features found in most signal objects.
To implement unit generators such as filters and ramp generators, you need to save internal state between calls to
your object's perform routine. Here is a very simple low-pass filter (it just averages successive samples) that saves
the value of the last sample in a vector to be averaged with the first sample of the next vector. First we add a field
to our data structure to hold the value:
Then, in our dsp method, we pass a pointer to the object as one of the DSP chain arguments. The dsp method also
initializes the value of the internal state, to avoid any noise when the audio starts.
void myfilter_dsp64(t_myfilter *x, t_object *dsp64, short *count, double samplerate, long
maxvectorsize, long flags)
{
object_method(dsp64, gensym("dsp_add64"), x, myfilter_perform64, 0, NULL);
x->f_sample = 0.0;
}
Here is the perform routine, which obtains the internal state before entering the processing loop, then stores the
most recent value after the loop is finished.
void myfilter_perform64(t_myfilter *x, t_object *dsp64, double **ins, long numins, double **outs,
long numouts, long sampleframes, long flags, void *userparam)
{
double *in = ins[0]; // first inlet
double *out = outs[0]; // first outlet
int n = sampleframes; // vector size
double samp = x->f_sample; // read from internal state
double val;
while (n--) {
val = *in++;
*out++ = (val + samp) * 0.5;
samp = val;
}
x->f_sample = samp; // save to internal state
}
30 Advanced Signal Object Topics
The third argument to the dsp method is an array of numbers that enumerate the number of objects connected to
each of your objects inputs and outputs. More advanced dsp methods can use this information for optimization
purposes. For example, if you find that your object has no inputs or outputs, you could avoid calling 'dsp_add64'
altogether. The MSP signal operator objects (such as +∼ and ∗∼) use this to implement a basic polymorphism:
they look at the connections count to determine whether the perform routine should use scalar or signal inputs. For
example, if the right input has no connected signals, the user can add a scalar value sent to the right inlet.
To implement this behavior, you have a few different options. The first option is to write two different perform
methods, one which handles the two-signal case, and one which handles the scalar case. The dsp method looks at
the count array and passes a different function to dsp_add64.
The second option is to store the value of the count array for a particular signal in your object's struct. Then the
perform method can make the decision whether to use the signal value or a scalar value that has been stored by
the object. In this case, many objects use a single sample value from the signal as a substitute for the scalar. Using
the first sample (i.e., the value at index 0) is a technique that works for any vector size, since vector sizes could be
as small as a single sample. Here is an example of this technique for an object that has two inputs and one output.
The connection count for the right input signal is stored in a struct member named m_count:
x->m_count = count[1];
object_method(dsp64, gensym("dsp_add64"), x, mydspobject_perform64, 0, NULL);
Here is a perform routine that uses the connection count information as passed in the format shown above:
void mydspobject_perform64(t_mydspobject *x, t_object *dsp64, double **ins, long numins, double **
outs, long numouts, long sampleframes, long flags, void *userparam)
{
t_mydspobject *x = (t_mydspobject *)w[1];
int connected = x->m_count;
double *in = ins[0];
double *in2 = ins[1];
double *out = outs[0];
int n = sampleframes;
double in2value;
// do calculation here
// ...
}
To access a named buffer∼ object for either reading or writing sample values, refer to the Buffers reference.
Max objects, such as the one you write, are C data structures in which methods are dynamically bound to functions.
Your object's methods are called by Max, but your object can also call methods itself. When you call a method, it is
essential to know whether the method you are calling is typed or not.
Calling a typed method requires passing arguments as an array of atoms. Calling an untyped method requires that
you know the exact arguments of the C function implementing the method. In both cases, you supply a symbol that
names the method.
In the typed method case, Max will take the array of atoms and pass the arguments to the object according to the
method's argument type specifier list. For example, if the method is declared to have an argument type specifier
list of A_LONG, 0, the first atom in the array you pass will be converted to an int and passed to the function on
the stack. If there are no arguments supplied, invoking a typed method that has A_LONG, 0 as an argument type
specifier will fail. To make typed method calls, use object_method_typed() or typedmess().
In the untyped method case, Max merely does a lookup of the symbol in the object, and, if a matching function is
found, calls the function with the arguments you pass.
Certain methods you write for your object, such as the assist method for describing your object and the DSP method
in audio objects, are declared as untyped using the A_CANT argument type specifier. This means that Max will not
typecheck the arguments you pass to these methods, but, most importantly, a user cannot hook up a message box
to your object and send it a message to invoke an untyped method. (Try this for yourself – send the assist message
to a standard Max object.)
When you use an outlet, you're effectively making a typed method call on any objects connected to the outlet.
10.1 Attributes
Attributes are descriptions of data in your object. The standardization of these descriptions permits Max to provide
a rich interface to object data, including the pattr system, inspectors, the quick reference menu, @ arguments, etc.
It is essential that you have some understanding of attributes if you are going to write a UI object. But non-UI objects
can make use of attributes as well. The discussion below is not specific to UI objects. It does however, use the
recently introduced system of macros in ext_obex_util.h (included in ext_obex.h) for defining attributes, as well as
describing them using attributes of attributes (attr attrs). You can read more detailed descriptions of the underlying
attribute definition mechanisms on a per-function basis in the Attributes reference.
While attributes can be defined for a specific instance of an object, it's much more common to define an attribute for
a class. In such a case, each instance of the class will have the attribute description, but the value will be instance
specific. The discussion here focuses only on class attributes.
When an attribute is declared and is made user-settable, a user can send a message to your object consisting of the
32 Sending Messages, Calling Methods
attribute name and arguments that represent the new value of the attribute. For example, if you declare an attribute
called trackcount, the message trackcount 20 will set it to 20. You don't need to do anything special to obtain this
behavior. In addition, user-settable attributes will appear when the user opens the inspector on your object.
If you define your attribute as an offset attribute, you describe its location (and size) within your object's C data
structure. Max can then read and write the data directly. You can also define custom getter and setter routines
if the attribute's value is more complex than simply a stored number. As a theoretical example, you could have
an object with an attribute representing the Earth's population. If this value was not able to be stored inside your
object, your custom getter routine could initiate a global census before returning the result. A custom setter for the
earth's population might do something nasty if the value was set to zero. If you are not a misanthrope, you can take
advantage of the ability to set such an attribute to be read-only.
Attributes are defined when you are defining methods in your initialization routine. You can define your attributes
before your methods if you like, but by convention, they are typically defined after the methods. For each definition,
you'll specify the name, size, and offset of the corresponding member in your object's data structure that will hold
the data. For example, let's say we have an object defined as follows:
We want to create attributes for m_targetaddress, m_shipname, and m_compatmode. For each data type (and a
few others), there are macros in ext_obex_util.h that will save a fair amount of typing. So, for example, we can
define an attribute for m_targetaddress that uses CLASS_ATTR_LONG. Here are attribute definitions for all of the
members of our data structure above.
In some cases, it is not enough to have Max read and write data in your object directly. In some cases (as in the
world population example above) you may have data you need to calculate before it can be returned as a value.
In other cases, you may need to do something to update other object state when an attribute value changes. To
handle these challenges, you can define custom attribute getter and setter routines. The getter will be called when
the value of your attribute is accessed. The setter will be called when someone changes the value of your attribute.
As an example, suppose we have an object that holds onto an array of numbers, and we want to create an attribute
for the size of the array. Since we'll want to resize the array when the attribute value changes, we will define a
custom setter for our attribute. The default getter is adequate if we store the array size in our object, but since we
want to illustrate how to write an attribute getter, we'll write the code so that the array size is computed from the size
of the memory pointer we allocate. First, here is our object's data structure:
We also have prototypes for our custom attribute setter and getter:
Here is how we define our attribute using CLASS_ATTR_ACCESSORS macro to define the custom setter and
getter. Because we aren't really using an "offset" due to the custom setter and getter, we can pass any data
structure member as a dummy. (Only the default attribute getter and setter will use this offset, and they are out of
the picture.)
Now, here is an implementation of the custom setter for the array size. For the setter, we use the handy Max API
function sysmem_resizeptr so we can effectively "resize" our array and copy the data into it in one step. The setter
uses atoms, so we have to obtain the value from the first item in the argv array.
if (x->m_data)
x->m_data = (long *)sysmem_resizeptr((char *)x->m_data, size * sizeof(long));
else // first time alloc
x->m_data = (long *)sysmem_newptr(size * sizeof(long));
return 0;
}
The getter also uses atoms for access, but we are returning a pointer to an array of atoms. The caller of the getter
has the option to pre-allocate the memory (passing in the length in argc and the pointer to the memory in argv) or
pass in 0 for argc and set the contents of argv to NULL and have the getter allocate the memory. The easiest way
to handle this case is to call the utility function atom_alloc, which will figure out what was passed in and allocate
memory for a returned atom if necessary.
if (x->m_data)
size = sysmem_ptrsize((char *)x->m_data) / sizeof(long); // calculate array size
based on ptr size
atom_setlong(*argv, size);
return 0;
}
As an alternative to writing a custom setter, you can take advantage of the fact that objects receive a "notify"
message whenever one of their attributes is changed. The prototype for a notify method is as follows:
Add the following to your class initialization so your notification method will be called:
The notify method can handle a variety of notifications (more documentation on this is coming soon!), but the one
we're interested in is "attr_modified" – the notification type is passed to the notify method in the msg argument.
Here is an example of a notify method that prints out the name of the attribute that has been modified. You could
take any action instead. To obtain the name, we interpret the data argument to the notify method as an attribute
object. As an attribute is a regular Max object, we can use object_method to send it a message. In the case we are
sending the message getname to the attribute object to obtain its name.
Anatomy of a UI Object
Max user interface objects are more complex than normal non-user-interface objects.
If you have nothing in particular to display, or do not need to create a unique interface for user interaction or editing,
it would be better to avoid writing one. However, if you want the details, we have them for you!
In order to create a user interface object, you'll need to be familiar with Attributes, as they are used extensively. If you
examine a toggle object in the inspector in Max, you will see a few attributes that have been defined as belonging
to the toggle class, namely:
• Background Color
• Check Color
• Border Color
We'll show how attributes are defined and described so that the inspector can edit them properly.
In addition to attributes, user interface objects draw in a box and respond to user events such as mouse clicks and
keyboard events. We'll show how to implement drawing an object's paint method as well user interaction in the
mousedown, mousedrag, and mouseup methods.
This chapter only covers basic drawing of lines and filled rectangles. But you can take advantage of a complete
graphics API called jgraphics, intended to be used in a user interface object's paint method. We discuss JGraphics
in more detail in a separate chapter. You may also find the jgraphics.h header file descriptions of the set of functions
helpful.
The SDK examples contain two user interface projects – the one we'll discuss in this chapter is called uisimp and is
a version of the toggle object with a more complicated check box and user interaction. The second project is called
pictmeter∼, a more advanced object that uses audio as well as image files.
The uisimp object differs from the toggle object in a couple of ways:
• it tracks the mouse even when it isn't down and "looks excited" when the mouse passes over it
• it tracks the mouse while the user is holding the mouse down to show a sort of "depressed" appearance when
turning the toggle on
• the new toggle state value is sent out when the mouse is released rather than when the mouse is down. In
addition, the uisimp object tracks the mouse and does not change the state if the mouse is released outside
of the object's box
UI objects require that you include two header files, jpatcher_api.h and jgraphics.h:
#include "jpatcher_api.h"
#include "jgraphics.h"
The header file jpatcher_api.h includes data structures and accessor functions required by UI objects. The header
file jgraphics.h includes data structures and functions for drawing.
The first part of a UI object is a t_jbox, not a t_object. You should generally avoid direct access to fields of a t_jbox,
particularly when changing values, and use the accessor functions defined in jpatcher_api.h. For example, if you
change the rectangle of a box without using the accessor function jbox_set_rect(), the patcher will not be notified
properly and the screen will not update.
Following the t_jbox, you can add other fields for storing the internal state of your object. In particular, if you are
going to be drawing something using color, you will want to create attributes that reference fields holding colors in
your object. We'll show you how to do this below. Here is the declaration of the t_uisimp data structure.
The t_jrgba structure defines a color with four doubles for red, green, blue, and alpha. Each component ranges from
0-1. When red, green, and blue are all 0, the color is black; when red, green, and blue are 1, the color is white. By
defining color attributes using t_jrgba structures, you will permit the user to use the standard color picker from the
inspector to configure colors for your object.
The structure members u_mouseover and u_mousedowninside are used to signal the code that paints the toggle
from the code that handles mouse interaction. We'll discuss this more in the "interaction strategy" section below.
Once you've declared your object's struct, you'll write your initialization ( ext_main() ) routine to set up the class,
declaring methods and attributes used by UI objects.
The first addition to the class initialization of a normal Max object you need to make is a call to jbox_initclass(). This
adds standard methods and attributes common to all UI objects. Here's how you should to it:
c->c_flags |= CLASS_FLAG_NEWDICTIONARY;
jbox_initclass(c, JBOX_FIXWIDTH | JBOX_COLOR);
The line c->c_flags |= CLASS_FLAG_NEWDICTIONARY is required, but the flags passed to jbox_initclass – JB←-
OX_FIXWIDTH and JBOX_COLOR – are optional. JBOX_FIXWIDTH means that when your object is selected in a
patcher, the Fix Width menu item will be enabled to resize your object to its class's default dimensions. We'll specify
the default dimensions in a moment. JBOX_COLOR means that your object will be given a color attribute so that
it can be edited with the color picked shown by the Color... menu item. This is a way to edit a "basic" color of your
object without opening the inspector. If neither of these behaviors apply to your object, feel free to pass 0 for the
flags argument to jbox_initclass().
Next we need to bind a few standard methods. The only required method for UI objects is paint, which draws the
your object's content when its box is visible and needs to be redrawn.
We'll discuss the paint method in detail below. It makes use of the JGraphics API, which is described in more detail
in its own chapter.
Our uisimp toggle will respond to mouse gestures, so we will define a set of mouse handling methods.
mousedown is sent to your object when the user clicks on your object – in other words, when the mouse is moved
over the object and the primary mouse button is depressed. mousedrag is sent after an initial mousedown when the
mouse moves and the button is still held down from the click. mouseup is sent when the mouse button is released
after a mousedown is sent. mouseenter is sent when the mouse button is not down and the mouse moves into
your object's box. mousemove is sent – after a mouseenter – when the mouse button is not down but the mouse
position changes inside your object's box. mouseleave is sent when the mouse button is not down and the mouse
position moves from being over your object's box to being outside of it. mousewheel is sent when information about
the scrollwheel on the mouse (or scrolling from another source such as a trackpad) is transmitted while the cursor
is hovering over your object.
You are not obligated to respond to any of these messages. You could, for example, only respond to mousedown
and ignore the other messages.
It might be helpful to summarize mouse messages in the following "rules" (although normally it's not necessary to
think about them explicitly):
• mousedown will always be followed by mouseup, but not necessarily by mousedrag if the button press is rapid
and there is no movement while the mouse button is pressed.
• You cannot count on any particular relationship between the mousedown / mousedrag / mouseup sequence
and the mouseenter / mousemove / mouseleave sequence.
After the declaration of standard methods, your object will define its own attributes. By using what we call "attribute
attributes" you can further describe attributes so that they can be appropriately displayed and edited in the inspector
as well as saved in a patcher (or not). You can also set default values for attributes that are automatically copied to
your object when it is instantiated, and mark an attribute so that your object is redrawn when its value changes.
As a convenience, we've defined a series of macros in ext_obex_util.h (which is included when your object includes
ext_obex.h) that reduce the amount of typing needed to define attributes and attribute attributes.
Most UI object attributes are offset attributes; that is, they reference a location in your object's data structure by
offset and size. As an example, uisimp has a char offset attribute called trackmouse that specifies whether the
object will change the object's appearance when the mouse moves over it. Here's how this is defined:
The first line, CLASS_ATTR_CHAR, defines a char-sized offset attribute. If you look at the declaration of t_←-
uisimp, you can see that the u_trackmouse field is declared to be a char. The CLASS_ATTR_CHAR macro take
five arguments.
• The first argument is the class for which the attribute is being declared.
• The second argument is the name of the attribute. You can use send a message to your object with this name
and a value and set the attribute.
• The third argument is a collection of attribute flags. For the attributes (and attribute attributes) we'll be defining
in the uisimp object, the flags will be 0, but you can use them to make attributes read-only with ATTR_SET←-
_OPAQUE_USER.
• The fourth argument is the name of your object's structure containing the field you want to use for the attribute
• The fifth argument is the field name you want to use for the attribute
The fourth and fifth arguments are used to calculate the offset of the beginning of the field from the beginning of the
structure. This allows the attribute to read and write the memory occupied by the field directly.
The second line, CLASS_ATTR_STYLE_LABEL, defines some attribute attributes for the trackmouse attribute. T←-
His macro takes five arguments as well:
• The first argument is the class for which the attribute attributes are being declared.
• The second argument is the name of the attribute, which should have already been defined by a CLASS_←-
ATTR_CHAR or similar attribute declaration
• The third argument is usually 0 – it is an attribute flags argument for the attribute attributes
• The fourth argument is the style of the attribute. "onoff" is used here for a setting in your object that will be a
toggle. By using the onoff style the trackmouse attribute will appear with a checkbox in the inspector window.
Effectively, this macro defines an attribute called "style" that is attached to the "trackmouse" attribute and set
its value to the symbol "onoff" in one step.
• The fifth argument is a string used as a descriptive label for the attribute that appears in the inspector and
other places in the Max user interface. If you don't supply a label, the attribute name will be shown. The string
is used as the value of a newly created "label" attribute attribute.
The category attribute attribute is used to organize your object's attributes in the inspector window. For the track-
mouse attribute, we use the "Behavior" category, and for the color attributes discussed below, we use "Color" – look
at the inspector category tabs for a few UI objects that come with Max for suggested standard category names.
You're free to create your own.
To define a category for a single attribute, you can use the CLASS_ATTR_CATEGORY macro:
To define a category for a series of attributes, you can use CLASS_STICKY_ATTR, which applies the current value
of a specified attribute attribute to any attributes subsequently defined, until a CLASS_STICKY_ATTR_CLEAR is
set for an attribute attribute name. CLASS_STICKY_ATTR is used in uisimp to apply the "Color" category to a set
of three color attributes.
Color attributes are defined using CLASS_ATTR_RGBA. The uisimp object defines four color attributes. Here is the
first, called bgcolor:
The difference between CLASS_ATTR_RGBA and CLASS_ATTR_CHAR for defining an attribute is that CLASS←-
_ATTR_RGBA expects the name of a structure member declared of type t_jrgba rather than type char. When set,
the attribute will assign values to the four doubles that make up the components of the color.
The next line uses the CLASS_ATTR_DEFAULTNAME_SAVE_PAINT macro. This sets three things about the
bgcolor attribute. First it says that the color attribute bgcolor can be assigned a default value via the object de-
faults window. So, if you don't like the standard white defined by the object, you can assign you own color for the
background color of all newly created uisimp objects. The four values 1 1 1 1 supplied as the last argument to C←-
LASS_ATTR_DEFAULTNAME_SAVE_PAINT specify the "standard" default value that will be used for the bgcolor
attribute in the absence of any overrides from the user.
The SAVE aspect of this macro specifies that this attribute's values should be saved with the object in a patcher. A
patcher file saves an object's class, location and connections, but it can also save the object's appearance or any
other attribute value you specify, by using the "save" attribute attribute.
The PAINT aspect of this macro provides the ability to have your object redrawn whenever this attribute (bgcolor)
changes. However, to implement auto-repainting on attribute changes, you'll need to add the following code when
initializing your class:
The function jbox_notify() will determine whether an attribute that has caused a change notification to be sent has
its paint attribute attribute set, and if so, will call jbox_redraw(). If you write your own notify method because you
want to respond to changes in attributes or other environment changes, you ∗must∗ call jbox_notify() inside of it.
At the beginning of our initialization routine, we passed JBOX_COLOR as a flag to jbox_initclass(). This adds an
attribute to our object called color, which uses storage provided in the t_jbox to keep track of a color for us. The
color attribute is a standard name for the "most basic" color your object uses, and if you define it, the Color menu
item in the Object menu will be enabled when your object is selected, permitting the user to change the color without
opening the inspector.
If you use JBOX_COLOR, you don't need to define the color attribute using CLASS_ATTR_RGBA – jbox_initclass()
will do it for you. However, the color attribute comes unadorned, so you are free to enhance it with attribute attributes.
Here's what uisimp does:
Another attribute defined for your object by jbox_initclass() is called patching_rect. It holds the dimensions of your
object's box. If you want to set a standard size for new instances of your object, you can give the patching_rect a
set of default values. Use 0 0 for the first two values (x and y position) and use the next two values to define the
width and height. We want a small square to be the default size for uisimp, so we use CLASS_ATTR_DEFAULT to
assign a default value to the patching_rect attribute as follows:
The UI object new instance routine is more complicated than that of a normal Max object. Each UI object is passed
a t_dictionary (a hierarchically structured collection of data accessed by symbolic names) containing the information
needed to instantiate an instance. For UI objects, data elements in the dictionary correspond to attribute values.
For example, if your object saved an attribute called "bgcolor" you will be able to access the saved value in your new
instance routine from the dictionary using the same name bgcolor.
If the instance is being created from the object palette or by the typing the name of your object into an object box,
the dictionary will be filled in with default values. If the object is being created by reading a patcher file, the dictionary
will be filled in with the saved attributes stored in the file. In most cases, you don't need to work with the dictionary
directly, unless you've added proprietary non-attribute information to your object's dictionary that you want to look
for and extract. However, you do need to pass the dictionary to some standard routines, and initialize everything in
the right order.
Let's take a look at the pattern you should follow for your object's new instance routine.
First, the new instance routine is declared as follows:
We will get the dictionary that defines the object out of the arguments passed in argc, argv. (The symbol argument
s is the name of the object.) If obtaining the dictionary fails, we should return NULL to indicate we didn't make an
instance.
if (!(d = object_dictionaryarg(argc,argv)))
return NULL;
x = (t_uisimp *)object_alloc(s_uisimp_class);
Then we need to initialize the options for our box. Our object uses the options that are not commented out.
boxflags = 0
| JBOX_DRAWFIRSTIN
| JBOX_NODRAWBOX
| JBOX_DRAWINLAST
| JBOX_TRANSPARENT
// | JBOX_NOGROW
| JBOX_GROWY
// | JBOX_GROWBOTH
// | JBOX_HILITE
// | JBOX_BACKGROUND
| JBOX_DRAWBACKGROUND
// | JBOX_NOFLOATINSPECTOR
// | JBOX_MOUSEDRAGDELTA
// | JBOX_TEXTFIELD
;
Once jbox_new() has been called, you then assign the b_firstin pointer of your t_jbox header to point to your object.
Essentially this assigns the object that will receive messages from objects connected to your leftmost inlet (as well
as other inlets via inlets or proxies you create). This step is easily forgotten and will cause most things not to work
until you remember it. jbox_new() will obtain the attributes common to all boxes such as the patching_rect, and
assign them to your object for you.
Next, you are free to initialize any members of your object's data structure, as well as declare inlets. These steps
are the same for UI objects as for non-UI objects.
Once your object is in a safe initialized state, call attr_dictionary_process() if you've defined any attributes. This will
find the attributes in the dictionary your object received, then set them to the values stored in the dictionary. There
is no way to guarantee the order in which the attributes will be set. If this a problem, you can obtain the attribute
values "by hand" and assign them to your object.
Note that you do not need to call attr_dictionary_process() if you have not defined any attributes. jbox_new() will
take care of setting all attributes common to all UI objects.
attr_dictionary_process(x,d);
As the last thing to do before returning your newly created UI object, and more specifically after you've initialized
everything to finalize the appearance of your object, call jbox_ready(). jbox_ready() will paint your object, calculate
the positions of the inlets and outlets, and perform other initialization tasks to ensure that your box is a proper
member of the visible patcher.
If your object does not appear when you instantiate it, you should check whether you do not have a jbox_ready()
call.
jbox_ready((t_jbox *)x);
Finally, as with any instance creation routine, the newly created object will be returned.
return x;
Drawing anything to the screen must be limited to your paint method (this was not the case with the previous UI
object API in Max). If you want to redraw something, you need to call jbox_redraw() to cause the screen to be
redrawn. This is necessary because your object is part of a compositing user interface that must be managed by
the patcher as a whole to avoid screen artifacts. The jbox_redraw() routine calculates the area of the screen that
needs to be redrawn, then informs the Mac or Windows "window manager" to mark this area as invalid. At some
later point in time, the OS will invoke the patcher's paint routine, which will dispatch to all of the boxes inside the
invalid area according to the current Z-order of all the boxes. Boxes that are in the background are drawn first,
so that any transparent or semi-transparent boxes can be drawn on top of them. In addition, unless you specify
otherwise, the last drawn image of a box is cached in a buffer, so that your paint method will only be called when
you explicitly invalidate your object's content with jbox_redraw(). In other words, you can't count on "global patcher
drawing" to invoke your paint method.
The basic strategy you'll want to use in thinking about redrawing is that you will set internal state in other methods,
then call jbox_redraw(). The paint method will read the internal state and adjust its drawing appropriately. You'll see
this strategy used in the uisimp object as it tracks the mouse.
Your object's paint method uses the jgraphics API to draw. The header file, jgraphics.h, provides a description of
each of the routines in the API. Here we will only discuss general principles and features of drawing with uisimp's
relatively simple paint method. There is also a jgraphics example UI object that contains a number of functions
showing how various drawing tasks can be performed.
Drawing in Max is resolution-independent. The "size" of your object's rectangle is always the pixel size when the
patcher is scaled to 100% regardless of the zoom level, and any magnification or size reduction to the actual screen
is automatically handled by matrix transforms. Another thing that is handled automatically for you is drawing to
multiple views. If a patcher is invisible (i.e., a subpatcher that has not been double-clicked), it does not have any
views. But if it is visible, a patcher can have many patcherviews. If your UI object box is in a patcher with multiple
views open, your paint method will be called once for each view, and will be passed different a patcherview object
each time. For most objects, this will pose few problems, but for objects to work properly when there are anywhere
from zero to ten views open, they cannot change their internal state in the paint method, they can only read it. As
an example, if your object had a boolean "painted" field in its structure that would be set when the paint method
had finished, it would not work properly in the cases where the box was invisible or where it was shown in multiple
patcher views, because it would either be set zero or more than once.
The first step for any paint method is to obtain the t_jgraphics object from the patcherview object passed to the paint
method. The patcherview is an opaque t_object that you will use to access information about your box's rectangle
and its graphics context. A patcherview is not the same thing as a patcher; as mentioned above, there could be
more than one patcherview for a patcher if it has multiple views open.
t_jgraphics *g = (t_jgraphics*)
patcherview_get_jgraphics(patcherview); // obtain graphics context
After obtaining the t_jgraphics object, the next thing that you'll need to do is determine the rectangle of your box. A
view of a patcher may be in either patching or presentation mode. Since each mode can have its own rectangle, it
is necessary to use the patcherview to obtain the rectangle for your object.
The t_rect structure specifies a rectangle using the x and y coordinates of the top left corner, along with the width
and height. However, the coordinates of the t_jgraphics you'll be using to draw into always begin at 0 for the top left
corner, so you'll only care about the width and height, at least for drawing.
The first thing we'll draw is just an outline of our box using the value of the outline color attribute. First we'll set the
color we want to use, then make a rectangular path, then finally we'll stroke the path we've made.
With calls such as jgraphics_rectangle(), the rectangular shape is added to the existing path. The initial path is
empty, and after calling jgraphics_stroke() or jgraphics_fill(), the path is again cleared. (If you want to retain the
path, you can use the jgraphics_stroke_preserve() and jgraphics_fill_preserve variants().)
jgraphics_set_source_jrgba(g, &x->u_outline);
jgraphics_set_line_width(g, 1.);
jgraphics_rectangle(g, 0., 0., rect.width, rect.height);
jgraphics_stroke(g);
You do not need to destroy the path before your paint method is finished. This will be done for you, but the fact
that the path does not survive after the paint method is finished means you can't make a path and then store it
without copying it first. Such a strategy is not recommended in any case, since your object's rectangle might change
unpredictably from one paint method invocation to the next, which will likely cause your path to be the wrong shape
or size.
The next feature of the paint method is to draw an inner outline if the mouse is moved over the box. Detecting
the mouse's presence over the box happens in the mouseenter / mouseleave methods described below – but
essentially, we know that the mouse is over our object if the u_mouseover has been set by these mouse tracking
methods.
To draw a rectangle that is inset by one pixel from the box rectangle, we use the rectangle starting at 1, 1 with a
width of the box width - 2 and a height of the box height - 2.
Some similar code provides the ability to show the highlight color when the user is about to check (turn on) the
toggle:
Finally, we paint a square in the middle of the object if the toggle state is non-zero to indicate that the box has been
checked. Here we are filling a path instead of stroking it. Note also that we use the call jbox_get_color() to get the
"standard" color of our object that is stored inside the t_jbox. As we've specified by using the JBOX_COLOR flag for
jbox_initclass() in our initialization routine, the color obtained by jbox_get_color() for the "check" (really just a square
of solid color) is the one the user can change with the Color... item in the Object menu.
if (x->u_state) {
t_jrgba col;
Clearly, a quick perusal of the jgraphics.h header file will demonstrate that there is much more to drawing than we've
discussed here. But the main purpose of the uisimp paint method is to show how to implement "dynamic" graphics
that follow the mouse. Now we'll see the mouse tracking side of the story.
When the mouse is clicked, dragged, released, or moved inside its box, your object will receive messages. In the
uisimp example we've defined methods for most of the mouse gesture messages available, and we've implemented
them to change internal state in the object, then call jbox_redraw() to repaint the object to reflect the new state. This
strategy produces a "dynamic" appearance of a gadget users associate with a typical graphical interface – in this
case a toggle checkbox.
All mouse gesture methods are declared in the same way:
Let's first look at the most commonly implemented mouse gesture handler, the mousedown method that responds
to an initial click on the object. As you can see, it is very simple; it merely sets u_mousedowninside to true, then
calls jbox_redraw(), causing the box to be repainted. We've defined this toggle not to change the actual state until
the mouse is released (unlike the standard Max toggle object), but we do want to give the user some feedback on
the initial mouse down that something is going to happen. If you look back at the paint method, you can see that
u_mousedowninside is used to change the way the object is painted to give it a "pending state change" appearance
that will be finalized when the mouse is released inside the box.
If we test the mouse position to ensure that it is inside the box when it is released, we provide the opportunity for
the user to cancel the act of toggling the state of the object by moving the cursor outside of the box before releasing
the button. To provide feedback to the user that this is going to happen, we've implemented a mousedrag method
that performs this test and redraws the object if the "mouse inside" condition has changed from its previous state.
The mousedrag message will be sent to your object as long as the mouse button is still down after an initial click
and the cursor has moved, even if the cursor moves outside of the boundaries of your object's box.
Note that, as with the paint method, we use the patcherview to get the current box rectangle. We can then test the
point we are given to see if it is inside or outside the box.
// redraw if changed
if (pt.x >= 0 && pt.x <= rect.width && pt.y >= 0 && pt.y <= rect.
height) {
if (!x->u_mousedowninside) {
x->u_mousedowninside = true;
jbox_redraw((t_jbox *)x);
}
} else {
if (x->u_mousedowninside) {
x->u_mousedowninside = false;
jbox_redraw((t_jbox *)x);
}
}
}
Our mouseup method uses the last value of u_mousedowninside as the determining factor for whether to toggle the
object's internal state. If u_mousedowninside is false, no state change happens. But if it is true, the state changes
and the new state value is sent out the object's outlet (inside uisimp_bang()).
if (x->u_mousedowninside) {
x->u_state = !x->u_state;
uisimp_bang(x);
x->u_mousedowninside = false;
jbox_redraw((t_jbox *)x);
}
Finally, we've implemented mouseenter, mousemove, and mouseleave methods to provide another level of "mouse
over" style highlighting for the object. Rather than changing u_mousedowninside, a u_mouseover field is set when
the mouseenter message is received, and cleared when the mouseleave method is received. And again, after this
variable is manipulated, we repaint the box with jbox_redraw().
If your object has created any clocks or otherwise allocated memory that should be freed when the object goes
away, you should handle this in the free routine. But, most importantly, you must call the function jbox_free(). If
your UI object doesn't need to do anything special in its free routine, you can pass jbox_free() as the free routine
argument to class_new() in your initialization routine. We chose not to do this, since having an actual function
permits easy modification should some memory need to be freed at some point in the future evolution of the object.
File Handling
The next requirement for any method that reads files is that it must defer execution to the low-priority thread, as
shown in the following implementation, where the filename argument is passed as the symbol argument to defer.
The myobject_doread() function compares the filename argument with the empty symbol – if the argument was not
supplied, the open_dialog() is used, otherwise, we call locatefile_extended() to search for the file. This object looks
for text files, so we use a four-character code 'TEXT' as our file type to either open or locate. File type codes define
a set of acceptable extensions. The file max-fileformats.txt permits contains standard definitions, and you can add
your own by creating a similar text file and placing it in the init folder inside the Cycling '74 folder.
// we have a file
myobject_openfile(x, filename, path);
}
To open and read files, you can use the cross-platform sysfile API. Files can be opened using a filename plus path
identifier. If successfully opened, the file can be accessed using a t_filehandle. Note that "files" inside collective
files are treated identically to regular files, with the exception that they are read-only.
First, we'll implement reading the text file whose name and path identifier are passed to myobject_openfile() using
a high-level routine sysfile_readtextfile() specifically for reading text files that handles text encoding conversion for
you. If you are reading text files, using this routine is strongly recommended since converting text encodings is
unpleasant to say the least.
In most situations, you will pass 0 for the final two arguments to sysfile_readtextfile(). The third argument specifies
a maximum length to read, but if the value is 0, the entire file is read in, regardless of its size. The final argument
is a set of flags specifying options for reading in the text. The options concern the conversion of line breaks, text
encoding, and the ability to add a null character to the end of the data returned.
Line breaks are converted on the basis of any line break flags. When reading text files, Max converts line breaks to
"native" format, which is
\r\n
on Windows and
\n
on the Mac; this is the behavior you get if you either pass no line break flags or use TEXT_LB_NATIVE. Other
options include TEXT_LB_MAC, TEXT_LB_UNIX, or TEXT_LB_PC.
By default, text files are converted from their source encoding to UTF-8. If you do not want this conversion to occur,
you can use the TEXT_ENCODING_USE_FILE flag. This puts the burden on determining the encoding on you,
which is probably not what you want. For example, the source text file might use UTF-16 encoding, which requires
very different parsing than an 8-bit encoding.
Finally, you can have the memory returned from sysfile_readtextfile() terminated with a NULL character if you use
the TEXT_NULL_TERMINATE flag.
To read data files where you do not want to do text encoding conversion or worry about line breaks, you can use
the same technique shown above for text files, but write the myobject_openfile function using sysfile_read() instead
of sysfile_readtextfile(). This example shows how to read an entire file into a single block of memory.
sysfile_close(fh);
Some Max objects respond to the write message to save data into a file. If there is no argument present after the
word write, a save file dialog is shown and the user specifies a file name and location. If an argument is present, it
can either specify a complete path name or a filename. In the filename case, the file is written to the current "default"
directory, which is the location where a patcher was last opened. In the full pathname case, the file is written to the
location specified by the pathname.
Here's how to implement this behavior. We'll show how to handle the message arguments, then provide text and
data file writing examples.
Message and argument handling is very similar to the way we implemented the read message above, including the
use of deferred execution.
The myobject_dowrite() function compares the filename argument with the empty symbol – if the argument was not
supplied, saveasdialog_extended() is used to obtain the user's choice for filename and location. Our first example
looks for text files, so we use a four-character code 'TEXT' as our file type for saving. File type codes define a set
of acceptable extensions. The file max-fileformats.txt permits contains standard definitions, and you can add your
own by creating a similar text file and placing it in the init folder inside the Cycling '74 folder.
Here is the text file variant of myobject_writefile() using the high-level sysfile_writetextfile() routine. We just write a
sentence as our "text file" but your object will presumably have some text data stored internally that it will write. The
buffer passed to sysfile_writetextfile() must be NULL-terminated, and will be assumed to be UTF-8 encoded.
Note that path_createsysfile() can accept a full path in the filename argument, in which case, the path argument is
ignored. This means your object's write message can either accept a filename or full pathname and you needn't do
anything special to accept both.
Here is a data file variant of myobject_writefile(). It writes a small buffer of ten numbers to a file.
count = 10;
Your object can use scripting capabilities of the patcher to learn things about its context, such as the patcher's name,
hierarchy, or the peer objects to your object in its patcher.
You can also modify a patcher, although any actions your object takes are not undoable and may not work in the
runtime version.
To obtain the patcher object containing your object, you can use the obex hash table. The obex (for "object exten-
sions") is, more generally, a way to store and recall data in your object. In this case, however, we are just using it in
a read-only fashion.
Note that unlike the technique discussed in previous versions of the SDK, using the obex to find the patcher works
at any time, not just in the new instance routine.
The patcher is an opaque Max object. To access data in a patcher, you'll use attributes and methods.
To obtain the name of the patcher and its file path (if any), obtain attribute values as shown below.
To determine the patcher hierarchy above the patcher containing your object, you can use jpatcher_get_←-
parentpatcher(). A patcher whose parent is NULL is a top-level patcher. Here is a loop that prints the name of
each parent patcher as you ascend the hierarchy.
To obtain the first object in a patcher, you can use jpatcher_get_firstobject(). Subsequent objects are available with
jbox_get_nextobject().
If you haven't read the Anatomy of a UI Object, we'll mention that the patcher does not keep a list of non-UI objects
directly. Instead it keeps a list of UI objects called boxes, and the box that holds non-UI objects is called a newobj.
The "objects" you obtain with calls such as jpatcher_get_firstobject() are boxes. The jbox_get_object() routine can
be used to get the pointer to the actual object, whether the box is a UI object or a newobj containing a non-UI object.
In the case of UI objects such as dials and sliders, the pointer returned by jbox_get_object() will be the same as the
box. But for non-UI objects, it will be different.
Here is a function that prints the class of every object (in a box) in a patcher containing an object.
As an alternative to the technique shown above, you can write a callback function for use with the patcher's iteration
service. The advantage of using iteration is that you can descend into the patcher hierarchy without needing to
know the details of the various objects that may contain subpatchers (patcher, poly∼, bpatcher, etc.). If you want to
iterate only at one level of a patcher hierarchy, you can do that too.
Your iteration function is defined as follows. It will be called on every box in a patcher (and, if you specify, the
patcher's subpatchers).
The function returns 0 if iteration should continue, or 1 if it should stop. This permits you to use an iterator as a way
to search for a specific object.
Here is an example of using an iterator function:
t_object *patcher;
long result = 0;
t_max_err err;
The PI_WANTBOX flag tells the patcher iterator that it should pass your iterator function the box, rather than the
object contained in the box. The PI_DEEP flag means that the iteration will descend, depth first, into subpatchers.
The result parameter returns the last value returned by the iterator. For example, if the iterator terminates early by
returning a non-zero value, it will contain that value. If the iterator function does not terminate early, result will be 0.
Assuming the iterator function receives boxes, here is an example iterator that prints out the class and scripting
name (if any) of all of the objects in a patcher. Note that the scripting name is an attribute of the box, while the class
we would like to know is of the object associated with the box.
if (name)
post("%s (%s)",cls->s_name, name->s_name);
else
post("%s", cls->s_name);
return 0;
}
Much of the Max user interface is implemented using patcher scripting. For example, the inspectors are patchers in
which an inspector object has been created. The file browser window has four or five separate scripted objects in it.
Even the debug window is a dynamically scripted patcher. We point this out just to inform you that creating objects in
a patcher actually works (if you get all the details right). The xxx example object shows how to use patcher scripting
to create an "editing window" similar to the ones you see when double-clicking on a table or buffer∼ object.
Creating objects in a patcher generally requires the use of a Dictionary (see discussion of UI objects above), but
there is a convenience function newobject_sprintf() that can be used to avoid some of the complexity.
To create an object, your task is to set some attributes. In the absence of any specific values, an object's attributes
will be set to some default, but you'll probably care, at the very least, about specifying the object's location. Here
is an example that creates a toggle and metro object using a combination of attribute parse syntax and sprintf. If
you're interested in creating objects with newobject_sprintf(), it may help to examine a Max document to see some
of the attribute name - value pairs used to specify objects.
Note that to create a non-UI object, you use set the maxclass attribute to newobj and the text attribute to the
contents of the object box. Attributes can be specified in any order. Using the patching_position attribute permits
you to specify only the top-left corner and use the object's default size. For text objects, the default size is based on
the default font for the patcher.
Finally, note that newobject_sprintf() returns a pointer to the newly created box, not the newly created object inside
the box. To get the object inside the box, use jbox_get_object().
If you'd like to script the connections between two objects, you can do so via a message to the patcher. Assuming
you have the patcher, toggle, and metro objects above, you'll create an array of atoms to send the message using
object_method_typed().
If you want to have a hidden connection, pass an optional fifth argument that is any negative number.
To delete an object in a patcher you call object_free() on the box. As of Max 5.0.6 this will properly redraw the
patcher and remove any connected patch cords.
You can use object attribute functions to modify the appearance and behavior of objects in a patcher or the patcher
itself. Note that only a few of these attributes can be modified by the user. The C level access to attributes is much
more extensive.
Attributes whose type is object can be accessed via object_attr_getobj() / object_attr_setobj(). Attributes whose
type is char can be accessed with object_attr_getchar() / object_attr_setchar(). Attributes whose type is long can
be accessed with object_attr_getlong() / object_attr_setlong(). Attributes whose type is symbol can be accessed
via object_attr_getsym() / object_attr_setsym(). For attributes that are arrays, such as colors and rectangles, use
object_attr_getvalueof() / object_attr_setvalueof().
Enhancements to Objects
Presets are a simple state-saving mechanism. Your object receives a preset message when state is being saved.
You respond by creating a message that will be sent back to your object when the preset is recalled.
For more powerful and general state-saving, use the pattr system described below.
To support saving a single integer in a preset, you can use the preset_int() convenience function. The preset_int()
function records an int message with the value you pass it in the preset, to be sent back to your object at a later
time.
More generally, you can use preset_store(). Here is an example of storing two values (m_xvalue and m_yvalue) in
a list.
In most cases, you need only to define your object's state using Attributes and it will be ready for use with Max's
pattr system. For more complex scenarios you may also wish to investigate object_notify(), object_attach(), and the
section on Receiving Notifications.
14.3 Assistance
To show descriptions of your object's inlets and outlets while editing a patcher, your object can respond to the assist
message with a function that copies the text to a string.
The function below has two inlets and one outlet. The io argument will be 1 for inlets, 2 for outlets. The index
argument will be 0 for the leftmost inlet or outlet. You can copy a maximum of 512 characters to the output string
s. You can use strncpy_zero() to copy the string, or if you want to format the assistance string based on a current
value in the object, you could use snprintf_zero().
60 Enhancements to Objects
void myobject_assist(t_myobject *x, void *b, long io, long index, char *s)
{
switch (io) {
case 1:
switch (index) {
case 0:
strncpy_zero(s, "This is a description of the leftmost inlet", 512);
break;
case 1:
strncpy_zero(s, "This is a description of the rightmost inlet", 512);
break;
}
break;
case 2:
strncpy_zero(s, "This is a description of the outlet", 512);
break;
}
}
Objects such as operators (+, -, etc.) and the int object have inlets that merely store values rather than performing
an operation and producing output. These inlets are labeled with a blue color to indicate they are "cold" rather than
action-producing "hot" inlets. To implement this labeling, your object can respond to the inletinfo message.
If all of your object's non-left inlets are "cold" you can use the function stdinletinfo() instead of writing your own, as
shown below:
To write your own function, just look at the index argument (which is 0 for the left inlet). This example turns the third
inlet cold. You don't need to do anything for "hot" inlets.
Objects such as coll and text display a text editor window when you double-click. Users can edit the contents of the
objects and save the updated data (or not). Here's how to do the same thing in your object.
First, if you want to support double-clicking on a non-UI object, you can respond to the dblclick message.
You'll need to add a t_object pointer to your object's data structure to hold the editor.
Initialize the m_editor field to NULL in your new instance routine. Then implement the dblclick method as follows:
if (!x->m_editor)
x->m_editor = object_new(CLASS_NOBOX, gensym("jed"), (
t_object *)x, 0);
else
object_attr_setchar(x->m_editor, gensym("visible"), 1);
The code above does the following: If the editor does not exist, we create one by making a "jed" object and passing
our object as an argument. This permits the editor to tell our object when the window is closed.
If the editor does exist, we set its visible attribute to 1, which brings the text editor window to the front.
To set the text of the edit window, we can send our jed object the settext message with a zero-terminated buffer of
text. We also provide a symbol specifying how the text is encoded. For best results, the text should be encoded as
UTF-8. Here is an example where we set a string to contain "Some text to edit" then pass it to the editor.
char text[512];
The title attribute sets the window title of the text editor.
When the user closes the text window, your object (or the object you passed as an argument when creating the
editor) will be sent the edclose message.
The edclose method is responsible for doing something with the text. It should also zero the reference to the editor
stored in the object, because it will be freed. A pointer to the text pointer is passed, along with its size. The encoding
of the text is always UTF-8.
If your object will be showing the contents of a text file, you are still responsible for setting the initial text, but you can
assign a file so that the editor will save the text data when the user chooses Save from the File menu. To assign a
file, use the filename message, assuming you have a filename and path ID.
The filename message will set the title of the text editor window, but you can use the title attribute to override the
simple filename. For example, you might want the name of your object to precede the filename:
char titlename[512];
Each time the user chooses Save, your object will receive an edsave message. If you return zero from your edsave
method, the editor will proceed with saving the text in a file. If you return non-zero, the editor assumes you have
taken care of saving the text. The general idea is that when the user wants to save the text, it is either updated
inside your object, updated in a file, or both. As an example, the js object uses its edsave message to trigger a
recompile of the Javascript code. But it also returns 0 from its edsave method so that the text editor will update the
script file. Except for the return value, the prototype of the edsave method is identical to the edclose method.
Table objects can be given names as arguments. If a table object has a name, you can access the data using
table_get(). Supply a symbol, as well as a place to assign a pointer to the data and the length. The following
example accesses a table called foo, and, if found, posts all its values.
You can also write data into the table. If you would like the table editor to redraw after doing so, use table_dirty().
Here's an example where we set all values in the table to zero, then notify the table to redraw.
Data Structures
The Max API provides a variety of useful data structures which may be used across platforms and provide basic
thread-safety.
• Quick Map : a double hash with keys mapped to values and vice-versa
• String Object : wrapper for C-strings with an API for manipulating them
Most often, the use of a particular instance of a data structure will be limited to within the confines a single class or
object you create. However, in some cases you may wish to pass structured data from one object to another. For
this purpose, Max 6 introduced facilities for passing named t_dictionary instances.
Examples, descriptions, and API documentation can be found in Dictionary Passing API .
64 Data Structures
Threading
Please note that this description of how Max operates is subject to change and may not apply to future versions.
For more information about the Max scheduler and low-priority queue, see the The Scheduler section.
Max (without audio) has two threads. The main or event thread handles user interaction, asks the system to redraw
the screen, processes events in the low-priority queue. When not in Overdrive mode, the main thread handles the
execution of events in the Max scheduler as well. When Overdrive is enabled, the scheduler is moved to a high-
priority timer thread that, within performance limits imposed by the operating system, attempts to run at the precise
scheduler interval set by user preference. This is usually 1 or 2 milliseconds.
The basic idea is to put actions that require precise timing and are relatively computationally cheap in the high-
priority thread and computationally expensive events that do not require precise timing in the main thread. On
multi-core machines, the high-priority thread may (or may not) be executing on a different core.
On both Mac and Windows, either the main thread or the timer thread can interrupt the other thread, even though
the system priority level of the timer thread is generally much higher. This might seem less than optimal, but it is
just how operating systems work. For example, if the OS comes to believe the Max timer thread is taking too much
time, the OS may "punish" the thread by interrupting it with other threads, even if those threads have a lower system
priority.
Because either thread can be interrupted by the other, it is necessary to use thread protection to preserve the
integrity of certain types of data structures and logical operations. A good example is a linked list, which can be
corrupted if a thread in the process of modifying the list is interrupted by another thread that tries to modify the list.
The Max t_linklist data structure is designed to be thread-safe, so if you need such a data structure, we suggest you
use t_linklist. In addition, Max provides thread protection between the timer thread and the main thread for many of
its common operations, such as sending messages and using outlets.
When we add audio into the mix (so to speak), the threading picture gets more complicated. The audio perform
routine is run inside a thread that is controlled by the audio hardware driver. In order to eliminate excessive thread
blocking and potential race conditions, the thread protection offered inside the audio perform routine is far less
comprehensive, and as discussed in the MSP section of the API documentation, the only supported operation for
66 Threading
perform routines to communicate to Max is to use a clock. This will trigger a function to run inside the Max scheduler.
The Max scheduler can be run in many different threading conditions. As explained above it can be run either in the
main thread or the timer thread. When Scheduler in Audio Interrupt (SIAI) is enabled, the scheduler runs with an
interval equal to every signal vector of audio inside the audio thread. However, if the Non-Real-Time audio driver is
used, the audio thread is run inside the main thread, and if SIAI is enabled, the scheduler will also run inside the
main thread. If not, it will run either in the main thread or the timer thread depending on the Overdrive setting. (Using
the Non-Real-Time audio driver without SIAI will generally lead to unpredictable results and is not recommended.)
The easiest method for thread protection is to use critical sections. A critical section represents a region of code that
cannot be interrupted by another thread. We speak of entering and exiting a critical section, and use critical_enter()
and critical_exit() to do so.
Max provides a default global critical section for your use. This same critical section is used to protect the timer
thread from the main thread (and vice versa) for many common Max data structures such as outlets. If you call
critical_enter() and critical_exit() with argument of 0, you are using this global critical section. Typically it is more
efficient to use fewer critical sections, so for many uses, the global critical section is sufficient. Note that the critical
section is recursive, so you if you exit the critical section from within some code that is already protected, you won't
be causing any trouble.
It's possible that a message sent to your object could interrupt the same message sent to your object ("myobject").
For example, consider what happens when a button is connected to the left inlet of myobject and a metro connected
to the same inlet.
When a user clicks on the bang button, the message is sent to your object in the main thread. When Overdrive is
enabled, the metro will send a bang message to your object in the timer thread. Either could interrupt the other. If
your object performs operations on a data structure that cannot be interrupted, you should use thread protection.
Here is an example that uses the global critical section to provide thread protection for an array data structure.
Assume we have an operation array_read() that reads data from an array, and array_insert() that inserts data into
the same array. We wish to ensure that reading doesn't interrupt writing and vice versa.
Note that all paths of your code must exit the critical region once it is entered, or the other threads in Max will never
execute.
Drag'n'Drop
The Max file browser permits you to drag files to a patcher window or onto objects to perform file operations.
Your object can specify the file types accepted as well as a message that will be sent when the user releases the
mouse button with the file on top of the object. UI and non-UI objects use the same interface to drag'n'drop.
Example UI object: pictmeter∼. Example non-UI: TBD.
Messages to support:
acceptsdrag_locked (A_CANT)
Sent to an object during a drag when the mouse is over the object in an unlocked patcher.
acceptsdrag_unlocked (A_CANT)
Sent to an object during a drag when the mouse is over the object in a locked patcher.
17.1 Discussion
Why two different scenarios? acceptsdrag_unlocked() can be thought of as an "editing" operation. For example,
objects such as pictslider accept new image files for changing their appearance when the patcher is unlocked, but
not when the patcher is locked. By contrast, sfplay∼ can accept audio files for playback in either locked or unlocked
patchers, since that is something you can do with a message (rather than an editing operation that changes the
patcher).
Message handler definitions:
The handlers return true if the file(s) contained in the drag can be used in some way by the object. To test the
filetypes, use jdrag_matchdragrole() passing in the drag object and a symbol for the file type. Here is list of pre-
defined file types:
• audiofile
• imagefile
• moviefile
• patcher
• helpfile
68 Drag'n'Drop
• textfile
Your acceptsdrag handler can test for multiple types of files and add different messages.
ITM
There are two kinds of events in ITM. Temporary events are analogous to Max clock objects in that they are sched-
uled and fire at a dynamically assigned time. Once they have executed, they are removed from the scheduler.
Permanent events always fire when the transport reaches a specific time, and are not removed from the sched-
uler. The ITM-aware metro is an example of an object that uses temporary events, while the timepoint object uses
permanent events. We'll show how to work both types using an example included in the SDK called delay2. The
existing Max delay object provides this capability, but this example shows most of the things you can do with the
time object interface. To see the complete object, look at the delay2 example. We'll introduce a simpler version of
the object, then proceed to add the quantization and the additional outlet that generates a delayed bang based on
low-level ITM calls.
The ITM time object API is based on a Max object you create that packages up common ways you will be using
ITM, including attribute support, quantization, and, if you want it, the ability to switch between traditional millisecond-
based timing and tempo-based timing using an interface that is consistent with the existing Max objects such as
metro and delay. (If you haven't familiarized yourself with attributes, you may want to read through the discussion
about them in Attributes before reading further.)
To use the time object, you'll first need to provide some space in your object to hold a pointer to the object(s) you'll
be creating.
Next, in your ext_main() routine, you'll create attributes associated with the time object using the class_time_←-
addattr() function.
The second argument, "delaytime", is a string that names the attribute. Users of your object will be able to change
the delay value by sending a delaytime message. "Delay Time" is the label users see for the attribute in the inspector.
The flags argument permits you to customize the type of time object you'd like. TIME_FLAGS_TICKSONLY means
that the object can only be specified in tempo-relative units. You would not use this flag if you want the object to use
the regular Max scheduler if the user specifies an absolute time (such as milliseconds). TIME_FLAGS_USECLOCK
means that it is a time object that will actually schedule events. If you do not use this flag, you can use the time
object to hold and convert time values, which you use to schedule events manually. TIME_FLAGS_TRANSPO←-
RT means that an additional attribute for specifying the transport name is added to your object automatically (it's
called "transport" and has the label "Transport Name"). The combination of flags above is appropriate for an object
that will be scheduling events on a temporary basis that are only synchronized with the transport and specified in
tempo-relative units.
The next step is to create a time object in your new instance routine using time_new. The time_new function is
something like clock_new – you pass it a task function that will be executed when the scheduler reaches a certain
time (in this case, delay2simple_tick, which will send out a bang). The first argument to time_new is a pointer to
your object, the second is the name of the attribute created via class_time_addattr, the third is your task function,
and the fourth are flags to control the behavior of the time object, as explained above for class_time_addattr.
Finally, we use time_setvalue to set the initial delay value to 0.
void *delay2simple_new()
{
t_delay2simple *x;
t_atom a;
x = (t_delay2simple *)object_alloc(s_delay2simple_class);
x->m_timeobj = (t_object *)time_new((t_object *)x,
gensym("delaytime"), (method)delay2simple_tick, TIME_FLAGS_TICKSONLY |
TIME_FLAGS_USECLOCK);
x->m_outlet = bangout((t_object *)x);
atom_setfloat(&a, 0.);
time_setvalue(x->d_timeobj, NULL, 1, &a);
return x;
}
To make a delayed bang, we need a delay2simple_bang function that causes our time object to put its task func-
tion into the ITM scheduler. This is accomplished using time_schedule. Note that unlike the roughly equivalent
clock_fdelay, where the delay time is an argument, the time value must already be stored inside the time object
using time_setvalue. The second argument to time_schedule is another time object that can be used to control
quantization of an event. Since we aren't using quantization in this simple version of delay2, we pass NULL.
Next, our simple task routine, delay2simple_tick. After the specified number of ticks in the time object has elapsed
after the call to time_schedule, the task routine will be executed.
Now let's add the two more advanced features found in delay2: quantization and a second (unquantized) bang
output using low-level ITM routines. Here is the delay2 data structure. The new elements are a proxy (for receiving
a delay time), a time object for quantization (d_quantize), a clock to be used for low-level ITM scheduling, and an
outlet for the use of the low-level clock's task.
In the initialization routine, we'll define a quantization time attribute to work in conjunction with the d_quantize time
object we'll be creating. This attribute does not have its own clock to worry about. It just holds a time value, which
we specify will only be in ticks (quantizing in milliseconds doesn't make sense in the ITM context). If you build delay2
and open the inspector, you will see time attributes for both Delay Time and Quantization.
Here is part of the revised delay2 new instance routine. It now creates two time objects, plus a regular clock object.
x->d_inletnum = 0;
x->d_proxy = proxy_new(x, 1, &x->d_inletnum);
x->d_outlet2 = bangout(x);
x->d_outlet = bangout(x);
To use the quantization time object, we can pass it as the second argument to time_schedule. If the value of the
quantization is 0, there is no effect. Otherwise, time_schedule will move the event time so it lies on a quantization
boundary. For example, if the quantization value is 4n (480 ticks), the delay time is 8n (240 ticks) and current time
is 650 ticks, the delay time will be adjusted so that the bang comes out of the delay2 object at 980 ticks instead of
890 ticks.
In addition to using quantization with time_schedule, delay2_bang shows how to calculate a millisecond equivalent
for an ITM time value using itm_tickstoms. This delay value is not quantized, although you read the time value from
the d_quantize object and calculate your own quantized delay if wanted. The "calculated" delay is sent out the right
outlet, since the clock we created uses delay2_clocktick.
time_schedule(x->d_timeobj, x->d_quantize);
tix = time_getticks(x->d_timeobj);
tix += (tix / 2);
ms = itm_tickstoms(time_getitm(x->d_timeobj), tix);
clock_fdelay(x->d_clock, ms);
}
A permanent event in ITM is one that has been scheduled to occur when the transport reaches a specific time. You
can schedule a permanent event in terms of ticks or bars/beats/units. An event based in ticks will occur when the
transport reaches the specified tick value, and it will not be affected by changes in time signature. An event specified
for a time in bars/beats/units will be affected by the time signature. As an example, consider an event scheduled
for bar 2, beat 1, unit 0. If the time signature of the ITM object on which the event has been scheduled is 3/4, the
event will occur at 480 times 3 or 1440 ticks. But if the time signature is 4/4, the event will occur at 1920 ticks. If, as
an alternative, you had scheduled the event to occur at 1920 ticks, setting the time signature to 3/4 would not have
affected when it occurred.
You don't "schedule" a permanent event. Once it is created, it is always in an ITM object's list of permanent events.
To specify when the event should occur, use time_setvalue.
The high-level time object interface handles permanent events. Let's say we want to have a time value called
"targettime." First, we declare an attribute using class_time_addattr. The flags used are TIME_FLAGS_TICKS←-
ONLY (required because you can't specify a permanent event in milliseconds), TIME_FLAGS_LOCATION (which
interprets the bar/beat/unit times where 1 1 0 is zero ticks), TIME_FLAGS_PERMANENT (for a permanent event),
and TIME_FLAGS_TRANSPORT (which adds a transport attribute permitting a user to choose a transport object
as a destination for the event) and TIME_FLAGS_POSITIVE (constrains the event to happen only for positive tick
and bar/beat/unit values).
The TIME_FLAGS_TRANSPORT flag is particularly nice. Without any intervention on your part, it creates a trans-
port attribute for your object, and takes care of scheduling the permanent event on the transport the user specifies,
with a default value of the global ITM object. If you want to cause your event to be rescheduled dynamically when
the user changes the transport, your object can respond to the reschedule message as follows.
All you need to do in your reschedule method is just act as if the user has changed the time value, and use the
current time value to call time_setvalue.
In your new instance routine, creating a permanent event with time_new uses the same flags as were passed to
class_time_addattr:
The task called by the permanent time object is identical to a clock task or an ITM temporary event task.
18.3 Cleaning Up
With all time objects, both permanent and temporary, it's necessary to free the objects in your object's free method.
Failure to do so will lead to crashes if your object is freed but its events remain in the ITM scheduler. For example,
here is the delay2 free routine:
Jitter objects use an object model which is somewhat different than the one traditionally used for developing Max
external objects. The first big difference between Jitter objects and traditional Max external objects is that Jitter
objects don't have any notion of the patcher themselves. This allows for the flexible instantiation and use of Jitter
objects from C, Java, JavaScript, as well as in the Max patcher. The use of these Jitter objects is exposed to the
patcher with a Max "wrapper" object, which will be discussed in the following chapter.
In this chapter we'll restrict our discussion to the fundamentals of defining the Jitter object which can be used in
any of these languages. While Jitter's primary focus is matrix processing and real-time graphics, these tasks are
unrelated to the object model, and will be covered in later chapters on developing Matrix Operator (MOP) and OB3D
objects. Like Max objects, Jitter objects are typically written in C. While C++ can be used to develop Jitter objects,
none of the object oriented language features will be used to define your object as far as Jitter is concerned. Similar
to C++ or Java objects, Jitter objects are defined by a class with methods and member variables - we will refer to the
member variables as "attributes". Unlike C++ or Java, there are no language facilities that manage class definition,
class inheritance, or making use of class instances. In Jitter this must all be managed with sets of standard C
function calls that will define your class, exercise methods, and get and set object attributes.
Max and Jitter implement their object models by maintaining a registry of ordinary C functions and struct members
that map to methods and attributes associated with names. When some other code wishes to make use of these
methods or attributes, it asks the Jitter object to look up the method or attribute in its registry based on a name.
This is called dynamic binding, and is similar to Smalltalk or Objective C's object model. C++ and Java typically
make use of static binding — i.e. methods and member variables are resolved at compile time rather than being
dynamically looked up at run time.
A Jitter class is typically defined in a C function named something like your_object_name_init(). Class definition
begins with a call to jit_class_new(), which creates a new class associated with a specified name, constructor,
destructor, and size in bytes of the object as stored in a C structure. This is followed by calls to jit_class_←-
addmethod() and jit_class_addattr(), which register methods and attributes with their corresponding names in the
class. The class is finally registered with a call to jit_class_register(). A minimal example class definition is shown
below:
t_jit_err jit_foo_init(void)
{
74 Jitter Object Model
long attrflags=0;
t_jit_object *attr;
// define attribute
attr = jit_object_new( // instantiate an object
_jit_sym_jit_attr_offset, // of class jit_attr_offset
"myval", // with name "myval"
_jit_sym_float32, // type float32
attrflags, // default flags
(method)0L, // default getter accessor
(method)0L, // default setter accessor
calcoffset(t_jit_foo,myval)); // byte offset to struct member
// register class
jit_class_register(_jit_foo_class);
return JIT_ERR_NONE;
}
// constructor
t_jit_foo *jit_foo_new(void)
{
t_jit_foo *x;
// allocate object
if (x=jit_object_alloc(_jit_foo_class))
{
// if successful, perform any initialization
x->myval = 0;
}
return x;
}
// destructor
void jit_foo_free(t_jit_foo *x)
{
// would free any necessary resources here
}
// scream method
void jit_foo_scream(t_jit_foo *x, long i)
{
post("MY VALUE IS %f! AND MY ARGUMENT IS %d", x->myval, i);
}
The above example has a constructor, jit_foo_new(); a destructor, jit_foo_free(); one 32 bit floating point attribute,
myval, a member of the object struct accessed with default accessor methods; and a method jit_foo_scream(),
which posts the current value of myval to the Max window.
Each instance of an object occupies some region of organized memory. The C structure that defines this organiza-
tion of memory is typically referred to as the "object struct". It is important that the object struct always begin with
an entry of type t_jit_object. It is within the t_jit_object where special information about the class is kept. The C
structure can contain additional information, either exposed as attributes or not, but it is important that the size of
the object struct does not exceed 16384 bytes. This means that it is not safe to define a large array as a struct entry
if it will cause the size of the object struct to be larger than this limit. If additional memory is required, the object
struct should contain a pointer to memory allocated from within the constructor, and freed within the destructor.
The class registration in the above code makes use of the object struct both to record in the class how large
each object instance should be—i.e. sizeof(t_jit_foo) ; and at what byte offset in the object struct an attribute is
located—i.e. calcoffset(t_jit_foo, myval) . When methods of an object are called, the instance of the object struct is
passed as the first argument to the C functions which define the object methods. This instance may be thought of
as similar to the "this" keyword used in C++ and Java - actually the C++ and Java underlying implementation works
quite similarly to what has been implemented here in pure C. Object struct entries may be thought of as similar to
object member variables, but methods must be called via functions rather than simply dereferencing instances of
the class as you might do in C++ or Java. The list of object methods and other class information is referenced by
your object's t_jit_object entry.
19.4 Constructor/Destructor
The two most important methods that are required for all objects are the constructor and the destructor. These
are typically named your_object_name_new(), and your_object_name_free(), respectively. It is the constructor's
responsibility to allocate and initialize the object struct and any additional resources the object instance requires.
The object struct is allocated via jit_object_alloc(), which also initializes the t_jit_object struct entry to point at your
relevant class information. The class information resides in your global class variable, e.g. _jit_foo_class, which you
pass as an argument to jit_object_alloc(). This allocation does not, however initialize the other struct entries, such
as "myval", which you must explicitly initialize if your allocation is successful. Note that because the constructor
allocates the object instance, no object instance is passed as the first argument to the function which defines the
constructor, unlike other object methods.
The constructor also has the option of having a typed argument signature with the same types as defined in the
Writing Max Externals documentation—i.e. A_LONG, A_FLOAT, A_SYM, A_GIMME, etc. Typically, Jitter object
constructors either have no arguments or use the A_GIMME typed argument signature.
In earlier versions of Jitter, the constructors were often specified as private and "untyped" using the A_CANT type
signature. While this obsolete style of an untyped constructor will work for the exposure of a Jitter class to the
patcher and C, it is now discouraged, as there must be a valid type signature for exposure of a class to Javascript
or Java, though that signature may be the empty list.
It is the destructor's responsibility to free any resources allocated, with the exception of the object struct itself. The
object struct is freed for you after your destructor exits.
19.5 Methods
You can define additional methods using the jit_class_addmethod() function. This example defines the scream
method associated with the function jit_foo_scream(), with no additional arguments aside from the standard first
argument of a pointer to the object struct. Just like methods for ordinary Max objects, these methods could have
a typed argument signature with the same types as defined in the Writing Max Externals documentation — i.←-
e. A_LONG, A_FLOAT, A_SYM, A_GIMME. Typically in Jitter objects, public methods are specified either without
arguments, or use A_GIMME, or the low priority variants, A_DEFER_LOW, or A_USURP_LOW, which will be
discussed in following chapters. Private methods, just like their Max equivalent should be defined as untyped, using
the A_CANT type signature. Object methods can be called from C either by calling the C function directly, or by
using jit_object_method() or jit_object_method_typed(). For example, the following calls that relate to the above
jit_foo example are equivalent:
// dynamically resolve and call scream method with typed atom arguments
t_atom a[1];
jit_atom_setlong(a, 74);
jit_object_method_typed(x, gensym("scream"), 1, a, NULL);
What the jit_object_method() and jit_object_method_typed() functions do is look up the provided method symbol in
the object's class information, and then calls the corresponding C function associated with the provided symbol. The
difference between jit_object_method() and jit_object_method_typed() is that jit_object_method() will not require
that the method is typed and public, and blindly pass all of the arguments following the method symbol on to the
corresponding method. For this reason, it is required that you know the signature of the method you are calling,
and pass the correct arguments. This is not type checked at compile time, so you must be extremely attentive to
the arguments you pass via jit_object_method(). It is also possible for you to define methods which have a typed
return value with the A_GIMMEBACK type signature. When calling such methods, the final argument to jit_object←-
_method_typed(), should point to a t_atom to be filled in by the callee. This and the subject of "typed wrappers" for
exposing otherwise private methods to language bindings that require typed methods (e.g. Java/!JavaScript) will be
covered in a later chapter.
19.6 Attributes
You can add attributes to the class with jit_class_addattr(). Attributes themselves are Jitter objects which share a
common interface for getting and setting values. While any class which conforms to the attribute interface could be
used to define attributes of a given class, there are a few common classes which are currently used: jit_attr_offset(),
which specifies a scalar attribute of a specific type (char, long, float32, float64, symbol, or atom) at some byte offset
in the object struct; jit_attr_offset_array() which specifies an array (vector) attribute of a specific type (char, long,
float32, float64, symbol, or atom) at some byte offset in the object struct; and jit_attribute, which is a more generic
attribute object that can be instantiated on a per object basis. We will not document the usage of jit_attribute at this
time. The constructor for the class jit_attr_offset() has the following prototype:
When this constructor is called via jit_object_new(), additionally the class name, _jit_sym_jit_attr_offset (a global
variable equivalent to gensym("jit_attr_offset") ) must be passed as the first parameter, followed by the above argu-
ments, which are passed on to the constructor. The name argument specifies the attribute name as a null terminated
C string. The type argument specifies the attribute type, which may be one of the following symbols: _jit_sym_char,
_jit_sym_long, _jit_sym_float32, _jit_sym_float64, _jit_sym_symbol, _jit_sym_atom, _jit_sym_object, or _jit_sym←-
_pointer. The latter two are only useful for private attributes as these types are not exposed to, or converted from
Max message atom values.
The flags argument specifies the attribute flags, which may be a bitwise combination of the following constants:
Typically attributes in Jitter are defined with flags JIT_ATTR_GET_DEFER_LOW, and JIT_ATTR_SET_USURP←-
_LOW. This means that multiple queries from the patcher will generate a response for each query, and that multiple
attempts to set the value at high priority will collapse into a single call with the last received value. For more
information on defer and usurp, see the chapter on Jitter scheduling issues.
The mget argument specifies the attribute "getter" accessor method, used to query the attribute value. If this
argument is zero (NULL), then the default getter accessor will be used. If you need to define a custom accessor, it
should have a prototype and form comparable to the following custom getter:
return JIT_ERR_NONE;
}
Note that getters require memory to be allocated, if there is not memory passed into the getter. Also the attr
argument is the class' attribute object and can be queried using jit_object_method() for things like the attribute flags,
names, filters, etc.. The mset argument specifies the attribute "setter" accessor method, used to set the attribute
value. If this argument is zero (NULL), then the default setter accessor will be used. If we need to define a custom
accessor, it should have a prototype and form comparable to the following custom setter:
The offset argument specifies the attribute's byte offset in the object struct, used by default getters and setters to
automatically query and set the attribute's value. If you have both custom accessors, this value is ignored. This can
be a useful strategy to employ if you wish to have an object attribute that does not correspond to any actual entry
in your object struct. For example, this is how we implement the time attribute of jit.movie — i.e. it uses a custom
getter and setter which make QuickTime API calls to query and set the current movie time, rather than manipulating
the object struct itself, where no information about movie time is actually stored. In such an instance, you should
set this offset to zero.
After creating the attribute, it must be added to the Jitter class using the jit_class_addattr() function:
To put it all together: to define a jit_attribute_offset() with the custom getter and setter functions defined above, you'd
make the following call:
And to define a completely standard jit_attribute_offset(), using the default getter and setter methods:
Attributes can, in addition to referencing single values, also refer to arrays of data. The class jit_attribute_offset_←-
array is used in this instance. The constructor for the class jit_attr_offset_array() has the following prototype:
When this constructor is called via jit_object_new(), additionally the class name, _jit_sym_jit_attr_offset_array() (a
global variable equivalent to gensym("jit_attr_offset_array") ) must be passed as the first parameter, followed by the
above arguments, which are passed on to the constructor.
The name, type, flags, mget, mset and offset arguments are identical to those specified above.
The size argument specifies the maximum length of the array (the allocated size of the array in the Jitter object
struct). The offsetcount specifies the byte offset in the object struct, where the actual length of the array can be
queried/set. This value should be specified as a long. This value is used by default getters and setters when
querying and setting the attribute's value. As with the jit_attr_offset object, if you have both custom accessors, this
value is ignored.
The following sample listing demonstrates the creation of a simple instance of the jit_attr_offset_array() class for an
object defined as:
Although the subject of object registration and notification will be covered in greater depth in a forthcoming chapter,
it bears noting that attributes of all types (e.g. jit_attr_offset, jit_attr_offset_array and jit_attribute) will, if registered,
automatically send notifications to all attached client objects, each time the attribute's value is set.
In order to expose the Jitter object to the Max patcher, a Max "wrapper" class must be defined. For simple classes,
this is largely facilitated by a handful of utility functions that take a Jitter class and create the appropriate wrapper
class with default functionality. However, there are occasions which warrant additional intervention to achieve special
behavior, such as the use of additional inlets and outlets, integrating with MSP, converting matrix information to and
from Max lists, etc. The first Max wrapper class we'll demonstrate won't have any extra complication beyond simply
containing a basic Jitter class.
In general it is preferable to design the Jitter class so that it knows nothing about the Max patcher, and that any logic
necessary to communicate with the patcher is maintained in the Max wrapper class. In situations where this might
seem difficult, this can typically be accomplished by making special methods in the Jitter class that are only meant
to be called by the Max wrapper, or by using Jitter's object notification mechanism, which we'll discuss in a future
chapter. Below is the minimal Max wrapper class for the minimal Jitter class shown in the last chapter.
void *class_max_jit_foo;
// wrap the Jitter class with the standard methods for Jitter objects
max_jit_classex_standard_wrap(p, q, 0);
return (x);
}
The first thing you must do is define your Max class object struct. As is typical, for standard Max objects the first
entry of the object struct must be of type t_object; for UI objects, it must be of type t_jbox; for MSP objects, it must
be of type t_pxobject; and for MSP UI objects, it must be of type t_pxjbox. For more information on these different
Max object types, please consult the Max developer documentation. Jitter objects can be wrapped within any of
these object types.
You also need to define a pointer to point to extra information and resources needed to effectively wrap your Jitter
class. This is typically referred to as the "obex" data, and it is where Jitter stores things like attribute information,
the general purpose "dumpout", the internal Jitter object instance, Matrix Operator resources for inlets/outlets, and
other auxiliary object information that is not required in a simple Max object. As of Max 4.5 there is also the facility
for making use of such additional object information for ordinary Max objects. At the time of this writing, such
information is provided in the Pattr developer documentation, as it is relevant to the definition of object attributes,
which may be stored and operated upon by the patcher attribute suite of objects.
In your Max class registration, which takes place in your external's ext_main() function, you should begin by calling
your Jitter class's registration function, typically named something like your_object_name_init(). Then you should
proceed to define the Max class's constructor, destructor, object struct size, and typed arguments as is typically
accomplished for Max objects via the setup function. In order for your wrapper class to be able to find the obex data,
you need to specify a byte offset where this pointer is located within each object instance and allocate the resource
in which this is stored in your Max class. This is accomplished with the max_jit_classex_setup() function. You
should then look up the Jitter class via jit_class_findbyname(), and wrap it via the max_jit_classex_standard_wrap()
function. The max_jit_classex_standard_wrap() function will add all typed methods defined in the Jitter class, as
well getter and setter methods for attributes that are not opaque (i.e. private), and all the methods that are common
to Jitter objects like getattributes, getstate, summary, importattrs, exportattrs, etc.
Now that you have wrapped the Jitter class, you can add any additional methods that you wish, such as your
inlet/outlet assistance method, or something specific to the Max object. Like Jitter objects, you can also add methods
which have defer or usurp wrappers, and these should be added via the max_addmethod_defer_low() or max_←-
addmethod_usurp_low() functions, rather than simply using the traditional addmess() function. C
20.4 Constructor
Inside the Max object constructor, there are a few things which are different than building an ordinary Max external.
If your object is to respond to attribute arguments, the constructor must be defined to take variable number of typed
atom arguments, accomplished with the A_GIMME signature. You allocate your Max object with the max_jit_←-
obex_new() function, instead of the traditional newobject function. You need to pass your Jitter class name to the
max_jit_obex_new() function, which also allocates and initializes your obex data. If successful, you should proceed
to add your general purpose "dumpout" outlet, used for returning attribute queries and other methods that provide
information like ∗jit.movie∗'s framedump method's frame number or read method success code, with the max_←-
jit_object_dumpout_set() function. If your object is a Matrix Operator that calls max_jit_mop_setup_simple() you
will not need to explicitly call max_jit_object_dumpout_set(), as max_jit_mop_setup_simple() calls max_jit_object←-
_dumpout_set() internally.
You then allocate your Jitter object with jit_object_new(), and store it in your obex data via max_jit_obex_jitob_set().
Note that this Jitter object instance can always be found with the function max_jit_obex_jitob_get(). If you wish,
prior to allocating your Jitter object, you can look at your non-attribute arguments first — those arguments up to
the location returned by max_jit_attr_args_offset() — and make use of them in your Jitter object constructor. It is
typical to process attribute arguments after you've allocated both the Max and Jitter object instances, with max←-
_jit_attr_args(), which is passed the Max object instance. If you wanted to use the attribute arguments somehow
in your Jitter object constructor, you would need to parse the attribute arguments yourself. If you are not able to
allocate your Jitter object (as is the case if you have run out of memory or if Jitter is present but not authorized), it is
important that you clean up your Max wrapper object, and return NULL.
20.5 Destructor
In your Max object destructor, you additionally need to free your internal Jitter object with jit_object_free(), and free
any additional obex data with max_jit_obex_free(). Matrix operators will typically require that max_jit_mop_free() is
called, to free the resources allocated for matrix inputs and outputs. If your object has attached to a registered object
for notification via jit_object_attach(), you should detach from that object in your destructor using jit_object_detach()
to prevent invalid memory accesses as the registered object might attempt to notify the memory of a now freed
object. Object registration and notification is discussed in further detail in following chapters.
20.6 Dumpout
The general purpose outlet, also known as "dumpout", is automatically used by the Max wrapper object when calling
attribute getters and several of the standard methods like summary, or getattributes. It is also available for use in
any other Max method you want, most easily accessed with the max_jit_obex_dumpout() function that operates
similar to outlet_anything(), but uses the max object pointer rather than the outlet pointer as the first argument.
The outlet pointer which has been set in your constructor can be queried with the max_jit_obex_dumpout_get()
function, and used in the standard outlet calls. However, it is recommended for routing purposes that any output
through the dumpout outlet is a message beginning with a symbol, rather than simply a bang, int, or float. Therefore,
outlet_anything() makes the most sense to use.
To add additional inlets and outlets to your Max external, a few things should be noted. First, if your object is a Matrix
Operator, matrix inlets and outlets will be added either through either the high level max_jit_mop_setup_simple(), or
lower level max_jit_mop_inputs() or max_jit_mop_outputs() calls. These Matrix Operator functions will be covered
in the chapter on Matrix Operators. Secondly, if your object is an MSP object, all signal inlets and outlets must be
leftmost, and all non-signal inlets and outlets must be to the right of any single inlets or outlets—i.e. they cannot be
intermixed. Lastly, additional inlets should use proxies (covered in detail in the Max developer documentation) so
that your object knows which inlet a message has been received. This is accomplished with the max_jit_obex_←-
proxy_new() function. The inlet number is zero based, and you do not need to create a proxy for the leftmost inlet.
Inside any methods which need to know which inlet the triggering message has been received, you can use the
max_jit_obex_inletnumber_get() function.
Sometimes you will need additional attributes which are specific to the Max wrapper class, but are not part of the
internal Jitter class. Attributes objects for the Max wrapper class are defined in the same way as those for the
Jitter class, documented in the previous chapter. However, these attributes are not added to the Max class with the
jit_class_addattr() function, but instead with the max_jit_classex_addattr() function, which takes the classex pointer
returned from max_jit_classex_setup(). Attribute flags, and custom getter and setter methods should be defined
exactly as they would for the Jitter class.
The purpose of this chapter is to give a quick and high level overview of how to develop a simple Matrix Operator
(MOP), which can process the matrix type most commonly used for video streams—i.e.
4 plane char data. For this task, we will use the jit.scalebias SDK example. More details such as how to make a
Matrix Operator which deals with multiple types, plane count, dimensionality, inputs, outputs, etc. will appear in the
following chapter. This chapter assumes familiarity with Jitter's multi-dimensional matrix representation and Matrix
Operators used from the Max patcher, as discussed in the Jitter Tutorial, and as well as the preceding chapters on
the Jitter object model and Max wrapper classes.
In the Jitter class definition, we introduce a few new concepts for Matrix Operators. In addition to the standard
method and attribute definitions discussed in the Jitter object model chapter, you will want to define things like how
many inputs and outputs the operator has, and what type, plane count, and dimension restrictions the operator has.
These are accomplished by creating an instance of the jit_mop class, setting some state for the jit_mop object and
adding this object as an adornment to your Jitter class. The following code segment references the jit.scalebias
SDK example.
You create your jit_mop instance in a similar fashion to creating your attribute instances, using jit_object_new(). The
jit_mop constructor has two integer arguments for inputs and outputs, respectively. By default, each MOP input
and output is unrestricted in plane count, type, and dimension, and also are linked to the plane count, type, and
dimensions of the first (i.e. leftmost) input. This default behavior can be overridden, and this simple 4 plane, char
type, jit.scalebias example enforces the corresponding type and plane count restrictions via the jit_mop_single_←-
type() and jit_mop_single_planecount() utility functions. For more information on the jit_mop class, please see the
following chapter on MOP details and the Jitter API reference.
Once you have created your jit_mop instance, and configured it according to the needs of your object, you add it as
an adornment to your Jitter class with the jit_class_add_adornment() function. Adornments are one way for Jitter
objects to have additional information, and in some instances behavior, tacked onto an existing class. Adornments
will be discussed in detail in a later chapter.
You also want to define your matrix calculation method, where most of the work of a Matrix Operator occurs, with
the jit_class_addmethod() function as a private, untyped method bound to the symbol matrix_calc.
84 Matrix Operator QuickStart
jit_class_addmethod(_jit_scalebias_class,
(method)jit_scalebias_matrix_calc,
"matrix_calc", A_CANT, 0L);
You don't need to add anything special to your Matrix Operator's constructor or destructor, aside from the stan-
dard initialization and cleanup any Jitter object would need to do. Any internal matrices for input and outputs are
maintained, and only required, by the Max wrapper's asynchronous interface. The Jitter MOP contains no matrices
for inputs and outputs, but rather expects that the matrix calculation method is called with all inputs and outputs
synchronously. When used from languages like C, Java, and JavaScript, it is up to the programmer to maintain and
provide any matrices which are being passed into the matrix calculation method.
The most important method for Matrix Operators, and the one in which the most work typically occurs is in the
matrix calculation, or "matrix_calc" method, which should be defined as a private, untyped method with the A_←-
CANT type signature, and bound to the symbol "matrix_calc". In this method your object receives a list of input
matrices and output matrices to use in its calculation. You need to lock access to these matrices, inquire about
important attributes, and ensure that any requirements with respect to type, plane count, or dimensionality for the
inputs are met before actually processing the data, unlocking access to the matrices and returning. It should be
defined as in the following example.
err=JIT_ERR_MISMATCH_PLANE;
goto out;
}
// get dimensions/planecount
dimcount = out_minfo.dimcount;
planecount = out_minfo.planecount;
for (i=0;i<dimcount;i++)
{
// if input and output are not matched in
// size, use the intersection of the two
dim[i] = MIN(in_minfo.dim[i],out_minfo.dim[i]);
}
out:
// restore matrix lock state to previous value
jit_object_method(out_matrix,_jit_sym_lock,out_savelock);
jit_object_method(in_matrix,_jit_sym_lock,in_savelock);
return err;
}
Since Jitter supports the processing of N-dimensional matrices where N can be any number from 1 to 32, most
Matrix Operators are designed with a recursive function that will process the data in some lower dimensional slice,
most often 2 dimensional. The recursive function that does this is typically named myobject_calculate_ndim(), and
is called by your matrix_calc method either directly or via one of the parallel processing utility functions, which are
discussed in a future chapter.
It is out of the scope of this documentation to provide a detailed tutorial on fixed point or pointer arithmetic, both
of which are used in this example. The code increments a pointer through the matrix data, scaling each planar
element of each matrix cell by some factor and adding some bias amount. This is done with fixed point arithmetic
(assuming an 8bit fractional component), since a conversion from integer to floating point data and back is an
expensive operation. The jit.scalebias object also has two modes, one which sums the planes together, and one
which processes each plane independently. You can improve performance by case handling on a per row, rather
than per cell basis, and reduce your code somewhat by case handling on a per row, rather than per matrix basis.
While a slight performance increase could be made by handling on a per matrix basis, per row is usually a decent
point at which to make such an optimization trade off.
switch(dimcount)
{
case 1:
// if only 1D, interpret as 2D, falling through to 2D case
dim[1]=1;
case 2:
// convert floating point scale factors to a fixed point int
ascale = x->ascale*256.;
rscale = x->rscale*256.;
gscale = x->gscale*256.;
bscale = x->bscale*256.;
width = dim[0];
height = dim[1];
switch (x->mode) {
case 1:
// sum together, clamping to the range 0-255
// and set all output planes
for (j=0;j<width;j++) {
tmp = (long)(*ip++)*ascale;
tmp += (long)(*ip++)*rscale;
tmp += (long)(*ip++)*gscale;
tmp += (long)(*ip++)*bscale;
tmp = (tmp>>8L) + sumbias;
tmp = (tmp>255)?255:((tmp<0)?0:tmp);
*op++ = tmp;
*op++ = tmp;
*op++ = tmp;
*op++ = tmp;
}
break;
default:
// apply to each plane individually
// clamping to the range 0-255
for (j=0;j<width;j++) {
tmp = (((long)(*ip++)*ascale)>>8L)+abias;
*op++ = (tmp>255)?255:((tmp<0)?0:tmp);
tmp = (((long)(*ip++)*rscale)>>8L)+rbias;
*op++ = (tmp>255)?255:((tmp<0)?0:tmp);
tmp = (((long)(*ip++)*gscale)>>8L)+gbias;
*op++ = (tmp>255)?255:((tmp<0)?0:tmp);
tmp = (((long)(*ip++)*bscale)>>8L)+bbias;
*op++ = (tmp>255)?255:((tmp<0)?0:tmp);
}
break;
}
}
break;
default:
// if processing higher dimension than 2D,
// for each lower dimensioned slice, set
// base pointer and recursively call this function
// with decremented dimcount and new base pointers
for (i=0;i<dim[dimcount-1];i++)
{
ip = bip + i*in_minfo->dimstride[dimcount-1];
op = bop + i*out_minfo->dimstride[dimcount-1];
jit_scalebias_calculate_ndim(x,dimcount1,
dim,planecount,in_minfo,ip,out_minfo,op);
}
}
}
Rather than using multidimensional arrays, Jitter matrix data is packed in a single dimensional array, with defined
byte strides for each dimension for greatest flexibility. This permits matrices to reference subregions of larger
matrices, as well as support data that is not tightly packed. Therefore, rather than using multidimensional array
syntax, this code uses pointer arithmetic to access each plane of each cell of the matrix, adding the corresponding
byte strides to the base pointer for each dimension across which it is iterating. These byte strides are stored in the
dimstride entry of the t_jit_matrix_info struct. Note that Jitter requires that planes within a cell, and cells across the
first dimension (dim[0]) are tightly packed. The above code assumes that this is the case, using a simple pointer
increment for each plane and cell, rather than looking up byte strides for dim[0].
In order to use the MOP class in a Max patcher you need to make a Max wrapper class. In addition to the standard
methods used to wrap any Jitter class, MOPs need to add special methods and information to the Max class. One of
the things that needs to happen is that the Max wrapper class needs to allocate and maintain instances of jit.matrix
for each matrix input and output other than the leftmost input, to accommodate Max's asynchronous event model. In
order to perform this maintenance, the Max wrapper class must have special methods and attributes for setting the
type, plane count, dimensions, adaptability, and named references for the internal matrices. All of these messages
are exclusive to the Max wrapper implementation, and are not used by the C, Java, or JavaScript usage of Matrix
Operators. There are also common methods and attributes for the matrix output mode, and the jit_matrix and bang
messages, all of which are specific to the MOP's Max wrapper. These special attributes and methods are added by
the max_jit_classex_mop_wrap() function, which should be called inside your Max external's ext_main() function,
after calling max_jit_classex_setup() and jit_class_findbyname(), and before calling max_jit_classex_standard_←-
wrap(). Several default methods and attributes can be overridden using the various flags that can be combined for
the flags argument to max_jit_classex_mop_wrap(). These flags, which for most simple MOPs won't be necessary,
are listed below.
Inside your Max class' constructor you need to allocate the matrices necessary for the MOP inputs and outputs,
the corresponding matrix inlets and outlets, process matrix arguments and other MOP setup. The max_jit_mop_←-
setup_simple() function takes care of these functions and some of the other necessary tasks of wrapping your Jitter
instance. As such, the use of this function simplifies your Jitter class wrapping even further for the simple case
where no special behavior, incompatible with max_jit_mop_setup_simple() is required. Here is the constructor for
the Max class of the jit.scalebias object.
if (x = (t_max_jit_scalebias *)
max_jit_obex_new(
max_jit_scalebias_class,
gensym("jit_scalebias")))
{
// instantiate Jitter object
if (o=jit_object_new(gensym("jit_scalebias")))
{
// handle standard MOP max wrapper setup tasks
max_jit_mop_setup_simple(x,o,argc,argv);
Below is the listing of the max_jit_mop_setup_simple() function, demonstrating the smaller pieces, it manages for
you. If your object has special requirements, you can use whatever subset of the following function as necessary.
return JIT_ERR_NONE;
}
In your Max class' destructor, you need to free the resources allocated for your MOP. This is accomplished with
the max_jit_mop_free() function, which should be called before you free your internal Jitter instance, and your Max
class' obex data. As an example, the jit.scalebias destructor is listed below.
The purpose of this chapter is to fill in the details of what a Matrix Operator is and how it works.
Matrix data in Jitter is typically considered raw data without respect to what the data represents. This permits simple
fundamental operations to be applied to different sorts of data without needing to know any special information.
For this reason most MOPs are general purpose. The jit.scalebias example from the preceding chapter could
be considered video specific in its terminology, and type and plane count restrictions, but fundamentally it is just
calculating a product and sum on each plane of an incoming matrix. In this chapter, we'll cover the details of how to
configure MOP inputs and outputs, any attribute restrictions or linking for those inputs and outputs, what you must
do in your matrix_calc method and how you expose your MOP to the Max environment, overriding default behavior
if necessary.
As discussed in the Matrix Operator Quick Start, for MOPs you must create an instance of jit_mop with the jit_←-
object_new() function and add it to your Jitter class as an adornment with the jit_class_addadornment() function.
The jit_mop object holds information such as how many inputs and outputs the object has, what types, plane count,
and dimension counts are supported, and how inputs should respond to incoming matrices. This information is
only relevant to wrappers of the Jitter object which actually maintain additional matrices for inputs and outputs, as
is the case with the MOP Max wrapper class. When used from C, Java, or JavaScript, it is the the programmer's
responsibility to pass in matrices that conform to any restrictions imposed by the MOP. An example of instantiating
and adding the jit_mop object is below.
Each instance of jit_mop contains some number of inputs and outputs, specified by the input and output arguments
to the constructor. For each of these inputs and outputs there is an instance of jit_mop_io which records information
specific to that input or output, such as type, plane count, and dimension restrictions. You can access the input or
output objects by calling the getinput or getoutput methods with an integer index argument as below:
input = jit_object_method(mop,_jit_sym_getinput,1);
output = jit_object_method(mop,_jit_sym_getoutput,1);
Once you have obtained references to these inputs or outputs, you may query or set the jit_mop_io attributes.
The attributes typically configured are: types, which is a list of symbols of permitted types, the first of which be-
ing the default; mindim and maxdim, which are the minimum and maximum permitted sizes for each dimension;
90 Matrix Operator Details
mindimcount and maxdimcount, which are the minimum and maximum permitted number of dimensions permitted;
minplanecount and maxplanecount, which are the minimum and maximum number of planes permitted; typelink,
which is the flag that determines if the I/O should change its type to whatever the leftmost incoming matrix is; dim-
link, which is the flag that determines if the I/O should change its dimensions to whatever the leftmost incoming
matrix is; and planelink, which is the flag that determines if the I/O should change its plane count to whatever the
leftmost incoming matrix is.
By default, all types, dimensions and plane count are permitted, and all linking is enabled. If you wish your MOP
to have some specific restrictions, or difference in linking behaviors for any input or output in particular, you can set
the corresponding attributes. For example, to set the plane count to always be four planes, you would set both the
minplanecount and maxplanecount attributes to 4, as below:
output = jit_object_method(mop,_jit_sym_getoutput,1);
jit_attr_setlong(output,_jit_sym_minplanecount,4);
jit_attr_setlong(output,_jit_sym_maxplanecount,4);
The jit.scalebias example could have set the planecount using the minplanecount and maxplanecount attributes
rather than calling the utility function jit_mop_single_planecount(), which internally sets these attributes. A similar
thing could be done to restrict type and dimensions. As for linking, if you wish to develop an object where the right
hand input does not adapt to the size of the leftmost input, as is the case with jit.convolve, you would turn off the
dimlink attribute, as below:
input2 = jit_object_method(mop,_jit_sym_getinput,2);
jit_attr_setlong(input2,_jit_sym_dimlink,0);
Similar could be done to remove type and planecount linking, and the utility functions jit_mop_input_nolink() and
jit_mop_output_nolink() set all of these link attributes to false (zero).
For right hand matrix inputs, incoming data is typically copied by the MOP Max wrapper class. When an incoming
matrix is received by the MOP Max wrapper class, a function called the ioproc is called, and the default ioproc copies
the data, using the current input attributes (which might be linked to the lefthand input). The default ioproc can be
overridden by calling the ioproc method followed by a function with the signature as listed below in the jit_mop_←-
ioproc_copy_adapt() function. The jit_mop_ioproc_copy_adapt() function will always adapt to that inlet's incoming
matrix attributes, as long as they don't conflict with any restrictions. The SDK project for jit.concat demonstrates the
use of the jit_mop_ioproc_copy_adapt() function.
return JIT_ERR_NONE;
}
You can specify variable input/output MOPs with a negative argument for input and/or outputs when constructing
your jit_mop object. When the using variable inputs and/or outputs, there is not a jit_mop_io for each input and/or
output within your class definition, and therefore the template type, dim, planecount, and linking attributes are not
settable. If anything but the default behavior is required, you must accomplished it in another way — for example,
either by overriding the jit_matrix method of the MOP Max wrapper class, or defining an mproc method to be called
from within the standard jit_matrix method of the MOP Max wrapper class. The jit.pack, jit.unpack, jit.scissors, and
jit.glue objects are a few SDK examples of MOPs with variable inputs and outputs. More information on overriding
the jit_matrix, mproc, and other default methods of the MOP Max wrapper class is covered later in this chapter.
Once you have configured all of the inputs and outputs of your jit_mop object, you must add your jit_mop object to
your Jitter class with the jit_class_addadornment() function. Adorments can be queried from the Jitter class at any
time by calling jit_class_adornment_get() with the Jitter class pointer and the class name of the adornment object,
as demonstrated below.
The entry point of the MOP Jitter class is the matrix_calc method, which is passed a list of matrices for the input,
and a list of matrices for the output. It is not the responsibility of the matrix_calc method to perform any copying and
adaptation behavior, but rather simply ensure that the matrices are valid, compatible, and if so, process. Certain
objects may modify the dim, type, or planecount of the output matrices — e.g. the SDK project, jit.thin. However, it is
the calling party's responsibility to perform any copying and conformance to MOP I/O restrictions as defined by the
jit_mop_io objects—i.e. either the Max wrapper class, or the C, Java, or Javascript code which calls the matrix_calc
method.
The input and output lists passed as arguments to your matrix_calc method are Jitter objects, and pointers to the
individual inputs and outputs are acquired by calling the getindex method with an integer argument specifying the
zero based list index. The return values should be tested to make sure they are not null. For example:
} else {
return JIT_ERR_INVALID_PTR;
}
Technically, you can also pass in an instance of jit_matrix in place of a list for the input or output arguments, since
jit_matrix has a getindex method which returns the jit_matrix instance. This is an example of dynamic binding at
work. Another example of dynamic binding inside the matrix_calc method is that the list elements might be instances
of jit_mop_io, rather than instances of jit_matrix. However, since Jitter uses dynamic binding and the jit_mop_←-
io object is a "decorator" class for jit_matrix, all corresponding methods are passed on to the jit_matrix referenced
by the jit_mop_io. In fact, any Jitter objects which respond to the standard interface for jit_matrix could be passed
as inputs or outputs. If this seems confusing, you need not think about the underlying implementation further, but
instead can assume that what is being passed in is simply an instance of jit_matrix. After all it should behave like
one, even if it is not.
Prior to working with a matrix, it is necessary to "lock" it so that the data and attributes will not be changed across
the duration of the operation. This is accomplished by calling the jit_matrix instance's lock method with an integer
argument of 1 (true) to lock the matrix. You should store the current lock state to restore when you're done pro-
cessing. The lock operation should be the first thing to do after ensuring that the matrix objects are not NULL. For
example
out:
// restore matrix lock state to previous value
jit_object_method(out_matrix,_jit_sym_lock,out_savelock);
jit_object_method(in_matrix,_jit_sym_lock,in_savelock);
Once you have locked the matrices, you are ready to find out some information about them. This is accomplished
by calling the getinfo method with a pointer to an instance of the t_jit_matrix_info struct. The t_jit_matrix_info struct
contains several common attributes of the matrix and data organization of the matrix data, and is a useful way
to obtain this information in one call, rather than querying each attribute individually. This information is typically
tested to verify compatibility with any assumptions the matrix_calc method needs to make (since this method might
be called from C, Java, or Javascript, you cannot assume that the MOP Max wrapper will have enforced these
assumptions). It is also used to perform the appropriate pointer arithmetic based on type, plane count, dimensions,
and the byte stride of those dimensions, since higher dimensions may not be tightly packed. The t_jit_matrix_info
struct is listed below:
And here is an example of calling the getinfo method to fill out the t_jit_matrix_info struct:
The t_jit_matrix_info struct is the meta data, but the actual matrix data can be accessed by acquiring the data
pointer. You accomplish this by calling the matrix's getdata method, passing in a pointer to a pointer. This pointer
can be any type, but it is typically a char (or byte) pointer since you may need to perform bytewise pointer arithmetic
depending on the type and dimstride of your matrix. It is essential to verify that this pointer is valid before attempting
to operate on the data, as demonstrated below.
While it is possible to incorporate the data processing code inside the matrix_calc method, it is typical to rely on
other routines to accomplish the N dimensional processing through recursion, potentially dispatching to multiple pro-
cessors. The N-dimensional recursive processing function (typically named myobject_calculate_ndim) is discussed
in the next section. You should pass in to the calculate_ndim function your object pointer, the overall dimension
count, dimension sizes, planecount to consider in your calculation, together with the necessary matrix info structs
and data pointers for each input and output. You can call this method directly as is the case in the following code:
Or you can call this method with the parallel processing utility functions provided with Jitter 1.5 to automatically
dispatch the processing of large matrices across multiple processors when available. This figure illustrates the
dispatching and calculating of the parallel processing utility:
The parallel processing is accomplished by breaking up the matrix into smaller matrices that each reference sub-
regions of the original inputs and outputs. No new objects are created, but rather just additional t_jit_matrix_info
structs and offset data pointers. Jitter 1.5 maintains a pool of worker threads for this purpose, so there is no thread
creation overhead, but rather only some small thread synchronization overhead. Jitter 1.5 only dispatches across
multiple threads when the data count is large enough to justify this thread synchronization overhead.
An important thing worth noting is that if your object performs some kind of spatial operation (e.g. convolution,
rotation, scaling, etc.), you will either need to account for the matrix segmentation used by the parallel utilities or
avoid using parallel processing and call directly in the current thread. Since the jit.scalebias example only processes
one pixel at a time (i.e. a pointwise operation), it is inherently parallelizable, so it takes advantage of multiple
processors as below:
Important Note: If you aren't sure if your object is a pointwise operator, or don't fully understand how to make your
algorithm parallelizable, you shouldn't use the parallel utility functions in your object. You should simply call the
function directly.
In the Matrix Operator Quick Start chapter, we discussed how to define a recursive function to process N-
dimensional data in 2D slices, using the jit.scalebias object as an example. This example was restricted to pro-
cessing four plane char data, but many Jitter objects work with any type of data and any plane count. In order to
support all types and plane counts, there needs to be some case handling to know how to step through the data,
and what type data to interpret as so that you can perform the appropriate operations. There are a number of
ways to approach this logic, and decisions to make with respect to optimization. All this case handling can be a bit
cumbersome, so when initially developing objects, it probably makes sense for you to focus on a single type and
plane count, and only after you've adequately defined your operation, attempt to make your code robust to process
any type of data and consider optimization of certain cases. The use of C macros, or C++ templates might be
useful things to explore for better code re-use. As for code optimization, typically a decent atomic element to try and
optimize is the "innermost" loop, avoiding branch conditions where possible.
This function is at the heart of the logic you will add in your own custom object. Since there is no "right way" to pro-
cess this data, we won't cover any more code listings for the recursive N-dimensional processing function. However,
the SDK projects that are good examples include: jit.clip, which performs a planar independent, pointwise operation
(limiting numbers to some specified range); jit.rgb2luma, which performs a planar dependent, pointwise operation
(converting RGB color to luminance); and jit.transpose, which performs a planar independent, spatial operation
(rows become columns). For more ideas about N-dimensional matrix processing, we would recommend reading
one of the several books available on 2D signal processing and/or image processing. Most of these concepts are
easily generalized to higher dimensions.
MOP Max wrapper classes typically have a large amount of default behavior, as setup through the max_jit_classex←-
_mop_wrap function, based on the jit_mop Jitter class adornment, and user specified flags. You can either override
all of the default behavior or just specific features. If you wish to override all of the default behavior, you can use
the flag MAX_JIT_MOP_FLAGS_OWN_ALL, when calling the max_jit_classex_mop_wrap() function. If you need to
make use of the jit_mop adornment(), the jit_mop can be looked up by calling the jit_class_adornment_get() method
on the Jitter class. The jit_mop_io inputs and outputs can be queried and their attributes inspected, similar to how
they were set in the MOP Jitter class definition, described earlier in this chapter. Here is an example of how to look
up the jit_mop adornment of the jit.scalebias object:
By default, a jit_matrix method is added which automatically manages matrix copying and calculation based on the
incoming data. Most typical MOPs simply use the default jit_matrix method. However there are instances where
it is necessary to override the default MOP method to get special behavior, such as recording which matrix input
data is being input to as is the case for the jit.op SDK example, or to do something other than standard copying
and adaptation as is the case for the jit.pack or jit.str.op SDK examples, or to prevent any jit_matrix method at all,
as is the case for the jit.noise SDK example. To prevent the default jit_matrix method from being defined, you can
use the flag MAX_JIT_MOP_FLAGS_OWN_JIT_MATRIX, when calling the max_jit_classex_mop_wrap() function.
To define your own jit_matrix method, you can add an A_GIMME method bound to the symbol jit_matrix, in your
ext_main() function. Here's an example from jit.op:
The jit.pack and jit.str.op examples are a bit more involved and also better illustrate the kinds of tasks the default
jit_matrix method performs.
A MOP Max wrapper class typically has a bang and outputmatrix method. These two methods are typically equiv-
alent, and by default, both send out the most recently calcuated matrix output. Certain objects that don't have
a matrix output, like the jit.3m SDK example, typcially override these messages with their own bang and some-
times outputmatrix method. These methods can be overridden by using the MAX_JIT_MOP_FLAGS_OWN_BANG
and MAX_JIT_MOP_FLAGS_OWN_OUTPUTMATRIX flags when calling the max_jit_classex_mop_wrap() func-
tion. These flags are typically both passed in together.
For each input and output, other than the leftmost input, there is, by default, an attribute added to query and set that
input or output's matrix attributes, including name, type, dim, and planecount. While overriding the default attribute
behavior is conceivably necessary to perform very specialized behavior, it is not used by any of the SDK examples.
To prevent the addition of the default attributes for name, type, dim, and planecount, you can use the MAX_J←-
IT_MOP_FLAGS_OWN_NAME, MAX_JIT_MOP_FLAGS_OWN_TYPE, MAX_JIT_MOP_FLAGS_OWN_DIM, and
MAX_JIT_MOP_FLAGS_OWN_PLANECOUNT flags when calling the max_jit_classex_mop_wrap() function. To
define your own attributes, you would follow the same means of defining any attributes for a Max wrapper class with
the appropriate attribute name you wish to override.
By default, a clear and a notify method are added. The default clear method clears each of the input and output
matrices. The default notify method, max_jit_mop_notify(), is called whenever any of the matrices maintained by
the MOP are changed. If it is necessary to respond to additional notifications, it is important to call the max_jit←-
_mop_notify function so that the MOP can perform any necessary maintenance with respect to input and output
matrices, as demonstrated by the jit.notify SDK example. These methods can be overridden using the MAX_JI←-
T_MOP_FLAGS_OWN_CLEAR and MAX_JIT_MOP_FLAGS_OWN_NOTIFY flags, respectively, when calling the
max_jit_classex_mop_wrap() function. Object registration and notification is covered in detail in a future chapter,
but the jit.notify notify method is provided as an example.
By default, adapt and outputmode attributes are added to the MOP Max Wrapper. These attributes determine
whether or not to adapt to incoming matrix attributes, and whether or not the output should calculate a new output
matrix, output the last calculated matrix (freeze), pass on the input matrix (bypass). To prevent the addition of the
default attributes for adapt and outputmode, you can use the MAX_JIT_MOP_FLAGS_OWN_ADAPT, and MAX_←-
JIT_MOP_FLAGS_OWN_OUTPUTMODE flags when calling the max_jit_classex_mop_wrap() function. To define
your own attributes, you would follow the same means of defining any attributes for a Max wrapper class with the
appropriate attribute name you wish to override.
For many types of operations, it's not required to fully override the default jit_matrix method and any adaptation.
If your object simply needs to override the way in which the Jitter class' matrix_calc method and outlet functions
are called, you can do so by defining an mproc method, which will be called instead of the default behavior. The
jit.3m SDK project is an example where after it calls the Jitter class' matrix_calc method, it queries the Jitter class'
attributes and outputs max messages rather than the default jit_matrix message output.
As we discussed in the Matrix Operator Quick Start, inside your Max class' constructor you need to allocate the
matrices necessary for the MOP inputs and outputs, the corresponding matrix inlets and outlets, process matrix
arguments and other MOP setup. And in your destructor, you need to free oup MOP resources. Typically you would
accomplish this all with the standard max_jit_mop_setup_simple() and max_jit_mop_free() functions, however there
are some instances where you may need to introduce custom behavior.
m = jit_object_register(m,name);
jit_attr_setsym(p,_jit_sym_matrixname,name);
jit_object_method(p,_jit_sym_matrix,m);
jit_object_attach(name, x);
}
}
return JIT_ERR_NONE;
}
return JIT_ERR_INVALID_PTR;
}
if (x&&(mop=max_jit_obex_adornment_get(x,
_jit_sym_jit_mop)))
{
outcount = jit_attr_getlong(mop,_jit_sym_outputcount);
return JIT_ERR_NONE;
}
return JIT_ERR_INVALID_PTR;
}
The max_jit_mop_setup_simple() function calls max_jit_mop_matrix_args() to read any matrix arguments, and if
present send them to any linked inputs/outputs and disable the adapt attribute. The listing is provided below to
illustrate the default behavior.
if (!(mop=max_jit_obex_adornment_get(x,
_jit_sym_jit_mop)))
return JIT_ERR_GENERIC;
incount = jit_attr_getlong(mop,_jit_sym_inputcount);
outcount = jit_attr_getlong(mop,_jit_sym_outputcount);
jit_matrix_info_default(&info);
attrstart = max_jit_attr_args_offset(argc,argv);
if (attrstart&&argv) {
jit_atom_arg_getlong(&info.planecount, 0, attrstart, argv);
jit_atom_arg_getsym(&info.type, 1, attrstart, argv);
i=2; j=0;
while (i<attrstart) { //dimensions
jit_atom_arg_getlong(&(info.dim[j]), i, attrstart, argv);
i++; j++;
}
if (j) info.dimcount=j;
jit_attr_setlong(mop,_jit_sym_outputmode,1);
for (i=2;i<=incount;i++) {
if ((p=jit_object_method(mop,_jit_sym_getinput,i)) &&
(m=jit_object_method(p,_jit_sym_getmatrix)))
{
jit_object_method(m,_jit_sym_getinfo,&info2);
if (jit_attr_getlong(p,_jit_sym_typelink)) {
info2.type = info.type;
}
if (jit_attr_getlong(p,_jit_sym_planelink)) {
info2.planecount = info.planecount;
}
if (jit_attr_getlong(p,_jit_sym_dimlink)) {
info2.dimcount = info.dimcount;
for (j=0;j<info2.dimcount;j++) {
info2.dim[j] = info.dim[j];
}
}
max_jit_mop_restrict_info(x,p,&info2);
jit_object_method(m,_jit_sym_setinfo,&info2);
}
}
for (i=1;i<=outcount;i++) {
if ((p=jit_object_method(mop,_jit_sym_getoutput,i)) &&
(m=jit_object_method(p,_jit_sym_getmatrix)))
{
jit_object_method(m,_jit_sym_getinfo,&info2);
if (jit_attr_getlong(p,_jit_sym_typelink)) {
info2.type = info.type;
}
if (jit_attr_getlong(p,_jit_sym_planelink)) {
info2.planecount = info.planecount;
}
if (jit_attr_getlong(p,_jit_sym_dimlink)) {
info2.dimcount = info.dimcount;
for (j=0;j<info2.dimcount;j++) {
info2.dim[j] = info.dim[j];
}
}
max_jit_mop_restrict_info(x,p,&info2);
jit_object_method(m,_jit_sym_setinfo,&info2);
}
}
return JIT_ERR_NONE;
}
OB3D QuickStart
The purpose of this chapter is to give a quick and high level overview of how to develop a simple Jitter OpenGL
object which draws geometry within a named rendering context - we refer to such an object as an OB3D.
For this task, we will use the jit.gl.simple SDK example. More details such as how to make an OpenGL object which
deals with resources such as display lists and textures, wishes to support matrix input/output, or needs greater
access to OpenGL state will appear in the following chapter. This chapter assumes familiarity with Jitter's OpenGL
object suite used from the Max patcher, as discussed in the Jitter Tutorial, and the preceding chapters on the Jitter
object model and Max wrapper classes.
Jitter OB3Ds typically are defined to have all or most of the common OB3D attributes and methods discussed in the
Group-OB3D section of the Jitter HTML object reference. These include attributes and methods to set the rendering
destination name, object name, color, lighting, texturing, modelview transform, depth buffering, polygon mode, and
several other common tasks. These common attributes and methods are added by the call to the jit_ob3d_setup()
function in your Jitter class definition, after calling jit_class_new, but typically prior to defining other methods and
attributes. For an OB3D, Jitter needs to store additional information in your object. This information is stored in an
opaque pointer in your object struct, typically named ob3d. The byte offset to your OB3D data pointer is passed into
jit_ob3d_setup(). You can override any default attributes and methods added by jit_ob3d_setup() with the following
flags:
Aside from the attributes and methods added to your class by jit_ob3d_setup(), you need to define a private, untyped
method bound to the symbol ob3d_draw. This method is where your object does all its drawing. It is called by the
standard OB3D draw and drawraw methods. The OB3D draw method sets up all of the OpenGL state associated
with the common OB3D attributes before calling your private ob3d_draw method. The drawraw method simply sets
the context before calling your private ob3d_draw method. Because OB3Ds support being named for use within
jit.gl.sketch∗'s drawobject command, you must also add a private, untyped "register" method associated with the
jit_object_register() function. Let's examine the ∗jit.gl.simple SDK project as an example:
t_jit_err jit_gl_simple_init(void)
100 OB3D QuickStart
{
long ob3d_flags = JIT_OB3D_NO_MATRIXOUTPUT; // no matrix output
void *ob3d;
_jit_gl_simple_class = jit_class_new("jit_gl_simple",
(method)jit_gl_simple_new, (method)jit_gl_simple_free,
sizeof(t_jit_gl_simple),0L);
jit_class_register(_jit_gl_simple_class);
return JIT_ERR_NONE;
}
In your OB3D Jitter Class constructor, you need to pass in your rendering destination name as the first argument.
You should call the jit_ob3d_new() function with your destination name argument to initialize the OB3D data pointer,
associating it with your rendering destination. In your destructor, you need to free your OB3D data pointer with
jit_ob3d_free(). The jit.gl.simple constructor and destructors are below as an example.
Your OB3D draw method, bound to the ob3d_draw symbol, is where all of your drawing code takes place. It is called
automatically when your associated jit.gl.render object receives a bang, if your automatic and enabled attributes
are turned on, as they are by default. It is also called if your Max wrapper object receives a bang, or the draw or
drawraw messages. With the exception of the drawraw message, all of the standard OB3D object state is setup
prior to calling your ob3d_draw method, so you needn't setup things like the modelview transform, color, lighting
properties, texture information, if your object doesn't have special needs. The following example from jit.gl.simple,
just draws a simple quadrilateral.
return result;
}
Since this example is meant only to show a minimal object which draws geometry with standard OpenGL calls,
there is no texture information or vertex normals specified. However, all standard OpenGL calls should work within
the ob3d_draw method. This example also doesn't show matrix output, as accomplished by jit_ob3d_draw_chunk(),
which will be discussed in the following chapter on OB3D details.
For OB3Ds, the Max wrapper class has less extra work than for MOPs. In your Max wrapper class definition, you
need only add a call to the max_ob3d_setup() function to add your standard drawing methods, and the max_jit_←-
ob3d_assist() function as your assist method, unless you wish to define your own custom assist method. Everything
else is similar to the standard technique of wrapping a Jitter Class demonstrated in the Max Wrapper Class chapter.
// wrap Jitter class with the standard methods for Jitter objects
max_jit_classex_standard_wrap(classex, jitclass, 0);
Your Max class' constructor should be similar to the standard Max wrapper constructor, but the differences worth
noting are that you should pass your first normal argument, which is the rendering destination, on to your Jitter
OB3D constructor, and create a second outlet for matrix output, attached to your object's OB3D data. For your de-
structor, there is nothing additional you need to do for OB3D. The jit.gl.simple Max class' constructor and destructor
are provided as examples.
if (x = (t_max_jit_gl_simple *) max_jit_obex_new(
max_jit_gl_simple_class, gensym("jit_gl_simple")))
{
// get first normal arg, the destination name
attrstart = max_jit_attr_args_offset(argc,argv);
if (attrstart&&argv)
{
jit_atom_arg_getsym(&dest_name_sym, 0, attrstart, argv);
}
OB3D Details
The purpose of this chapter is to fill in additional details of Jitter OpenGL, which we refer to as OB3Ds.
We will show how to disable and/or override default OB3D attributes and methods, how to support matrix input
and output, and manage resources such as textures, display lists, and shaders. This chapter assumes familiarity
with the OpenGL API and the OB3D Quick Start chapter. It is out of the scope of our documentation to cover the
OpenGL API, so for information on the OpenGL API we recommend consulting the OpenGL Red Book and the
many online tutorials.
As covered in the OB3D Quick Start, Jitter OB3Ds have a large number of default attributes and methods, and
require some specific methods to be defined. This section seeks to clarify these common attributes and methods
and how to achieve custom behavior where necessary.
All Jitter OB3Ds must define a method bound to the symbol ob3d_draw. This method takes no arguments in addition
to the object struct, and should be defined with the private A_CANT type signature. The private ob3d_draw method
will be called by the standard draw, and drawraw methods that are added to every OB3D. The draw method will set
up OpenGL state associated with the default OB3D attributes before calling ob3d_draw, while the drawraw method
will not.
It is possible for attributes of a Jitter OB3D or your render destination to change, requiring resources to be freed or
rebuilt. There are three methods used to communicate to an OB3D which such events happen so that the OB3D
can manage resources accordingly. They are: dest_closing, which informs an OB3D that the destination is being
freed, and any context dependent resources such as textures, display lists, and shaders should be freed; dest_←-
changed, which informs an OB3D that the destination has been rebuilt, and new resources can be allocated; and
rebuild_geometry, which informs an OB3D of a change in texture units or some other attribute which affects jit_gl_←-
drawinfo_setup() and other t_jit_gl_drawinfo related functions, such as jit_gl_texcoord, requiring geometry that uses
such functions to be rebuilt. These methods take no arguments in addition to the object struct. The dest_closing
and dest_changed methods should be defined with the private A_CANT type signature, and the rebuild_geometry
method is typically defined as typed, but without arguments, so that users have the ability to explicitly call, if deemed
necessary. The jit.gl.gridshape SDK project is a good example of these methods as it needs to free and allocate
a display list as the render destination changes, and also makes use of jit_gl_texcoord to support multi-texturing,
requiring geometry to be rebuilt as the number of texture units or other attributes change.
104 OB3D Details
Since all Jitter OB3D objects are named to support reference by name in jit.gl.sketch, and other objects, it is neces-
sary to add the default registration method, jit_object_register(). Object registration and notification are covered in
detail in a future chapter.
By default, each Jitter OB3D has rotate, rotatexyz, scale, and viewalign attributes added to the class by jit_ob3d_←-
setup(), and these attributes are used in the ob3d_draw_preamble() function to set up OpenGL state prior to calling
your object's draw method. These attributes can be disabled by using the JIT_OB3D_NO_ROTATION_SCALE
flag. You can override these attributes by defining your own attributes of the same name, however, you will need to
manage any necessary OpenGL state inside of your own draw method with the appropriate calls to glMatrixMode,
glTranslate, glRotate, and glScale.
By default, each Jitter OB3D has color, aux_color, and smooth_shading attributes added to the class by jit_←-
ob3d_setup(), and these attributes are used in the ob3d_draw_preamble function prior to calling your object's draw
method. These attributes can be disabled by using the JIT_OB3D_NO_COLOR flag. You can override these
attributes by defining your own attributes of the same name, however, you will need to manage any necessary
OpenGL state inside of your own draw method with the appropriate calls to glColor and glShadeModel.
By default, each Jitter OB3D has texture, capture, tex_map, tex_plane_s, and tex_plane_t attributes added to the
class by jit_ob3d_setup(), and these attributes are used in the ob3d_draw_preamble() function prior to calling your
object's draw method. These attributes can be disabled by using the JIT_OB3D_NO_TEXTURE flag. You can
override these attributes by defining your own attributes of the same name, however, you will need to manage
any necessary OpenGL state inside of your own draw method with the appropriate calls to glEnable, glTexGen,
jit_gl_bindtexture, jit_gl_unbindtexture, jit_gl_begincapture, and jit_gl_endcapture.
By default, each Jitter OB3D has lighting_enable, auto_material, shininess, mat_ambient, mat_diffuse, mat_←-
specular, and mat_emission attributes added to the class by jit_ob3d_setup(), and these attributes are used in the
ob3d_draw_preamble function prior to calling your object's draw method. These attributes can be disabled by using
the JIT_OB3D_NO_LIGHTING_MATERIAL flag. You can override these attributes by defining your own attributes
of the same name, however, you will need to manage any necessary OpenGL state inside of your own draw method
with the appropriate calls to glEnable, glLight, glLightModel, and glMaterial.
By default, each Jitter OB3D has fog and fog_params attributes added to the class by jit_ob3d_setup(), and these
attributes are used in the ob3d_draw_preamble function prior to calling your object's draw method. These attributes
can be disabled by using the JIT_OB3D_NO_FOG flag. You can override these attributes by defining your own
attributes of the same name, however, you will need to manage any necessary OpenGL state inside of your own
draw method with the appropriate calls to glEnable, glHint, and glFog.
By default, each Jitter OB3D has poly_mode, cull_face, point_size, and line_width attributes added to the class by
jit_ob3d_setup(), and these attributes are used in the ob3d_draw_preamble function prior to calling your object's
draw method. These attributes can be disabled by using the JIT_OB3D_NO_POLY_VARS flag. You can override
these attributes by defining your own attributes of the same name, however, you will need to manage any necessary
OpenGL state inside of your own draw method with the appropriate calls to glPolygonMode, glEnable, glCullFace,
glPointSize, and glLineWidth.
By default, each Jitter OB3D has blend_mode and blend_enable attributes added to the class by jit_ob3d_setup(),
and these attributes are used in the ob3d_draw_preamble function prior to calling your object's draw method. These
attributes can be disabled by using the JIT_OB3D_NO_BLEND flag. You can override these attributes by defining
your own attributes of the same name, however, you will need to manage any necessary OpenGL state inside of
your own draw method with the appropriate calls to glEnable and glBlendFunc.
By default, each Jitter OB3D has depth_enable and antialias attributes added to the class by jit_ob3d_setup(), and
these attributes are used in your ob3d_draw_preamble function prior to calling your object's draw method. These
attributes can be disabled by using the JIT_OB3D_NO_DEPTH and JIT_OB3D_NO_ANTIALIAS flags, respectively.
You can override these attributes by defining your own attributes of the same name, however, you will need to
manage any necessary OpenGL state inside of your own draw method with the appropriate calls to glEnable and
glHint.
By default, each Jitter OB3D has matrixoutput and automatic attributes added to the class by jit_ob3d_setup(), and
these attributes are used in the ob3d_draw_preamble function prior to calling your object's draw method. These
attributes can be disabled by using the JIT_OB3D_NO_MATRIXOUTPUT and JIT_OB3D_AUTO_ONLY flags, re-
spectively. You can override these attributes by defining your own attributes of the same name.
It is possible to declare a user interface OB3D, such as jit.gl.handle. To do so, you must use the JIT_OB3D_DO←-
ES_UI flag to jit_ob3d_setup(), and define a method bound to the symbol ob3d_ui, with the private A_CANT type
signature and prototype similar to the following example from jit.gl.handle:
Inside your Jitter class constructor, you must call jit_ob3d_new() with a pointer to your newly allocated object, and
your render destination name. The jit_ob3d_new() function allocates an opaque structure that stores the standard
OB3D attributes and some additional OB3D state, initializing them to default values, and then setting the pointer at
the byte offset specified when calling the jit_ob3d_setup() function in your class definition. If your object supports
matrix output or simply uses the t_jit_glchunk structure when drawing, you should typically allocate your initial
t_jit_glchunk in your constructor using the jit_glchunk_new() or jit_glchunk_grid_new() functions. Use of the t_jit←-
_glchunk structure and matrix output is described later in this chapter. Similarly, your OB3D Jitter class destructor
must call jit_ob3d_free() to free the opaque structure used for common OB3D state, free any allocated instances of
t_jit_glchunk with jit_glchunk_free(), and free any other resources allocated such as display lists or textures.
The ob3d_draw method is where all the drawing in your object should take place. It is also where you should
typically allocate context dependent resources or query the context state, since you know that your context is valid
and has been set. For the most part, the drawing you will perform in your ob3d_draw method will be pure and simple
OpenGL, though there are a few caveats which we will cover.
Since Jitter is a general purpose matrix processing framework, it makes sense that you would have the ability to pass
geometry information through a Jitter network as matrices if your geometry is well suited to a matrix representation.
The cells of your matrix can hold vertex information such as position, texture coordinates, normal vectors, color,
and edge flags, and are documented in the "Geometry Under The Hood" Jitter Tutorial. You also have the option
of specifying a connections matrix to reference the connectivity of the vertices if it is not implicit in the matrix
representation, and a drawing primitive to use when drawing the vertices.
All this information, and whether or not the geometry matrix should be rendered immediately or sent through the
Jitter network is managed with the t_jit_glchunk. An SDK example which demonstrates the use of t_jit_glchunk
is jit.gl.gridshape. The t_jit_glchunk structure along with the vertex matrix it contains is allocated by the jit_←-
glchunk_new() or jit_glchunk_grid_new() functions, freed with the jit_glchunk_delete() function, and drawn with the
jit_ob3d_draw_chunk() function. For reference, the t_jit_glchunk structure and relevant chunk flags are provided
below:
While you can use any standard Open GL calls inside of your ob3d_draw method. There are a few things worth
noting to follow Jitter conventions. The first of which is the binding of texture coordinates. Since Jitter OB3Ds
support multi-texturing by default, it is not necessarily satisfactory to submit only one texture coordinate with gl←-
TexCoord. Jitter provides some utility routines to set the texture coordinates for as many texture units which are
bound, jit_gl_texcoord(1/2/3)(f/fv). Determining how many texture units have been bound by the default OB3D
attributes requires some overhead, so rather than perform this overhead with every jit_gl_texcoord call, the jit_gl←-
_texcoord functions take a t_jit_gl_drawinfo struct as an argument. This struct can be setup once before rendering
many vertices with the jit_gl_drawinfo_setup function. Example use of jit_gl_texcoord and jit_gl_drawinfo_setup is
in the jit.gl.videoplane SDK project. Another Jitter specific mechanism is the means to bind textures using named
instances of jit.gl.texture. It is possible to create and bind your own textures in an OB3D, but you must then perform
all maintenance instead of relying on jit.gl.texture to handle this work for you. To bind and unbind an instance of
jit.gl.texture, you should call the jit_gl_bindtexture and jit_gl_unbindtexture functions, which take a t_jit_gl_drawinfo
argument, a symbol with the name of the jit.gl.texture instance, and an integer for which texture unit to bind. Unlike
binding ordinary textures in OpenGL, it is important to unbind instances of jit.gl.texture, or else problems may arise.
Though the default OB3D attributes are typically relevant to the code which is automatically handled for your object
prior to calling the ob3d_draw method, it is sometimes necessary to access these values. Since the default OB3D
attributes are stored in an opaque ob3d struct member, they are not accessible by your object with a simple struct
pointer dereference. Instead, you need to use the jit_attr_get∗ functions to access these attributes. You should pass
in your object struct as the first argument to these functions rather than your ob3d struct member. For example:
float pos[3];
jit_attr_getfloat_array(x,gensym("position"),3,pos);
Note that if you are acquiring this value often, it is preferable to generate the symbol in advance rather than generate
the symbol for every call.
From within the ob3d_draw, dest_closing, and dest_changed methods, the rendering context has always been
set, and you can get a handle to the native context using either the aglGetCurrentContext or wglGetCurrentContext
functions. One can also in these methods use standard OpenGL glGet∗ functions to determine the context's Open←-
GL state, such as the viewport, transformation matrix. It is not recommended to try and acquire the native context
from other methods, or query the OpenGL state as it may not be valid.
It is important to recognize that OpenGL state is persistent, and that there may be objects which rely on Open←-
GL state that are drawn after your object draws itself. If your object makes any changes to OpenGL state that
might affect objects that follow, you should restore the OpenGL state to whatever it was before your routine was
called. For example, if your object changes the texture transformation matrix, you should push and pop the texture
transformation matrix with glMatrixMode, glPushMatrix, and glPopMatrix, to prevent any problems with other objects.
As mentioned in the OB3D Quick Start, in your Max wrapper class definition, you need only add a call to the
max_ob3d_setup() function to add your standard drawing methods, and the max_jit_ob3d_assist() function as your
assist method, unless you wish to define your own custom assist method. Everything else is similar to the standard
technique of wrapping a Jitter Class demonstrated in the Max Wrapper Class chapter. Please consult the OB3D
Quick Start chapter and the jit.gl.simple SDK project for all necessary information related to the OB3D Max wrapper
class.
Sometimes it is desirable for an OB3D also support incoming matrices as is the case with jit.gl.videoplane or jit.←-
gl.mesh. It is not recommended to mix and match OB3Ds with MOPs. Conflicts arise with respect to arguments,
standard inlets and outlets. Instead, if you wish to support matrix input in your OB3D, you should simply add to your
Jitter class a method bound to the symbol jit_matrix, and handle the incoming matrix data according to your needs
- for example as texture data in the case of jit.gl.videoplane, or geometry data in the case of jit.gl.mesh. The jit.gl.←-
videoplane SDK project provides an example of an OB3D which also supports matrix input. When it is necessary
to have multiple input matrices, this is typically managed by either declaring alternately named methods for each
input, or exposing an attribute that specifies which input the jit_matrix method assumes it is being called with. Note
that this requires additional logic within the Max wrapper class to map to inlets, as it is not handled automatically.
The mechanisms which enforce execution of Jitter drawing and matrix processing from within the low priority queue
we will call "defer" and "usurp". The defer mechanism will take any high priority events and create a corresponding
low priority event at the end of the low priority queue. The defer mechanism ensures that the events will not
be executed from the high priority scheduler thread, but does not prevent scheduler backlog with the temporal
downsampling mentioned above. To accomplish this, the usurp mechanism mush be used. The usurp mechanism
will use no more than one low priority queue element for the task requested (either a method call or attribute setter).
The way usurp works is that if there is no pending event for the method or attribute call, a new event is placed at the
end of the low priority queue. If there is already an event pending, the usurp mechanism will not place a new event
on the end of the low priority queue, but rather "usurp" the arguments for the event waiting to being passed to the
method or attribute call. This way, if a high priority metronome is rapidly sending values to set an attribute, while the
initial low priority event is waiting to be processed, the value to be set is constantly being updated ("usurped") and
only the value at the time of servicing the event will be used.
It is important to note that the defer and usurp mechanisms only work as called from within the Max patcher. For
any methods which are called from a text based programming language, such as C, Java, or JavaScript, the defer
and usurp mechanisms are bypassed. This may be something you need to pay attention to and handle yourself if
you are making such calls from a text based programming language and need the defer or usurp behavior.
When defining a method in Jitter, there is the possibility to define a type signature for the method just as one would
do in Max. Typical type signatures include typical atom elements such as A_LONG, A_FLOAT, and A_SYM; or the
110 Scheduler and Low Priority Queue Issues
corresponding default value versions A_DEFLONG, A_DEFFLOAT, A_DEFSYM; or the variable argument version
A_GIMME which provides a list of atoms and the number of atoms provided; or the private and untyped status
of A_CANT used for methods which are not exposed to the patcher and require additional C function prototype
information in order to call. While these type signatures can be used within Jitter objects, most methods exposed to
the patcher interface make use of either the defer or usurp mechanism as defined by two new type signatures A_←-
DEFER_LOW or A_USURP_LOW. Methods defined with the A_DEFER_LOW, or A_USURP_LOW type signatures
should conform to the same variable argument prototype as A_GIMME methods, but behind the scenes, Jitter will
make use of the defer and usurp mechanism to enforce the appropriate behavior.
An example of two methods from jit.gl.videoplane which use these mechanisms is below:
if ((name=jit_atom_getsym(argv)) != _jit_sym_nothing) {
m = jit_object_findregistered(name);
if (!m) {
error("jit.gl.videoplane: couldn’t get matrix object!");
return;
}
}
if (x->texture) {
jit_object_method(m, _jit_sym_getinfo, &info);
jit_attr_getlong_array(x->texture,_jit_sym_dim,2,dim);
jit_object_method(x->texture,s,s,argc,argv);
jit_attr_setsym(x,ps_texture,x->texturename);
}
}
From inspecting the header files, you may note that there are also A_DEFER and A_USURP type signatures, but
these should be considered obsolete, as they make use of the problematic deferral strategy of placing the event at
the front of the low priority queue and have the potential of reversing message sequencing.
Unlike methods, attributes do not make use of type signatures for their getter and setter accessor methods. Instead
they should always be prototyped similar to A_GIMME, but with an attribute object being passed in place of the
traditional method symbol pointer of the A_GIMME signature. So the way you can specify to use the defer and
usurp mechanisms for attribute accessors are through the attribute flags argument to the attribute constructor. For
the getter accessor method, you can use JIT_ATTR_GET_DEFER_LOW or JIT_ATTR_GET_USURP_LOW flags.
For the setter accessor method, you can use JIT_ATTR_SET_DEFER_LOW or JIT_ATTR_SET_USURP_LOW
flags.
attrflags = JIT_ATTR_GET_DEFER_LOW |
JIT_ATTR_SET_USURP_LOW;
attr = jit_object_new(_jit_sym_jit_attr_offset,"displaylist",
_jit_sym_char,attrflags,
(method)0L,(method)jit_gl_videoplane_displaylist,calcoffset(t_jit_gl_videoplane,
displaylist));
jit_class_addattr(_jit_gl_videoplane_class,attr);
You may have noticed that like previous code example, all Jitter object attributes which are not private have been de-
fined with getter accessors which use the defer mechanism (JIT_ATTR_GET_DEFER_LOW) and setter accessors
which use the usurp mechanism (JIT_ATTR_SET_USURP_LOW). This is the recommended style of exposing Jitter
object attributes to the patcher, since there are many cases where at high priority an attribute is set repeatedly and
we want both the latest high priority value when the next calculation is made at low priority and no low priority queue
backlog from generating more events at high priority than can be processed at low priority. The defer mechanism is
used for getter accessor methods so that every attribute query results in a corresponding output message out the
dump outlet. Otherwise certain patcher logic could easily become confused. If a different behavior is required by
the Max programmer, they can make use of the jit.qball object to force either the defer or usurp mechanisms to be
used for their message stream.
Most of the above is also true when declaring methods and attributes in the Max wrapper object, however the func-
tion calls which are used are slightly different. You must use the special max object function calls max_addmethod←-
_defer_low() and max_addmethod_usurp_low() for methods, and max_jit_classex_addattr() for attributes. Below
are examples from jit.matrixset. Note that there is no type signature provided for either max_addmethod_defer_←-
low() or max_addmethod_usurp_low().
The bang method for Jitter MOP objects uses the usurp mechanism to drop frames when the number of bang
messages cannot be handled in real time. However, jit.gl.render's bang method does not behave this way, and
instead uses the defer mechanism. At first this might seem counterintuitive, however, because rendering in Open←-
GL with jit.gl.render uses a group of messages to perform erasing, any non automatic drawing of objects, and then a
drawing of automatic clients and a swap to the screen with the bang method, it is not an atomic action (i.e. requires a
sequence of different events rather than a single event). Since the usurp mechanism is method or attribute specific
with regard to the events which are being usurped, it only works for atomic actions. For this reason, it is important
for users to perform some drop framing behavior before triggering the message sequence, typically accomplished
with qmetro or jit.qball. If your object has some operation which requires a sequence of events in a similar fashion
as jit.gl.render, then it would be best to use the defer mechanism rather than the usurp mechanism for relevant
methods.
There are instances where the user does not wish to be limited to processing Jitter matrices at low priority, such as
when Jitter matrices are used for tasks other than realtime image processing–for example, parameter interpolation
or matrices containing audio data. For these tasks, the jit.qfaker object is provided for advanced users which are
aware of the potential problems involved in bypassing these low priority mechanisms. As mentioned above, when
programming in a text based language, these mechanisms aren't used and all method and attribute accessor calls
are synchronous. Therefore there typically isn't a need to consider overriding this behavior from a text based
language. However, for certain externals which wish to simulate the jit.qfaker behavior, we expose the max_jit←-
_queuestate() function to override Jitter's detection of queue state for the defer and usurp mechanisms. It is also
possible to query what jitter believes the queue state to be with the max_jit_getqueuestate() function. This is the
function employed by the defer and usurp mechanisms. The source code for these functions is below for reference.
_max_jit_queuestate = (state!=0);
return rv;
}
long max_jit_getqueuestate(void)
{
// always return true if faking
if (_max_jit_queuestate) return 1;
return !sched_isinpoll();
}
In Jitter, matrices are passed around as named references between Max objects.
This named reference is created since Jitter registers these matrices with the corresponding name using the jit_←-
object_register() function. Object registration is useful for a few reasons. First, registered matrices can be resolved
by name using the jit_object_findregistered() function. Secondly, registered objects can sent event notification
to clients who have attached to them using jit_object_attach(). Lastly, under certain circumstances, the object
registration process can be used to have multiple external references to a single instance of an object as is the case
with jit.matrix.
To register an object, one can use the jit_object_register() function, which is equivalent to the Max object_register()
function in the namespace associated with gensym("jitter"). Traditionally in Jitter, we bind jit_object_register() to the
"register" method for an object and use jit_object_method() to call this method. For example, from the jit.notify SDK
example:
If not using a specific name, it is good to use the jit_symbol_unique() function as above to generate a unique name
which is slated for re-use once a registered object is freed. This prevents excess memory usage by the symbol
table as associated with these unique names.
If you wish the object to have multiple references to a single instance with some name, as is common with the
jit.matrix object, it is essential to use the return value of jit_object_register() in any instance where the object pointer
is saved after registration. This is because if the registered object with the same class already exists, the object
attempting to be registered will be freed, and the already registered object of the same class will be returned, its
reference count having been incremented. This is not typically an issue outside of registering jit.matrix objects,
although you may have a need for this type of implementation in other situations. Most other situations in which
object registration is used within Jitter only expects and/or permits a single instance to be registered. In the above
example, we know that this is safe to do, as we are using jit_symbol_unique() to generate a unique name.
It is also possible to unregister named objects, with the jit_object_unregister() function, but typically this is handled
for you when your object is freed, or if your object is registered again with a different name. This is not often used in
the Jitter code base except within these contexts.
114 Jitter Object Registration and Notification
Registered objects can be found by name using the jit_object_findregistered() function. For example named ma-
trices are resolved using this function. Most Matrix Operator objects have this done for them by the default MOP
code, but for example any MOP which has its own jit_matrix method, such as the jit.pack SDK example will make
use of jit_object_findregistered() inside its jit_matrix method:
// make sure that it is a valid pointer and has a "class_jit_matrix" method which returns 1
if (matrix&&jit_object_method(matrix, _jit_sym_class_jit_matrix)) {
...
}
Once an object has been registered, it can be considered a server to which clients attach to be notified of various
events. To attach to a named object, use the the jit_object_attach() function. Similarly to detach from a named
object, use the jit_object_detach() function. It is typical to detach from a server in your object's destructor, or any
time your object is switching which server it is attached to. For your client object to receive any notification from the
server object, it is important for your object to have defined a "notify" method which will receive the notification from
all objects it is attached to.
Below is the jit.notify SDK example's max wrapper object's notify method, which receives some atom values from
its internal Jitter object instance. Since this object is a Matrix Operator, it is important in the following example
that jit.notify calls the max_jit_classex_mop_wrap() function with the MAX_JIT_MOP_FLAGS_OWN_NOTIFY flag
to override the default MOP notify method, and that we pass on all other messages to the standard max_jit_mop←-
_notify() method so that the default MOP code is informed of any changes to the input and output matrices.
If you are making an object which is to be registered, and wish to send custom notification to clients in addition to
the default notification that attributes send to all clients when the attribute is modified, and the default object free
notification, then you will want to use the jit_object_notify() function. This function lets you determine a message
name to use for notification and optionally specify additional, but untyped data to all clients. If you choose to send
additional data to clients, it is necessary for all client code to know how to unpack this information. Below is the
example from the jit.notify SDK example which uses the notification mechanism to send some data to its max
wrapper object:
t_atom foo[3];
jit_atom_setlong(&foo[0],1);
jit_atom_setlong(&foo[1],2);
jit_atom_setlong(&foo[2],3);
jit_object_notify(x,gensym("splat"), foo);
When developing for Jitter in C, the functionality of pre-existing Jitter objects can be used.
In this chapter, we'll briefly examine instantation and incorporation of the features of the jit.movie and jit.qt.record
objects from your C code.
Using an object like t_jit_qt_movie from your own code is fairly straightforward. Since it's a standard Jitter ob-
ject, we can use jit_object_new() and jit_object_free() for instantiation and freeing, jit_object_method() for sending
messages, and jit_attr_get... and jit_attr_set... for getting and setting attributes.
For instance, in the following code snippet, we'll create a t_jit_qt_movie object, read a pre-specified movie from disk,
and decompress its first frame into a matrix, set to the native size of the movie.
void jit_foo_read_first_movie_frame(
t_jit_foo *x, t_symbol *s, long ac, t_atom *av)
{
void *qtmovie;
// check the return value & verify that the movie loaded
if (rvarr = jit_atom_getobj(&rv)) {
long rvac = 0;
t_atom *rvav = NULL;
info.dimcount = 2;
info.dim[0] = dim[0];
info.dim[1] = dim[1];
matrix = jit_object_new(_jit_sym_jit_matrix, &info);
if (matrix) {
// call the t_jit_qt_movie’s matrix_calc method
// with our matrix as an argument
err = (t_jit_err)jit_object_method(qtmovie,
_jit_sym_matrix_calc, NULL, matrix);
if (err != JIT_ERR_NONE) {
error("something went wrong");
}
// do something with the matrix
Naturally, we could also set the t_jit_qt_movie object's time attribute, or call its or frame method, to recall an arbitrary
point in time. In fact, nearly every documented method and attribute of the jit.movie object, as it functions in the Max
interface, is available from C. The exceptions are those functions implemented in the Max wrapper object, such as
framedump.
The Jitter File Format (JXF) stores matrix data in a binary (not human-readable) form.
When using Jitter you can create JXF files by sending the write message to a jit.matrix object. Conversely you can
read JXF files from disk using the read message. This section will cover first the API functions that one can use
from C to read and write JXF files. Then it will break down the file format at the bit level.
Most Jitter users do not need or want to know about the internal binary format of a JXF-file. Even users who want
to read and write JXF-files from C do not need to know the internal details if they use the functions of the Jitter API
for the binary interface. Not only is the API more convenient, but using the functions provided by Cycling '74 may
protect your code from having to be altered in the future in the event of a specification change.
There are two primary functions one should use to read data from a JXF file. jit_bin_read_header() reads the
version number and the size of the file from the header, and has the following signature:
jit_bin_read_matrix() imports matrix data from a file to a matrix, resizing the matrix if necessary, and has the following
signature:
Here’s a chunk of code that shows how to read a matrix from disk:
Similarly there are two functions one should use when writing data to a JXF file. jit_bin_write_header() writes a
header to a file, and has the following signature:
120 JXF File Specification
Here’s a section of code that shows how you might write a file with one matrix. Note that the initial filesize argument
to jit_bin_write_header() is bogus, but that the header is written again at the end of the operation when the filesize
can be determined from the file position after writing the matrix.
The internal format of JXF-files is based on the Interchange File Format (IFF) (http://en.wikipedia.←-
org/wiki/Interchange_File_Format). An IFF file is built up from chunks. All data in IFF files is big-
endian. Several convenience macros defined in jit.byteorder.h are available to help convert numbers to the proper
format before and after they're written to and read from a JXF file: BE_I32() can be called on 32-bit integers,
BE_F32() on 32-bit floats, and BE_F64() on 64-bit doubles.
Each chunk in an IFF file begins with a four character Type ID. This is followed by a 32-bit unsigned integer specifying
the size of the chunk content in bytes. In a JXF file, the 32-bit integer part of the first chunk tells us the size of the
file, and all the subsequent chunks, which begin immediately after the first chunk, contain matrices. In the future
chunks may also be used to store other kinds of data.
Here is a tabular overview of an example minimal JXF file.
Container Chunk
groupID JIT_BIN_CHUNK_CONTAINER ('FORM')
File size 32-bit int
IFF Type JIT_BIN_FORMAT ('JIT!')
Format Chunk
This appendix describes the format of the data sent by a jit.net.send object.
The object attempts to form a TCP connection with a host at the IP and port specified by the object's attributes. Any
program wishing to receive data will therefore have to set itself up as a host and listen for incoming TCP connections.
Once a connection is formed, data can be sent. Data is sent as a stream of chunks. The first thing received will be
a chunk header. It consists of a 32-bit chunk ID and a 32-bit int representing the size of the next chunk to come.
The chunk ID can be one of the following 4-char symbols, depending on what kind of packet it is:
If the chunk is a matrix packet, the next data received will be a header of 288 bytes with the following contents:
id 'JMTX'
Size 288 (32-bit int, size of this header)
Planecount 32-bit int
Type 32-bit int, 0 for char, 1 for long, 2 for float32, 3 for
float64
Dimcount 32-bit int
Dim Array of 32 32-bit ints
Dimstride Array of 32 32-bit ints
Datasize 32-bit int, size of the data buffer to come
Time 64-bit double precision float
This chunk could be represented with the following C struct:
Following this header the next data received will be the matrix data, the size of which was passed in the above
header. When using the data, please note the dimstrides transmitted in the header.
124 Jitter Networking Specification
The time field in the above header will be set to the time of transmission from the sending computer. jit.net.send
expects the server to respond by sending back timing data of its own – it uses this data to estimate the transmission
latency. The exact data in the latency chunk that jit.net.send expects to receive is the following:
id 'JMLP'
client_time_original 64-bit double, the time value received in the matrix
header packet
server_time_before_data 64-bit double, the time on the server when the packet
header is received
server_time_after_data 64-bit double, the time on the server after the packet
has been processed and is in use
The difference between the server time before and server time after processing the data represents the time it
takes the server to mobilize the data after it has been received. jit.net.send will send and expects to receive time
in milliseconds. When this timing information is received by the transmitting computer, it notes its current time,
calculates the round trip time and then estimates the latency as half the round trip time plus half of the server
processing time. This estimate is accurate if the time of flight from A to B is the same as the time of flight from B
to A, but network topology can be very complicated, and often the route from A to B is not the reverse of the route
from B to A. In simple situations, such as a direct connection between two computers or a small LAN, the estimate
should be reasonably accurate.
Finally, the last type of packet that can be sent is the message packet. The size of the message packet is sent in the
initial header packet. Standard A_GIMME messages (t_symbol ∗s, long ac, t_atom ∗av) are serialized starting with
a 32-bit integer that contains the size of the serialized message in bytes. Following that another 32-bit integer gives
the argument count for the atoms. Following that comes the message atoms themselves, starting with the leading
symbol if it exists. Each atom is represented in memory first with a char that indicates what type of atom it is: 's'
for symbol, 'l' for long, and 'f' for float. For long and float atoms, the next 4 bytes contain the value of the atom; for
symbol atoms a null terminated character string follows.
All data is represented with little endian byte ordering.
Below is a C function that will deserialize a message passed in as a data pointer.
if (*curr == ATOM_SERIALIZATION_SYMBOL_CODE)
{
curr++;
*s = gensym(curr);
while (*(++curr) != ’\0’) ;
curr++;
}
else
*s = 0L;
for (i=0;i<*ac;i++)
switch (*curr++)
{
case ATOM_SERIALIZATION_SYMBOL_CODE:
(*av)[i].a_type = A_SYM;
(*av)[i].a_w.w_sym = gensym(curr);
while (*(++curr) != ’\0’) ;
curr++;
break;
case ATOM_SERIALIZATION_FLOAT_CODE:
(*av)[i].a_type = A_FLOAT;
(*av)[i].a_w.w_float = BE_F32(*((float *)curr));
curr += sizeof(float);
break;
case ATOM_SERIALIZATION_LONG_CODE:
(*av)[i].a_type = A_LONG;
(*av)[i].a_w.w_long = BE_I32(*((long *)curr));
curr += sizeof(long);
break;
}
}
When writing objects for Max, you typically think of creating methods which are called when a message is sent to
your object through the object's inlet.
However, your object may receive messages directly from Max rather than using the inlet.
One common example is the "assist" message, which is sent to your object when a user's mouse cursor hovers
over one of your object's inlets or outlets. If your object binds a method to the "assist" message then you will be
able to customize the message that is shown.
This appendix serves as a quick reference for messages that are commonly sent to objects by Max, should they be
implemented by the given object. Where possible, the prototypes given are actual prototypes from example objects
in the SDK rather than abstractions to assist in finding the context for these calls.
notify t_max_err
dbviewer_notify(t_dbviewer ∗x,
t_symbol ∗s, t_symbol ∗msg, void
∗sender, void ∗data);
stdargs t_max_err my_obj(t_dictionary ∗d, when loading an old (Max 3 or 4)
t_symbol ∗s, long argc, t_atom patcher, this will be called prior to
∗argv) your new method. You can then fill
in the dictionary with key/value
pairs from your previous args.
quickref obsolete, this is provided
automatically now
getdrawparams void
uisimp_getdrawparams(t_uisimp
∗x, t_object ∗patcherview,
t_jboxdrawparams ∗params);
mousedown void scripto_ui_mousedown(t_←-
scripto_ui ∗x, t_object
∗patcherview, t_pt pt, long
modifiers);
mouseup void uisimp_mouseup(t_uisimp ∗x,
t_object ∗patcherview, t_pt pt, long
modifiers);
mousedrag void scripto_ui_mousedrag(t_←-
scripto_ui ∗x, t_object
∗patcherview, t_pt pt, long
modifiers);
mouseenter void uisimp_mouseenter(t_uisimp
∗x, t_object ∗patcherview, t_pt pt,
long modifiers);
mouseleave void uisimp_mouseleave(t_uisimp
∗x, t_object ∗patcherview, t_pt pt,
long modifiers);
mousemove void uisimp_mousemove(t_uisimp
∗x, t_object ∗patcherview, t_pt pt,
long modifiers);
paint void pictmeter_paint(t_pictmeter
∗x, t_object ∗patcherview);
edclose void
simpletext_edclose(t_simpletext
∗x, char ∗∗text, long size);
getcelltext void
dbviewer_getcelltext(t_dbviewer
∗x, t_symbol ∗colname, long
index, char ∗text, long maxlen);
newpatcherview void dbviewer_newpatcherview(t←-
_dbviewer ∗x, t_object
∗patcherview);
freepatcherview void dbviewer_freepatcherview(t←-
_dbviewer ∗x, t_object
∗patcherview);
If you are writing user interface objects for Max, it is recommended that you provide an icon for your object.
Providing an icon will allow users to create an instance of your class from the object palette, and improve the user's
experience in other interactions with Max including the Object Defaults inspector.
To see the icons provided by Cycling '74 for objects included in Max, look in the Cycling '74/object-icons folder
installed by Max. You will find a variety of SVG (scalable vector graphics) files for the objects. The files are named
with the same name of the class (as it is defined in your ext_main() function) with which they are associated.
SVG files can be edited in a variety of software applications such as InkScape or Adobe Illustrator. You can also
export SVG files from OmniGraffle on the Mac, which is how the Max's object icons were created.
It is recommended that you distribute your object as a Max Package (see Appendix: SDK changes for Max 7).
Within this package you shoulo place your svg in the 'interfaces' folder.
Adding the svg file will make the icon available to Max for use in some ways. To make your icon appear in Max's
Object Explorer, however, you must create a quick-lookup (or qlookup) entry for your object. If you look in the
Cycling '74/interfaces folder, you should notice some files with names like "obj-qlookup.json" and "doc-qlookup.←-
json". For your object, you should create a similar qlookup file.
For the following example we will assume you have created an object called 'littleuifoo'. For this object we will create
a qlookup called 'littleuifoo-obj-qlookup.json'. The contents of this file will look like this:
{
"littleuifoo": {
"digest": "Little UI Object that does Foo",
"module": "max",
"category": [
"U/I"
],
"palette": {
"category": [
"Interface"
],
"action": "littleuifoo",
"pic": "littleuifoo.svg"
}
}
132 Appendix: Providing Icons for UI Objects
While it is out of the scope of this document to cover many topics related to Jitter development, we suggest the
following resources to better inform your development.
The C Programming Language:
• "The C Programming Language", Kernighan and Ritchie (Prentice Hall, 1988). ISBN: 0131103709
• "A Book on C", Kelly and Pohl (Addison Wesley, 1997). ISBN: 0201183994
• "Handbook of Image and Video Processing", A. Bovik et al. (Academic Press, 2000). ISBN: 0121197921
• "Digital Image Processing", W. K. Pratt (John Wiley and Sons, 2001). ISBN: 0471857661
• "Principles of Digital Image Synthesis", A. S. Glassner (Morgan Kaufmann, 1995). ISBN: 1558602763
Open GL:
Microsoft:
33.1.1 Background
In Max 5 and prior versions, the signal chain for processing audio was compiled by sending all objects in the patcher
a "dsp" message. Objects responding to this message then executed their dsp method, typically adding one of the
object's perform methods to the signal chain.
In Max 6, the signal chain is compiled by first sending objects a "dsp64" message. When your object responds to
this message, you can add your 64-bit audio perform methods. If an object supports the old "dsp" message but not
the "dsp64" message, it then wraps the older 32-bit perform routine with conversion on the inputs and outputs.
This means that the 64-bit engine will work just fine with the older 32-bit objects. However, the conversion comes
with some computational expense. For the best performance your objects should support the 64-bit dsp chain
natively by implementing the "dsp64" message as explained below.
33.1.2 API
As noted, instead of the "dsp" method used by objects for Max 5 and earlier, Max 6 objects implement a "dsp64"
method. This has the same purpose as the original dsp method. One notable difference is that the signals are not
passed to the dsp64 method. This is to allow for the signal that is used to change dynamically at runtime. However,
the relevant info (samplerate, number of signals connected, etc) is passed in.
The main purpose of the dsp64 method is to call back into the audio lib to put perform methods on the dsp chain.
This is done by sending the 'dsp_add64' message to the dspchain object using object_method().
The perform routine is now of type t_perfroutine64, defined in z_dsp.h, and now has a fixed function signature. It
does take a user-defined parameter that is passed back from the call to 'dsp_add64'.
The simplemsp∼ examples in the 'audio' folder of the SDK have been updated for 64-bit audio processing in Max
6. Several projects, including the simplemsp∼ example, demonstrate how to support both 64-bit audio processing
in Max 6 and 32-bit audio processing for compatibility with Max 5.
On the Macintosh platform, Max 6 made the transition from using the Carbon API to using the Cocoa API for
interacting with the Mac OS. In most cases the transition for third-party developers should be seemless. If you are
operating directly using native Carbon calls then your code will need to be updated to Cocoa using Objective-C.
136 Appendix: Updating Externals for Max 6
The most common scenario is where you ask a patcherview for the native window handle with a call such as:
WindowRef viewWindow;
object_method(patcherview, gensym("nativewindow"), (void**)&viewWindow);
In Max 6 this will not work because the returned 'viewWindow' is not the Carbon WindowRef but is instead a Cocoa
NSWindow∗. You may update your code to use Cocoa instead of Carbon, or you may wish to transition more slowly
by continuing to use a WindowRef. Here is an example to assist in obtaining a WindowRef:
34.1 Background
The Max 6.0.x application binary, and the external objects and libraries it uses, are compiled for the i386 processor
architecture. This architecture uses 32-bit memory addressing, meaning that the size of a pointer is 32 bits (or 4
bytes).
Max 6.1 introduces support for the x86_64 (or x64) architecture which uses 64-bit (8 bytes) memory addressing.
Among the benefits are the ability to use more than 2 GB of memory in Max. Additionally, the size of the t_atom is
8-bytes on x64, meaning that double-precision floating pointer numbers can be represented.
For backwards compatibility, Max 6.1 also continues to be distributed as a 32-bit application binary. On the Windows
platform the 32-bit and 64-bit applications are distributed separately, as are the external objects you create for them.
On the Mac platform a Universal Binary (or "FAT" binary) is distributed containing both the 32-bit and 64-bit versions
in the same dynamically-loaded library.
All externals on the Mac remain bundles using the ".mxo" filename extension.
32-bit externals on Windows remain DLLs using the ".mxe" filename extension.
64-bit externals on Windows are still DLLs but use a new ".mxe64" filename extension.
In addition to the change of size in a pointer, there are some additional changes for 64-bit. For example, a "long"
integer for 32-bit targets is 4 bytes on both the Mac and Windows. However, a "long" integer for 64-bit targets is 4
bytes on Windows but 8 bytes (the size of a pointer) on the Mac!
To facilitate cross platform code that is independent of these platform differences, the Max 6.1 API defines some
new types used throughout the SDK.
Types of fixed size:
t_int8
t_uint8
t_int16
t_uint16
t_int32
t_uint32
t_int64
t_uint64
For new objects, you can base projects on those in the new SDK. To update existing projects you will need to make
a few changes to your project settings.
Max 6.1 on the Mac no longer uses the intermediary MaxAPI.framework for linking. Instead, the linking is handled
at runtime and the symbols are checked using special flags to the linker. To update an existing project:
2. update the .xcconfig file on which the project is based with the .xcconfig file in the new Max SDK
3. in your target's build settings find the "Other Linker Flags" and set it to "$(C74_SYM_LINKER_FLAGS)"
4. in your target's build settings find the "Architectures" and set it to "i386 x86_64"
In order to build for x64 with Visual Studio 2008, you must have the "Pro" version. The free "Express" version will
not work. The "Express" versions of Visual Studio 2010 and 2012 do work (2012 is recommended).
Due to bugs in Visual Studio 2008, it is really difficult to update an existing project. Instead, it is recommended to
simply create a new Visual Studio project based on an existing example. For Visual Studio 2008 use the "vcproj"
files. For Visual Studio 2010 and 2012 use the "vcxproj" files.
4. do a find/replace for all instances of the text "dummy" changing it to your object's name
5. open the Visual Studio project and build you can choose either "Win32" or "x64" from the platform drop-down
menu in the IDE
34.3.1 Atoms
Any assumptions in your code about the size of a t_atom or the size of its members should be reviewed. When
setting or getting values to and from atoms you should use the types t_atom_long and t_atom_float as appropriate.
All methods which return a value must return a pointer-sized value, e.g., t_ptr_int, t_ptr_uint, t_max_err, etc.
File access in Max involves several areas subject to either required or suggested update.
A path in Max has traditionally been represented with a short int; it is recommened to now use the new t_filepath
type.
File types in Max are represented using four char codes. Traditionally these have been defined using variables of
type "long", which is now problematic. This is a 4-byte type but the long on the Mac for x64 is 8-bytes. These must
be updated to use the new t_fourcc type.
One of biggest areas we've had to address is the use of the long datatype. The reason for this is that under 64bit
windows a long integer is 32 bits and under 64bit OS X (and Unix), a long is a 64 bit integer.
To assist in this process, we have a the new data types documented above. We'll distinguis these from what we are
calling a "platform long".
This platform long discrepancy can lead to all sorts of problems which are outlined with a brief statement of the
problem scenario, and our recommended fix with types:
Problem: long integers as A_LONG/A_DEFLONG method arguments (this includes your object construc-
tors)
Solution: type your A_LONG/A_DEFLONG methods' function signatures to use the t_atom_long in place of long
Problem: long integers as A_CANT method arguments called only through object_method()
Solution: either redefine your A_CANT method's arguments to t_atom_long, or define your type as A_DIRECT, and
make use of the object_method_direct() macro, passing in a function prototype to the macro (also see under floating
point how this is required for anything which previously was A_CANT with floating point values). Technically many
of these will still work properly due to the nature of how integers are passed on the stack under x64, without any
change, it is still best practice.
Problem: long integers being used to store pointers as integer values either for pointer arithmetic, at-
tributes, or other situations.
Solution: use t_atom_long or even better t_ptr_uint (for pointer sized unsigned integer) or the actual pointer type.
Problem: long integers as four character codes for filetypes (t_fourcc) which applies to locatefile_extended
and path functions and friends
Solution: Use t_foucc inplace of long, for anywhere you are using filetype codes.
Problem: long integers as return values for functions called via object_method()
Solution: These should always return a t_atom_long or other pointer sized integer
Problem: long integers passed as pointers into functions like dictionary_getlong() which are now proto-
typed to take a t_atom_long ∗
Solution: Use a t_atom_long value, and pass a pointer to it. A cast from a platform long ∗to a t_atom_long ∗ is not
safe.
Problem: long integers for performing bitwise manipulation of 32bit floating point values including
byteswapping
Solution: Use t_int32/t_uint32
There are many cases where it is safe to use long integers, and we have continued to use them in our code. Below
are the scenarios where they are okay and in several cases required. This might provide some confusion at some
points, but hopefully it makes the porting process a little bit easier, allowing more code to remain unchanged.
• Attributes defined as _sym_long should remain a platform long. If you need to have a t_atom_long attribute,
you will need to use the new atom_long attribute type. This is probably the most confusing aspect of porting
to 64bit and a very real ambiguity of the word "long". Unfortunately, having to balance the difficulties of porting
with the clarity of API, this is something we felt necessary to do.
• Attribute getters/setters should still use the long type for ac. this is especially important for getters which are
passed a pointer to a platform long in the ac value.
• A_GIMME methods may still use the long type for ac without issues
For A_FLOAT/A_DEFFLOAT function signatures, you should always use double as is currently recommended in
the Max SDK. You should not use the new t_atom_float dataype. (this includes your object constructors)
For A_CANT functions with floating point arguments that currently use object_method(). You will need to use
object_method_direct() or pass in pointers to the floating point values (which is safe as it is a pointer sized integer).
It is no longer possible to pass floats through object_method() or the many functions like it (linklist_methodall(),
hashtab_methodall(), etc.)
Attributes are already defined in terms of their bitsize float32 or float 64. If you wish for your attribute to make use of
the new atom support for double preceision. You will want to change your struct definition, as well as your attribute
constructor to be a double (_sym_float64). There isn't currently a t_atom_float attribute type like we've added for
long.
like Byte/Boolean/Point/etc
Use the t_byte/t_bool/t_point/etc types instead.
The old 32-bit 'dsp' (and perform) methods are no longer supported as of Max 6.1. They must be updated as per
Updating MSP Externals for 64-bit Audio Processing .
• http://www.viva64.com/en/a/0004/
• https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/←-
Cocoa64BitGuide/64BitChangesCocoa/64BitChangesCocoa.html
• https://developer.apple.com/library/mac/#documentation/Carbon/Conceptual/←-
Carbon64BitGuide/OtherAPIChanges/OtherAPIChanges.html
• http://msdn.microsoft.com/en-us/magazine/cc300794.aspx
Prior to Max 7 the entry point for externals was the main() function exported from the dynamic library you create.
Beginning with Max 7 the entry point for externals is called ext_main(). This addresses compatibility problems
with various newer compilers and frees us from the constraints enforced for main() as the standard entry point for
programs.
Objects that do no not define ext_main() will still be loaded using the older main(). Support for ext_main() is also
present in Max 6.1.9.
Max 7 introduces the concept of styles which determine the appearance of UI objects. For attributes of your U←-
I object to map to colors or attributes of a style you need to add the required attribute properties in your class
definition.
See the section on Styles for more information.
144 Appendix: SDK changes for Max 7
Module Documentation
36.1 Attributes
An attribute of an object is a setting or property that tells the object how to do its job.
Data Structures
• struct t_attr
Common attr struct.
Macros
Enumerations
• enum e_max_attrflags {
ATTR_FLAGS_NONE, ATTR_GET_OPAQUE, ATTR_SET_OPAQUE, ATTR_GET_OPAQUE_USER,
ATTR_SET_OPAQUE_USER }
Attribute flags.
Functions
• t_max_err object_attr_setchar_array (void ∗x, t_symbol ∗s, long count, C74_CONST t_uint8 ∗vals)
Sets the value of an attribute, given its parent object and name.
• long object_attr_getfloat_array (void ∗x, t_symbol ∗s, long max, float ∗vals)
Retrieves the value of an attribute, given its parent object and name.
• t_max_err object_attr_setfloat_array (void ∗x, t_symbol ∗s, long count, float ∗vals)
Sets the value of an attribute, given its parent object and name.
• long object_attr_getdouble_array (void ∗x, t_symbol ∗s, long max, double ∗vals)
Retrieves the value of an attribute, given its parent object and name.
• t_max_err object_attr_setdouble_array (void ∗x, t_symbol ∗s, long count, double ∗vals)
Sets the value of an attribute, given its parent object and name.
• long object_attr_getsym_array (void ∗x, t_symbol ∗s, long max, t_symbol ∗∗vals)
Retrieves the value of an attribute, given its parent object and name.
• t_max_err object_attr_setsym_array (void ∗x, t_symbol ∗s, long count, t_symbol ∗∗vals)
Sets the value of an attribute, given its parent object and name.
• t_max_err attr_addfilterset_clip (void ∗x, double min, double max, long usemin, long usemax)
Attaches a clip filter to an attribute.
• t_max_err attr_addfilterset_clip_scale (void ∗x, double scale, double min, double max, long usemin, long
usemax)
Attaches a clip/scale filter to an attribute.
• t_max_err attr_addfilterget_clip (void ∗x, double min, double max, long usemin, long usemax)
Attaches a clip filter to an attribute.
• t_max_err attr_addfilterget_clip_scale (void ∗x, double scale, double min, double max, long usemin, long
usemax)
Attaches a clip/scale filter to an attribute.
• t_max_err attr_addfilter_clip (void ∗x, double min, double max, long usemin, long usemax)
Attaches a clip filter to an attribute.
• t_max_err attr_addfilter_clip_scale (void ∗x, double scale, double min, double max, long usemin, long use-
max)
Attaches a clip/scale filter to an attribute.
• t_max_err attr_addfilterset_proc (void ∗x, method proc)
Attaches a custom filter method to an attribute.
• t_max_err attr_addfilterget_proc (void ∗x, method proc)
Attaches a custom filter method to an attribute.
• void attr_args_dictionary (t_dictionary ∗x, short ac, t_atom ∗av)
Create a dictionary of attribute-name, attribute-value pairs from an array of atoms containing an attribute definition
list.
• void attr_dictionary_process (void ∗x, t_dictionary ∗d)
Set attributes for an object that are defined in a dictionary.
• void attr_dictionary_check (void ∗x, t_dictionary ∗d)
Check that a dictionary only contains values for existing attributes of an object.
• t_max_err object_attr_setparse (t_object ∗x, t_symbol ∗s, C74_CONST char ∗parsestr)
Set an attribute value with one or more atoms parsed from a C-string.
• void ∗ object_new_parse (t_symbol ∗name_space, t_symbol ∗classname, C74_CONST char ∗parsestr)
Create a new object with one or more atoms parsed from a C-string.
• t_max_err object_attr_getjrgba (void ∗ob, t_symbol ∗s, t_jrgba ∗c)
Retrieves the value of a color attribute, given its parent object and name.
• t_max_err object_attr_setjrgba (void ∗ob, t_symbol ∗s, t_jrgba ∗c)
Sets the value of a color attribute, given its parent object and name.
• t_max_err object_attr_get_rect (t_object ∗o, t_symbol ∗name, t_rect ∗rect)
Gets the value of a t_rect attribute, given its parent object and name.
• t_max_err object_attr_set_rect (t_object ∗o, t_symbol ∗name, t_rect ∗rect)
Sets the value of a t_rect attribute, given its parent object and name.
• void object_attr_set_xywh (t_object ∗o, t_symbol ∗attr, double x, double y, double w, double h)
Sets the value of a t_rect attribute, given its parent object and name.
• t_max_err object_attr_getpt (t_object ∗o, t_symbol ∗name, t_pt ∗pt)
Gets the value of a t_pt attribute, given its parent object and name.
• t_max_err object_attr_setpt (t_object ∗o, t_symbol ∗name, t_pt ∗pt)
Sets the value of a t_pt attribute, given its parent object and name.
• t_max_err object_attr_getsize (t_object ∗o, t_symbol ∗name, t_size ∗size)
Gets the value of a t_size attribute, given its parent object and name.
• t_max_err object_attr_setsize (t_object ∗o, t_symbol ∗name, t_size ∗size)
Sets the value of a t_size attribute, given its parent object and name.
• t_max_err object_attr_getcolor (t_object ∗b, t_symbol ∗attrname, t_jrgba ∗prgba)
Gets the value of a t_jrgba attribute, given its parent object and name.
• t_max_err object_attr_setcolor (t_object ∗b, t_symbol ∗attrname, t_jrgba ∗prgba)
Sets the value of a t_jrgba attribute, given its parent object and name.
An attribute of an object is a setting or property that tells the object how to do its job.
For example, the metro object has an interval attribute that tells it how fast to run.
Attributes are similar to methods, except that the attributes have a state. Attributes are themselves objects, and they
share a common interface for getting and setting values.
An attribute is most typically added to the class definition of another object during it's class initialization or ext_←-
main() function. Most typically, this attribute's value will be stored in an instance's struct, and thus it will serve as a
property of that instance of the object.
Attributes can, however, be declared as 'class static'. This means that the property is shared by all instances of the
class, and the value is stored as a shared (static) variable.
Additionally, Max 5 has introduced the notion of 'instance attributes' (also called 'object attributes'). Instance at-
tributes are the creation of an attribute object, and then adding it to one specific instance of another class.
Finally, because attributes themselves are Max objects they too can possess attributes. These 'attributes of at-
tributes' are used in Max to do things like specify a range of values for an attribute, give an attribute human friendly
caption, or determine to what category an attribute should belong in the inspector.
The easiest and most common way of working with attributes is to use the provided macros. These macros simplify
the process of creating a new attribute object, setting any attributes of the attribute, and binding it to an object class
or an object instance.
By default, Max provides standard attribute accessors. These are the functions the get or set the attribute value in
the object's struct. If you need to define a custom accessor, you can specify this information using the CLASS_A←-
TTR_ACCESSORS macro.
If you need to define a custom accessor, it should have a prototype and form comparable to the following custom
getter:
} else {
//otherwise allocate memory
*ac = 1;
if (!(*av = getbytes(sizeof(t_atom)*(*ac)))) {
*ac = 0;
return MAX_ERR_OUT_OF_MEM;
}
}
atom_setfloat(*av,x->myval);
return MAX_ERR_NONE;
}
Note that getters require memory to be allocated, if there is not memory passed into the getter. Also the attr
argument is the class' attribute object and can be queried using object_method for things like the attribute flags,
names, filters, etc..
If you need to define a custom accessor, it should have a prototype and form comparable to the following custom
setter:
Although the subject of object registration and notification is covered elsewhere, it bears noting that attributes of all
types will, if registered, automatically send notifications to all attached client objects each time the attribute's value
is set.
Parameters
c The class pointer.
attrname The name of the attribute as a C-string.
flags Any flags you wish to add to this attribute, as defined in e_max_attrflags.
structname The C identifier for the struct (containing a valid t_object header) representing an instance of
this class.
structmember The C identifier of the member in the struct that holds the value of this attribute.
Add a new attribute to the specified attribute to specify that it should appear in the inspector's Basic tab.
Parameters
c The class pointer.
attrname The name of the attribute as a C-string.
flags Any flags you wish to declare for this new attribute, as defined in e_max_attrflags.
Referenced by jit_ob3d_setup().
Add a new attribute to the specified attribute to specify a category to which the attribute is assigned in the Max
inspector.
Categories are represented in the inspector as tabs. If the specified category does not exist then it will be created.
Parameters
c The class pointer.
attrname The name of the attribute as a C-string.
flags Any flags you wish to declare for this new attribute, as defined in e_max_attrflags.
parsestr A C-string, which will be parsed into an array of atoms to set the initial value.
Parameters
c The class pointer.
attrname The name of the attribute as a C-string.
flags Any flags you wish to declare for this new attribute, as defined in e_max_attrflags.
parsestr A C-string, which will be parsed into an array of atoms to set the initial value.
See also
CLASS_ATTR_DEFAULT
CLASS_ATTR_PAINT
See also
CLASS_ATTR_DEFAULT
CLASS_ATTR_SAVE
See also
CLASS_ATTR_DEFAULT
CLASS_ATTR_PAINT
CLASS_ATTR_SAVE
Add a new attribute to the specified attribute to specify a default value, based on Max's Object Defaults.
If a value is present in Max's Object Defaults, then that value will be used as the default value. Otherwise, use the
default value specified here. The default value will be automatically set when the object is created only if your object
uses a dictionary constructor with the CLASS_FLAG_NEWDICTIONARY flag.
Parameters
c The class pointer.
attrname The name of the attribute as a C-string.
flags Any flags you wish to declare for this new attribute, as defined in e_max_attrflags.
parsestr A C-string, which will be parsed into an array of atoms to set the initial value.
See also
CLASS_ATTR_DEFAULTNAME
CLASS_ATTR_PAINT
CLASS_ATTR_SAVE
See also
CLASS_ATTR_DEFAULTNAME
CLASS_ATTR_SAVE
See also
CLASS_ATTR_DEFAULTNAME
CLASS_ATTR_PAINT
CLASS_ATTR_SAVE
structmember The C identifier of the member in the struct that holds the value of this attribute.
sizemember The actual number of items in the double array at any given moment.
maxsize The maximum number of items in the double array, i.e. the number of members allocated for
the array in the struct.
Add a new attribute to the specified attribute to specify a list of choices to display in a menu for the Max inspector.
Parameters
c The class pointer.
attrname The name of the attribute as a C-string.
flags Any flags you wish to declare for this new attribute, as defined in e_max_attrflags.
parsestr A C-string, which will be parsed into an array of atoms to set the initial value.
Remarks
1 CLASS_ATTR_STYLE(c,attrname,flags,"enum").
See also
CLASS_ATTR_ENUMINDEX
Referenced by jit_ob3d_setup().
Add a new attribute to the specified attribute to specify a list of choices to display in a menu for the Max inspector.
Parameters
c The class pointer.
attrname The name of the attribute as a C-string.
flags Any flags you wish to declare for this new attribute, as defined in e_max_attrflags.
parsestr A C-string, which will be parsed into an array of atoms to set the initial value.
Remarks
1 CLASS_ATTR_STYLE(c,attrname,flags,"enumindex").
See also
CLASS_ATTR_ENUM
Add a filter to the attribute to limit both the lower and upper bounds of a value.
The limiting will be performed by the default attribute accessor.
Parameters
c The class pointer.
attrname The name of the attribute as a C-string.
minval The maximum acceptable value to which the attribute will be limited.
maxval The maximum acceptable value to which the attribute will be limited.
See also
See also
CLASS_ATTR_FILTER_MIN
CLASS_ATTR_FILTER_CLIP
CLASS_ATTR_MAX
See also
CLASS_ATTR_FILTER_MAX
CLASS_ATTR_FILTER_CLIP
CLASS_ATTR_MIN
Add a new attribute to the specified attribute to indicate in which version the attribute was introduced.
Parameters
c The class pointer.
attrname The name of the attribute as a C-string.
flags Any flags you wish to declare for this new attribute, as defined in e_max_attrflags.
versionstr A C-string, which will be parsed set the version number (e.g. "7.0.0").
Add a new attribute to the specified attribute to flag an attribute as invisible to the Max inspector.
Parameters
c The class pointer.
attrname The name of the attribute as a C-string.
flags Any flags you wish to declare for this new attribute, as defined in e_max_attrflags.
Add a new attribute to the specified attribute to specify an a human-friendly label for the Max inspector.
Parameters
c The class pointer.
attrname The name of the attribute as a C-string.
flags Any flags you wish to declare for this new attribute, as defined in e_max_attrflags.
labelstr A C-string, which will be parsed into an array of atoms to set the initial value.
Add a new attribute to the specified attribute to specify a legacy default value.
The default value will be automatically set when the object is created only if your object uses a dictionary constructor
with the CLASS_FLAG_NEWDICTIONARY flag.
Parameters
c The class pointer.
legacyattrname The name of the attribute.
newattrname The name of the attribute.
flags Any flags you wish to declare for this new attribute, as defined in e_max_attrflags.
parsestr A C-string, which will be parsed into an array of atoms to set the legacy value, used by
jbox_processlegacydefaults()
flags Any flags you wish to declare for this attribute, as defined in e_max_attrflags.
structname The C identifier for the struct (containing a valid t_object header) representing an instance of
this class.
structmember The C identifier of the member in the struct that holds the value of this attribute.
See also
CLASS_ATTR_MIN
CLASS_ATTR_FILTER_MAX
CLASS_ATTR_FILTER_CLIP
See also
CLASS_ATTR_MAX
CLASS_ATTR_FILTER_MAX
CLASS_ATTR_FILTER_CLIP
Add a new attribute to the specified attribute to specify a default order in which to list attributes.
Parameters
c The class pointer.
attrname The name of the attribute as a C-string.
flags Any flags you wish to declare for this new attribute, as defined in e_max_attrflags.
parsestr A C-string, which will be parsed into an array of atoms to set the initial value.
Remarks
A value of zero indicates that there is no ordering. Ordering values begin at 1. For example:
Add a new attribute indicating that any changes to the specified attribute will trigger a call to the object's paint
method.
Parameters
c The class pointer.
attrname The name of the attribute as a C-string.
flags Any flags you wish to declare for this new attribute, as defined in e_max_attrflags.
Parameters
c The class pointer.
attrname The name of the attribute as a C-string.
flags Any flags you wish to remove from this attribute, as defined in e_max_attrflags.
Add a new attribute to the specified attribute to indicate that the specified attribute should be saved with the patcher.
Parameters
c The class pointer.
attrname The name of the attribute as a C-string.
flags Any flags you wish to declare for this new attribute, as defined in e_max_attrflags.
Add a new attribute to the specified attribute to indicate that it is saved by the object (so it does not appear in italics
in the inspector).
Parameters
c The class pointer.
attrname The name of the attribute as a C-string.
flags Any flags you wish to declare for this new attribute, as defined in e_max_attrflags.
Add a new attribute to the specified attribute to specify an editor style for the Max inspector.
• "enum" : a menu of available choices, whose symbol will be passed upon selection
• "enumindex" : a menu of available choices, whose index will be passed upon selection
Parameters
c The class pointer.
attrname The name of the attribute as a C-string.
flags Any flags you wish to declare for this new attribute, as defined in e_max_attrflags.
parsestr A C-string, which will be parsed into an array of atoms to set the initial value.
See also
CLASS_ATTR_STYLE
CLASS_ATTR_LABEL
structmember The C identifier of the member in the struct that holds the value of this attribute.
Remarks
Referenced by jit_ob3d_setup().
Add a new attribute to the specified method to indicate in which version the method was introduced.
Parameters
c The class pointer.
methodname The name of the method as a C-string.
flags Any flags you wish to declare for this new attribute, as defined in e_max_attrflags.
versionstr A C-string, which will be parsed set the version number (e.g. "7.0.0").
Remarks
The most common use of CLASS_STICKY_ATTR is for creating multiple attributes with the same category,
as in this example:
1 CLASS_STICKY_ATTR(c, "category", 0, "Foo");
2
3 CLASS_ATTR_DOUBLE(c, "bar", 0, t_myobject, x_bar);
4 CLASS_ATTR_LABEL(c, "bar", 0, "A Bar");
5
6 CLASS_ATTR_CHAR(c, "switch", 0, t_myobject, x_switch);
7 CLASS_ATTR_STYLE_LABEL(c, "switch", 0, "onoff", "Bar Switch");
8
9 CLASS_ATTR_DOUBLE(c, "flow", 0, t_myobject, x_flow);
10 CLASS_ATTR_LABEL(c, "flow", 0, "Flow Amount");
11
12 CLASS_STICKY_ATTR_CLEAR(c, "category");
See also
CLASS_STICKY_ATTR_CLEAR
See also
CLASS_STICKY_ATTR
Remarks
The most common use of CLASS_STICKY_ATTR is for creating multiple attributes with the same category,
as in this example:
1 CLASS_STICKY_METHOD(c, "undocumented", 0, "1");
2
3 // add some methods here with class_addmethod()
4 // the undocumented attribute for methods means that the ref-page
5 // generator will ignore these methods.
6
7 CLASS_STICKY_METHOD_CLEAR(c, "undocumented");
See also
CLASS_STICKY_METHOD_CLEAR
See also
CLASS_STICKY_METHOD
Parameters
x The object pointer.
attrname The name of this attribute as a C-string.
flags Any flags you wish to declare for this attribute, as defined in e_max_attrflags.
val Pointer to the value.
Create an instance-local array-of-atoms attribute of fixed length, and add it to the object.
Parameters
x The object pointer.
attrname The name of this attribute as a C-string.
flags Any flags you wish to declare for this attribute, as defined in e_max_attrflags.
count The number of items in the t_atom array.
vals Pointer to the values.
Create an instance-local array-of-chars attribute of fixed length, and add it to the object.
Parameters
x The object pointer.
attrname The name of this attribute as a C-string.
flags Any flags you wish to declare for this attribute, as defined in e_max_attrflags.
count The number of items in the char array.
vals Pointer to the values.
parsestr A C-string, which will be parsed into an array of atoms to set the initial value.
See also
CLASS_ATTR_DEFAULT
See also
CLASS_ATTR_DEFAULT_SAVE
Create an instance-local array-of-64bit-floats attribute of fixed length, and add it to the object.
Parameters
x The object pointer.
attrname The name of this attribute as a C-string.
flags Any flags you wish to declare for this attribute, as defined in e_max_attrflags.
count The number of items in the double array.
vals Pointer to the values.
Create an instance-local array-of-32bit-floats attribute of fixed length, and add it to the object.
Parameters
x The object pointer.
attrname The name of this attribute as a C-string.
flags Any flags you wish to declare for this attribute, as defined in e_max_attrflags.
count The number of items in the float array.
vals Pointer to the values.
Create an instance-local array-of-long-integers attribute of fixed length, and add it to the object.
Parameters
x The object pointer.
attrname The name of this attribute as a C-string.
flags Any flags you wish to declare for this attribute, as defined in e_max_attrflags.
count The number of items in the long array.
vals Pointer to the values.
Create an instance-local array-of-objects attribute of fixed length, and add it to the object.
Parameters
x The object pointer.
attrname The name of this attribute as a C-string.
flags Any flags you wish to declare for this attribute, as defined in e_max_attrflags.
count The number of items in the t_object∗ array.
vals Pointer to the values.
See also
CLASS_ATTR_SAVE
Create an instance-local array-of-symbols attribute of fixed length, and add it to the object.
Parameters
x The object pointer.
attrname The name of this attribute as a C-string.
flags Any flags you wish to declare for this attribute, as defined in e_max_attrflags.
count The number of items in the t_symbol∗ array.
vals Pointer to the values.
Parameters
c The class pointer.
flags Any flags you wish to declare for this attribute, as defined in e_max_attrflags.
structname The C identifier for the struct (containing a valid t_object header) representing an instance of
this class.
structmember The C identifier of the member in the struct that holds the value of this attribute.
The name of the attribute is automatically determined by the name of the struct member.
Parameters
c The class pointer.
flags Any flags you wish to declare for this attribute, as defined in e_max_attrflags.
structname The C identifier for the struct (containing a valid t_object header) representing an instance of
this class.
structmember The C identifier of the member in the struct that holds the value of this attribute.
size The number of items in the double array.
Parameters
c The class pointer.
flags Any flags you wish to declare for this attribute, as defined in e_max_attrflags.
structname The C identifier for the struct (containing a valid t_object header) representing an instance of
this class.
structmember The C identifier of the member in the struct that holds the value of this attribute.
sizemember The actual number of items in the long array at any given moment.
maxsize The maximum number of items in the long array, i.e. the number of members allocated for
the array in the struct.
sizemember The actual number of items in the t_object∗ array at any given moment.
maxsize The maximum number of items in the t_object∗ array, i.e. the number of members allocated
for the array in the struct.
Attribute flags.
Remarks
To create a readonly attribute, for example, you should pass ATTR_SET_OPAQUE or ATTR_SET_OPAQ←-
UE_USER as a flag when you create your attribute.
Enumerator
ATTR_FLAGS_NONE No flags.
ATTR_GET_OPAQUE The attribute cannot be queried by either max message when used inside of a CLA←-
SS_BOX object, nor from C code.
ATTR_SET_OPAQUE The attribute cannot be set by either max message when used inside of a CLASS_←-
BOX object, nor from C code.
ATTR_GET_OPAQUE_USER The attribute cannot be queried by max message when used inside of a CL←-
ASS_BOX object, but can be queried from C code.
ATTR_SET_OPAQUE_USER The attribute cannot be set by max message when used inside of a CLASS←-
_BOX object, but can be set from C code.
36.1.6.1 t_max_err attr_addfilter_clip ( void ∗ x, double min, double max, long usemin, long usemax )
Returns
This function returns the error code MAX_ERR_NONE if successful, or one of the other error codes defined
in e_max_errorcodes if unsuccessful.
36.1.6.2 t_max_err attr_addfilter_clip_scale ( void ∗ x, double scale, double min, double max, long usemin, long usemax )
Returns
This function returns the error code MAX_ERR_NONE if successful, or one of the other error codes defined
in e_max_errorcodes if unsuccessful.
36.1.6.3 t_max_err attr_addfilterget_clip ( void ∗ x, double min, double max, long usemin, long usemax )
Returns
This function returns the error code MAX_ERR_NONE if successful, or one of the other error codes defined
in e_max_errorcodes if unsuccessful.
36.1.6.4 t_max_err attr_addfilterget_clip_scale ( void ∗ x, double scale, double min, double max, long usemin, long
usemax )
Returns
This function returns the error code MAX_ERR_NONE if successful, or one of the other error codes defined
in e_max_errorcodes if unsuccessful.
Parameters
x Pointer to the attribute to receive the filter
proc A filter method
Returns
This function returns the error code MAX_ERR_NONE if successful, or one of the other error codes defined
in e_max_errorcodes if unsuccessful.
Remarks
The filter method should be prototyped and implemented as described above for the attr_addfilterset_proc()
function.
36.1.6.6 t_max_err attr_addfilterset_clip ( void ∗ x, double min, double max, long usemin, long usemax )
Returns
This function returns the error code MAX_ERR_NONE if successful, or one of the other error codes defined
in e_max_errorcodes if unsuccessful.
36.1.6.7 t_max_err attr_addfilterset_clip_scale ( void ∗ x, double scale, double min, double max, long usemin, long usemax
)
Returns
This function returns the error code MAX_ERR_NONE if successful, or one of the other error codes defined
in e_max_errorcodes if unsuccessful.
Returns
This function returns the error code MAX_ERR_NONE if successful, or one of the other error codes defined
in e_max_errorcodes if unsuccessful.
Remarks
Create a dictionary of attribute-name, attribute-value pairs from an array of atoms containing an attribute definition
list.
Parameters
x A dictionary instance pointer.
ac The number of atoms to parse in av.
av A pointer to the first of the array of atoms containing the attribute values.
Remarks
The code example below shows the creation of a list of atoms using atom_setparse(), and then uses that list
of atoms to fill the dictionary with attr_args_dictionary().
1 long ac = 0;
2 t_atom *av = NULL;
3 char parsebuf[4096];
4 t_dictionary *d = dictionary_new();
5 t_atom a;
6
7 sprintf(parsebuf,"@defrect %.6f %.6f %.6f %.6f @title Untitled @presentation 0 ", r->x, r->y, r->width,
r->height);
8 atom_setparse(&ac, &av, parsebuf);
9 attr_args_dictionary(d, ac, av);
10 atom_setobj(&a, d);
Parameters
ac The count of t_atoms in av
av An atom list
Returns
This function returns an offset into the atom list, where the first attribute argument occurs. For instance, the
atom list foo bar 3.0 @mode 6 would cause attr_args_offset to return 3 (the attribute mode
appears at position 3 in the atom list).
Referenced by max_jit_attr_args_offset().
Takes an atom list and properly set any attributes described within.
This function is typically used in an object's new method to conveniently process attribute arguments.
Parameters
x The object whose attributes will be processed
ac The count of t_atoms in av
av An atom list
Remarks
Check that a dictionary only contains values for existing attributes of an object.
If a key in the dictionary doesn't correspond an one of the object's attributes, an error will be posted to the Max
window.
Parameters
x The object instance pointer.
d The dictionary containing the attributes.
See also
attr_dictionary_process()
See also
attr_args_process()
36.1.6.14 t_object∗ attr_offset_array_new ( C74_CONST char ∗ name, t_symbol ∗ type, long size, long flags, method
mget, method mset, long offsetcount, long offset )
Returns
This function returns the new attribute's object pointer if successful, or NULL if unsuccessful.
Remarks
For instance, to create a new attribute which references an array of 10 t_atoms (atm; the current number of
"active" elements in the array is held in the variable atmcount) in an object class's data structure:
1 t_object *attr = attr_offset_array_new("myattrarray", _sym_atom / * matches data size * /, 10 / * max * /,
0 / * no flags * /, (method)0L, (method)0L, calcoffset(t_myobject, atmcount) / * count * /,
calcoffset(t_myobject, atm) / * data * /);
Referenced by ext_main().
36.1.6.15 t_object∗ attr_offset_new ( C74_CONST char ∗ name, C74_CONST t_symbol ∗ type, long flags, C74_CONST
method mget, C74_CONST method mset, long offset )
Returns
This function returns the new attribute's object pointer if successful, or NULL if unsuccessful.
Remarks
For instance, to create a new attribute which references the value of a double variable (val) in an object
class's data structure:
Referenced by ext_main().
36.1.6.16 t_object∗ attribute_new ( C74_CONST char ∗ name, t_symbol ∗ type, long flags, method mget, method mset
)
Parameters
name A name for the attribute, as a C-string
type A t_symbol ∗ representing a valid attribute type. At the time of this writing, the valid type-
symbols are: _sym_char (char), _sym_long (long), _sym_float32 (32-bit float), ←-
_sym_float64 (64-bit float), _sym_atom (Max t_atom pointer), _sym_symbol (Max
t_symbol pointer), _sym_pointer (generic pointer) and _sym_object (Max t_object
pointer).
flags Any attribute flags, expressed as a bitfield. Attribute flags are used to determine if an attribute
is accessible for setting or querying. The available accessor flags are defined in e_max_←-
attrflags.
mget The method to use for the attribute's get functionality. If mget is NULL, the default method
is used.
mset The method to use for the attribute's set functionality. If mset is NULL, the default method
is used.
Returns
This function returns the new attribute's object pointer if successful, or NULL if unsuccessful.
Remarks
Developers wishing to define custom methods for get or set functionality need to prototype them as:
Implementation will vary, of course, but need to follow the following basic models. Note that, as with cus-
tom getvalueof and setvalueof methods for the object, assumptions are made throughout Max that
getbytes() has been used for memory allocation. Developers are strongly urged to do the same:
Returns
This function returns the error code MAX_ERR_NONE if successful, or one of the other error codes defined
in e_max_errorcodes if unsuccessful.
Returns
Gets the value of a t_rect attribute, given its parent object and name.
Do not use this on a jbox object – use jbox_get_rect_for_view() instead!
Parameters
o The attribute's parent object
name The attribute's name
rect The address of a valid t_rect whose values will be filled-in from the attribute.
Returns
This function returns the error code MAX_ERR_NONE if successful, or one of the other error codes defined
in e_max_errorcodes if unsuccessful.
Retrieves the value of an attribute, given its parent object and name.
This function uses a developer-allocated array to copy data to. Developers wishing to retrieve the value of an
attribute without pre-allocating memory should refer to the object_attr_getvalueof() function.
Parameters
x The attribute's parent object
s The attribute's name
max The number of array elements in vals. The function will take care not to overwrite the
bounds of the array.
vals Pointer to the first element of a pre-allocated array of unsigned char data.
Returns
Remarks
If the attribute is not of the type specified by the function, the function will attempt to coerce a valid value from
the attribute.
Referenced by jit_attr_getchar_array().
Gets the value of a t_jrgba attribute, given its parent object and name.
Parameters
b The attribute's parent object
attrname The attribute's name
prgba The address of a valid t_jrgba whose values will be filled-in from the attribute.
Returns
This function returns the error code MAX_ERR_NONE if successful, or one of the other error codes defined
in e_max_errorcodes if unsuccessful.
Retrieves the value of an attribute, given its parent object and name.
This function uses a developer-allocated array to copy data to. Developers wishing to retrieve the value of an
attribute without pre-allocating memory should refer to the object_attr_getvalueof() function.
Parameters
x The attribute's parent object
s The attribute's name
max The number of array elements in vals. The function will take care not to overwrite the
bounds of the array.
vals Pointer to the first element of a pre-allocated array of double data.
Returns
Remarks
If the attribute is not of the type specified by the function, the function will attempt to coerce a valid value from
the attribute.
Referenced by jit_attr_getdouble_array().
Forces a specified object's attribute to send its value from the object's dumpout outlet in the Max interface.
Parameters
x Pointer to the object whose attribute is of interest
s The attribute's name
argc Unused
argv Unused
Retrieves the value of an attribute, given its parent object and name.
Parameters
x The attribute's parent object
s The attribute's name
Returns
This function returns the value of the specified attribute, if successful, or 0, if unsuccessful.
Remarks
If the attribute is not of the type specified by the function, the function will attempt to coerce a valid value from
the attribute.
Referenced by jit_attr_getfloat().
Retrieves the value of an attribute, given its parent object and name.
This function uses a developer-allocated array to copy data to. Developers wishing to retrieve the value of an
attribute without pre-allocating memory should refer to the object_attr_getvalueof() function.
Parameters
x The attribute's parent object
s The attribute's name
max The number of array elements in vals. The function will take care not to overwrite the
bounds of the array.
vals Pointer to the first element of a pre-allocated array of float data.
Returns
Remarks
If the attribute is not of the type specified by the function, the function will attempt to coerce a valid value from
the attribute.
Referenced by jit_attr_getfloat_array().
Retrieves the value of a color attribute, given its parent object and name.
Parameters
ob The attribute's parent object
s The attribute's name
c The address of a t_jrgba struct that will be filled with the attribute's color component values.
Returns
This function returns the error code MAX_ERR_NONE if successful, or one of the other error codes defined
in e_max_errorcodes if unsuccessful.
Retrieves the value of an attribute, given its parent object and name.
Parameters
x The attribute's parent object
s The attribute's name
Returns
This function returns the value of the specified attribute, if successful, or 0, if unsuccessful.
Remarks
If the attribute is not of the type specified by the function, the function will attempt to coerce a valid value from
the attribute.
Referenced by jit_attr_getlong().
Retrieves the value of an attribute, given its parent object and name.
This function uses a developer-allocated array to copy data to. Developers wishing to retrieve the value of an
attribute without pre-allocating memory should refer to the object_attr_getvalueof() function.
Parameters
x The attribute's parent object
s The attribute's name
max The number of array elements in vals. The function will take care not to overwrite the
bounds of the array.
vals Pointer to the first element of a pre-allocated array of long data.
Returns
Remarks
If the attribute is not of the type specified by the function, the function will attempt to coerce a valid value from
the attribute.
Referenced by jit_attr_getlong_array().
Gets the value of a t_pt attribute, given its parent object and name.
Parameters
o The attribute's parent object
name The attribute's name
pt The address of a valid t_pt whose values will be filled-in from the attribute.
Returns
This function returns the error code MAX_ERR_NONE if successful, or one of the other error codes defined
in e_max_errorcodes if unsuccessful.
Gets the value of a t_size attribute, given its parent object and name.
Parameters
o The attribute's parent object
name The attribute's name
size The address of a valid t_size whose values will be filled-in from the attribute.
Returns
This function returns the error code MAX_ERR_NONE if successful, or one of the other error codes defined
in e_max_errorcodes if unsuccessful.
Retrieves the value of an attribute, given its parent object and name.
Parameters
x The attribute's parent object
s The attribute's name
Returns
This function returns the value of the specified attribute, if successful, or the empty symbol (equivalent to
gensym("") or _sym_nothing), if unsuccessful.
Referenced by jit_attr_getsym().
Retrieves the value of an attribute, given its parent object and name.
This function uses a developer-allocated array to copy data to. Developers wishing to retrieve the value of an
attribute without pre-allocating memory should refer to the object_attr_getvalueof() function.
Parameters
x The attribute's parent object
s The attribute's name
max The number of array elements in vals. The function will take care not to overwrite the
bounds of the array.
vals Pointer to the first element of a pre-allocated array of t_symbol ∗s.
Returns
Referenced by jit_attr_getsym_array().
36.1.6.33 method object_attr_method ( void ∗ x, t_symbol ∗ methodname, void ∗∗ attr, long ∗ get )
Returns the method of an attribute's get or set function, as well as a pointer to the attribute itself, from a message
name.
Parameters
x Pointer to the object whose attribute is of interest
methodname The Max message used to call the attribute's get or set function. For example,
gensym("mode") or gensym("getthresh").
attr A pointer to a void ∗, which will be set to the attribute pointer upon successful completion of
the function
get A pointer to a long variable, which will be set to 1 upon successful completion of the function,
if the queried method corresponds to the get function of the attribute.
Returns
Sets the value of a t_rect attribute, given its parent object and name.
Do not use this on a jbox object – use jbox_get_rect_for_view() instead!
Parameters
o The attribute's parent object
name The attribute's name
rect The address of a valid t_rect whose values will be used to set the attribute.
Returns
This function returns the error code MAX_ERR_NONE if successful, or one of the other error codes defined
in e_max_errorcodes if unsuccessful.
36.1.6.35 void object_attr_set_xywh ( t_object ∗ o, t_symbol ∗ attr, double x, double y, double w, double h )
Sets the value of a t_rect attribute, given its parent object and name.
Do not use this on a jbox object – use jbox_get_rect_for_view() instead!
Parameters
o The attribute's parent object
attr The attribute's name
x A double containing the new x position.
y A double containing the new y position.
w A double containing the new width.
h A double containing the new height.
Returns
This function returns the error code MAX_ERR_NONE if successful, or one of the other error codes defined
in e_max_errorcodes if unsuccessful.
36.1.6.36 t_max_err object_attr_setchar_array ( void ∗ x, t_symbol ∗ s, long count, C74_CONST t_uint8 ∗ vals )
Sets the value of an attribute, given its parent object and name.
The function will call the attribute's set method, using the data provided.
Parameters
x The attribute's parent object
s The attribute's name
count The number of array elements in vals
vals Pointer to the first element of an array of unsigned char data
Returns
This function returns the error code MAX_ERR_NONE if successful, or one of the other error codes defined
in e_max_errorcodes if unsuccessful.
Referenced by jit_attr_setchar_array().
Sets the value of a t_jrgba attribute, given its parent object and name.
Parameters
b The attribute's parent object
attrname The attribute's name
prgba The address of a valid t_jrgba whose values will be used to set the attribute.
Returns
This function returns the error code MAX_ERR_NONE if successful, or one of the other error codes defined
in e_max_errorcodes if unsuccessful.
Sets the value of an attribute, given its parent object and name.
The function will call the attribute's set method, using the data provided.
Parameters
x The attribute's parent object
s The attribute's name
count The number of array elements in vals
vals Pointer to the first element of an array of double data
Returns
This function returns the error code MAX_ERR_NONE if successful, or one of the other error codes defined
in e_max_errorcodes if unsuccessful.
Referenced by jit_attr_setdouble_array().
Sets the value of an attribute, given its parent object and name.
The function will call the attribute's set method, using the data provided.
Parameters
x The attribute's parent object
s The attribute's name
c An floating point value; the new value for the attribute
Returns
This function returns the error code MAX_ERR_NONE if successful, or one of the other error codes defined
in e_max_errorcodes if unsuccessful.
Referenced by jit_attr_setfloat().
Sets the value of an attribute, given its parent object and name.
The function will call the attribute's set method, using the data provided.
Parameters
x The attribute's parent object
s The attribute's name
count The number of array elements in vals
vals Pointer to the first element of an array of float data
Returns
This function returns the error code MAX_ERR_NONE if successful, or one of the other error codes defined
in e_max_errorcodes if unsuccessful.
Referenced by jit_attr_setfloat_array().
Sets the value of a color attribute, given its parent object and name.
The function will call the attribute's set method, using the data provided.
Parameters
ob The attribute's parent object
s The attribute's name
c The address of a t_jrgba struct that contains the new color.
Returns
This function returns the error code MAX_ERR_NONE if successful, or one of the other error codes defined
in e_max_errorcodes if unsuccessful.
Sets the value of an attribute, given its parent object and name.
The function will call the attribute's set method, using the data provided.
Parameters
x The attribute's parent object
s The attribute's name
c An integer value; the new value for the attribute
Returns
This function returns the error code MAX_ERR_NONE if successful, or one of the other error codes defined
in e_max_errorcodes if unsuccessful.
Referenced by jit_attr_setlong().
Sets the value of an attribute, given its parent object and name.
The function will call the attribute's set method, using the data provided.
Parameters
x The attribute's parent object
s The attribute's name
count The number of array elements in vals
vals Pointer to the first element of an array of long data
Returns
This function returns the error code MAX_ERR_NONE if successful, or one of the other error codes defined
in e_max_errorcodes if unsuccessful.
Referenced by jit_attr_setlong_array().
Set an attribute value with one or more atoms parsed from a C-string.
Parameters
x The object whose attribute will be set.
s The name of the attribute to set.
parsestr A C-string to parse into an array of atoms to set the attribute value.
Returns
See also
atom_setparse()
Sets the value of a t_pt attribute, given its parent object and name.
Parameters
o The attribute's parent object
name The attribute's name
pt The address of a valid t_pt whose values will be used to set the attribute.
Returns
This function returns the error code MAX_ERR_NONE if successful, or one of the other error codes defined
in e_max_errorcodes if unsuccessful.
Sets the value of a t_size attribute, given its parent object and name.
Parameters
o The attribute's parent object
name The attribute's name
size The address of a valid t_size whose values will be used to set the attribute.
Returns
This function returns the error code MAX_ERR_NONE if successful, or one of the other error codes defined
in e_max_errorcodes if unsuccessful.
Sets the value of an attribute, given its parent object and name.
The function will call the attribute's set method, using the data provided.
Parameters
x The attribute's parent object
s The attribute's name
c A t_symbol ∗; the new value for the attribute
Returns
This function returns the error code MAX_ERR_NONE if successful, or one of the other error codes defined
in e_max_errorcodes if unsuccessful.
Referenced by jit_attr_setsym().
Sets the value of an attribute, given its parent object and name.
The function will call the attribute's set method, using the data provided.
Parameters
x The attribute's parent object
Returns
This function returns the error code MAX_ERR_NONE if successful, or one of the other error codes defined
in e_max_errorcodes if unsuccessful.
Referenced by jit_attr_setsym_array().
Returns
This function returns the error code MAX_ERR_NONE if successful, or one of the other error codes defined
in e_max_errorcodes if unsuccessful.
Referenced by jit_object_importattrs().
Determines if the value of an object's attribute can be queried from the Max interface (i.e.
if its ATTR_GET_OPAQUE_USER flag is set).
Parameters
x Pointer to the object whose attribute is of interest
s The attribute's name
Returns
This function returns 1 if the value of the attribute can be queried from the Max interface. Otherwise, it returns
0.
Referenced by jit_object_attr_usercanget().
Determines if an object's attribute can be set from the Max interface (i.e.
if its ATTR_SET_OPAQUE_USER flag is set).
Parameters
x Pointer to the object whose attribute is of interest
s The attribute's name
Returns
This function returns 1 if the attribute can be set from the Max interface. Otherwise, it returns 0.
Referenced by jit_object_attr_usercanset().
Detach an attribute from an object that was previously attached with object_addattr().
This function will not free the attribute (use object_free() to do this manually).
Parameters
x The object to which the attribute is attached
attrsym The attribute's name
Returns
This function returns the error code MAX_ERR_NONE if successful, or one of the other error codes defined
in e_max_errorcodes if unsuccessful.
Detach an attribute from an object that was previously attached with object_addattr().
The function will also free all memory associated with the attribute. If you only wish to detach the attribute, without
freeing it, see the object_chuckattr() function.
Parameters
x The object to which the attribute is attached
attrsym The attribute's name
Returns
This function returns the error code MAX_ERR_NONE if successful, or one of the other error codes defined
in e_max_errorcodes if unsuccessful.
36.1.6.54 void∗ object_new_parse ( t_symbol ∗ name_space, t_symbol ∗ classname, C74_CONST char ∗ parsestr )
Create a new object with one or more atoms parsed from a C-string.
The object's new method must have an A_GIMME signature.
Parameters
name_space The namespace in which to create the instance. Typically this is either CLASS_BOX or CL←-
ASS_NOBOX.
classname The name of the class to instantiate.
parsestr A C-string to parse into an array of atoms to set the attribute value.
Returns
See also
atom_setparse()
object_new_typed()
36.2 Classes
When a user types the name of your object into an object box, Max looks for an external of this name in the
searchpath and, upon finding it, loads the bundle or dll and calls the ext_main() function.
Collaboration diagram for Classes:
Modules
• Old-Style Classes
• Inlets and Outlets
Routines for creating and communicating with inlets and outlets.
Data Structures
• struct t_class
The data structure for a Max class.
Macros
• #define CLASS_BOX
The namespace for all Max object classes which can be instantiated in a box, i.e.
• #define CLASS_NOBOX
A namespace for creating hidden or internal object classes which are not a direct part of the user creating patcher.
Enumerations
• enum e_max_class_flags {
CLASS_FLAG_BOX, CLASS_FLAG_POLYGLOT, CLASS_FLAG_NEWDICTIONARY, CLASS_FLAG_R←-
EGISTERED,
CLASS_FLAG_UIOBJECT, CLASS_FLAG_ALIAS, CLASS_FLAG_DO_NOT_PARSE_ATTR_ARGS, CL←-
ASS_FLAG_DO_NOT_ZERO,
CLASS_FLAG_NOATTRIBUTES, CLASS_FLAG_OWNATTRIBUTES, CLASS_FLAG_PARAMETER, CL←-
ASS_FLAG_RETYPEABLE,
CLASS_FLAG_OBJECT_METHOD }
Class flags.
Functions
When a user types the name of your object into an object box, Max looks for an external of this name in the
searchpath and, upon finding it, loads the bundle or dll and calls the ext_main() function.
Thus, Max classes are typically defined in the ext_main() function of an external.
Historically, Max classes have been defined using an API that includes functions like setup() and addmess(). This
interface is still supported, and the relevant documentation can be found in Old-Style Classes.
A more recent and more flexible interface for creating objects was introduced with Jitter 1.0 and later included
directly in Max 4.5. This newer API includes functions such as class_new() and class_addmethod(). Supporting
attributes, user interface objects, and additional new features of Max requires the use of the newer interface for
definiting classes documented on this page.
You may not mix these two styles of creating classes within an object.
The namespace for all Max object classes which can be instantiated in a box, i.e.
in a patcher.
Referenced by ext_main().
Class flags.
If not box or polyglot, class is only accessible in C via known interface
Enumerator
Returns
This function returns the error code MAX_ERR_NONE if successful, or one of the other error codes defined
in e_max_errorcodes if unsuccessful.
36.2.4.2 t_max_err class_addmethod ( t_class ∗ c, C74_CONST method m, C74_CONST char ∗ name, ... )
Parameters
c The class pointer
m Function to be called when the method is invoked
name C-string defining the message (message selector)
... One or more integers specifying the arguments to the message, in the standard Max type list
format (see Chapter 3 of the Writing Externals in Max document for more information).
Returns
This function returns the error code MAX_ERR_NONE if successful, or one of the other error codes defined
in e_max_errorcodes if unsuccessful.
Remarks
The class_addmethod() function works essentially like the traditional addmess() function, adding the function
pointed to by m, to respond to the message string name in the leftmost inlet of the object.
Returns
This function returns the error code MAX_ERR_NONE if successful, or one of the other error codes defined
in e_max_errorcodes if unsuccessful.
Wraps user gettable attributes with a method that gets the values and sends out dumpout outlet.
Parameters
c The class pointer
Returns
This function returns the error code MAX_ERR_NONE if successful, or one of the other error codes defined
in e_max_errorcodes if unsuccessful.
Finds the class pointer for a class, given the class's namespace and name.
Parameters
name_space The desired class's name space. Typically, either the constant CLASS_BOX, for obex classes
which can instantiate inside of a Max patcher (e.g. boxes, UI objects, etc.), or the constant
CLASS_NOBOX, for classes which will only be used internally. Developers can define their
own name spaces as well, but this functionality is currently undocumented.
classname The name of the class to be looked up
Returns
If successful, this function returns the class's data pointer. Otherwise, it returns NULL.
Referenced by jit_class_findbyname().
Finds the class pointer for a class, given the class's namespace and name.
Parameters
name_space The desired class's name space. Typically, either the constant CLASS_BOX, for obex classes
which can instantiate inside of a Max patcher (e.g. boxes, UI objects, etc.), or the constant
CLASS_NOBOX, for classes which will only be used internally. Developers can define their
own name spaces as well, but this functionality is currently undocumented.
classname The name of the class to be looked up (case free)
Returns
If successful, this function returns the class's data pointer. Otherwise, it returns NULL.
Returns
This function returns the error code MAX_ERR_NONE if successful, or one of the other error codes defined
in e_max_errorcodes if unsuccessful.
Referenced by jit_class_free().
Returns
Parameters
c The class pointer
Returns
Referenced by jit_class_nameget().
36.2.4.10 t_class∗ class_new ( C74_CONST char ∗ name, C74_CONST method mnew, C74_CONST method mfree, long
size, C74_CONST method mmenu, short type, ... )
Initializes a class by informing Max of its name, instance creation and free functions, size and argument types.
Developers wishing to use obex class features (attributes, etc.) must use class_new() instead of the traditional
setup() function.
Parameters
name The class's name, as a C-string
mnew The instance creation function
mfree The instance free function
size The size of the object's data structure in bytes. Usually you use the C sizeof operator here.
mmenu Obsolete - pass NULL. In Max 4 this was a function pointer for UI objects called when the
user created a new object of the class from the Patch window's palette.
type A standard Max type list as explained in Chapter 3 of the Writing Externals in Max document
(in the Max SDK). The final argument of the type list should be a 0. Generally, obex objects
have a single type argument, A_GIMME, followed by a 0.
Returns
This function returns the class pointer for the new object class. This pointer is used by numerous other
functions and should be stored in a global or static variable.
Retrieves the byte-offset of the obex member of the class's data structure.
Parameters
c The class pointer
Returns
This function returns the byte-offset of the obex member of the class's data structure.
Registers the byte-offset of the obex member of the class's data structure with the previously defined object class.
Use of this function is required for obex-class objects. It must be called from main().
Parameters
c The class pointer
offset The byte-offset to the obex member of the object's data structure. Conventionally, the macro
calcoffset is used to calculate the offset.
Referenced by ext_main().
Returns
This function returns the error code MAX_ERR_NONE if successful, or one of the other error codes defined
in e_max_errorcodes if unsuccessful.
Returns
Returns
ext_main() is the entry point for an extern to be loaded, which all externs must implement this shared/common
prototype ensures that it will be exported correctly on all platforms.
Parameters
r Pointer to resources for the external, if applicable.
See also
Version
References A_CANT, A_FLOAT, A_GIMME, A_LONG, addbang(), addfloat(), addint(), addmess(), attr_offset_←-
array_new(), attr_offset_new(), ATTR_SET_OPAQUE, ATTR_SET_OPAQUE_USER, calcoffset, class_addattr(),
class_addmethod(), CLASS_BOX, class_new(), class_obexoffset_set(), class_register(), object_obex_dumpout(),
object_obex_quickref(), and setup().
addbang
addfloat
addint
addmess
attr_offset_array_new
attr_offset_new
class_addattr
ext_main
class_addmethod
class_new
class_obexoffset_set
class_register
object_obex_dumpout
object_obex_quickref
setup
Functions
• BEGIN_USING_C_LINKAGE void setup (t_messlist ∗∗ident, method makefun, method freefun, t_getbytes←-
_size size, method menufun, short type,...)
Use the setup() function to initialize your class by informing Max of its size, the name of your functions that create and
destroy instances, and the types of arguments passed to the instance creation function.
• void addmess (method f, char ∗s, short type,...)
Use addmess() to bind a function to a message other than the standard ones covered by addbang(), addint(), etc.
• void addbang (method f)
Used to bind a function to the common triggering message bang.
• void addint (method f)
Use addint() to bind a function to the int message received in the leftmost inlet.
• void addfloat (method f)
Use addfloat() to bind a function to the float message received in the leftmost inlet.
• void addinx (method f, short n)
Use addinx() to bind a function to a int message that will be received in an inlet other than the leftmost one.
• void addftx (method f, short n)
Use addftx() to bind a function to a float message that will be received in an inlet other than the leftmost one.
• void ∗ newobject (void ∗maxclass)
Use newobject to allocate the space for an instance of your class and initialize its object header.
• void freeobject (t_object ∗op)
Release the memory used by a Max object.
• void ∗ newinstance (t_symbol ∗s, short argc, t_atom ∗argv)
Make a new instance of an existing Max class.
• void alias (char ∗name)
Use the alias function to allow users to refer to your object by a name other than that of your shared library.
• void class_setname (char ∗obname, char ∗filename)
Use class_setname() to associate you object's name with it's filename on disk.
• void ∗ typedmess (t_object ∗op, t_symbol ∗msg, short argc, t_atom ∗argp)
Send a typed message directly to a Max object.
• method getfn (t_object ∗op, t_symbol ∗msg)
Use getfn() to send an untyped message to a Max object with error checking.
• method egetfn (t_object ∗op, t_symbol ∗msg)
Use egetfn() to send an untyped message to a Max object that always works.
• method zgetfn (t_object ∗op, t_symbol ∗msg)
Use zgetfn() to send an untyped message to a Max object without error checking.
Use addfloat() to bind a function to the float message received in the leftmost inlet.
Parameters
f Function to be the int method.
Referenced by ext_main().
Use addftx() to bind a function to a float message that will be received in an inlet other than the leftmost one.
Parameters
f Function to be the float method.
n Number of the inlet connected to this method. 1 is the first inlet to the right of the left inlet.
Remarks
This correspondence between inlet locations and messages is not automatic, but it is strongly suggested that
you follow existing practice. You must set the correspondence up when creating an object of your class with
proper use of intin and floatin in your instance creation function New Instance Routine.
Use addint() to bind a function to the int message received in the leftmost inlet.
Parameters
f Function to be the int method.
Referenced by ext_main().
Use addinx() to bind a function to a int message that will be received in an inlet other than the leftmost one.
Parameters
Remarks
This correspondence between inlet locations and messages is not automatic, but it is strongly suggested that
you follow existing practice. You must set the correspondence up when creating an object of your class with
proper use of intin and floatin in your instance creation function New Instance Routine.
Use addmess() to bind a function to a message other than the standard ones covered by addbang(), addint(), etc.
Parameters
f Function you want to be the method.
s C string defining the message.
type The first of one or more integers from e_max_atomtypes specifying the arguments to the
message.
... Any additional types from e_max_atomtypes for additonal arguments.
See also
Use the alias function to allow users to refer to your object by a name other than that of your shared library.
Parameters
name An alternative name for the user to use to make an object of your class.
Use class_setname() to associate you object's name with it's filename on disk.
Parameters
obname A character string with the name of your object class as it appears in Max.
filename A character string with the name of your external's file as it appears on disk.
Use egetfn() to send an untyped message to a Max object that always works.
Parameters
Returns
egetfn returns a pointer to the method bound to the message selector msg in the receiver's message list. If
the method can't be found, a pointer to a do-nothing function is returned.
Remarks
This function can be replaced by the use of object_free(). Unlike freeobject(), object_free() checkes to make
sure the pointer is not NULL before trying to free it.
See also
newobject()
object_free()
Use getfn() to send an untyped message to a Max object with error checking.
Parameters
op Receiver of the message.
msg Message selector.
Returns
getfn returns a pointer to the method bound to the message selector msg in the receiver's message list. It
returns 0 and prints an error message in Max Window if the method can't be found.
s className Symbol specifying the name of the class of the instance to be created.
argc Count of arguments in argv.
argv Array of t_atoms; arguments to the class's instance creation function.
Returns
A pointer to the created object, or 0 if the class didn't exist or there was another type of error in creating the
instance.
Remarks
This function creates a new instance of the specified class. Using newinstance is equivalent to typing some-
thing in a New Object box when using Max. The difference is that no object box is created in any Patcher
window, and you can send messages to the object directly without connecting any patch cords. The mes-
sages can either be type- checked (using typedmess) or non-type-checked (using the members of the getfn
family).
This function is useful for taking advantage of other already-defined objects that you would like to use 'privately' in
your object, such as tables. See the source code for the coll object for an example of using a privately defined class.
Use newobject to allocate the space for an instance of your class and initialize its object header.
Parameters
maxclass The global class variable initialized in your main routine by the setup function.
Returns
Remarks
You call newobject() when creating an instance of your class in your creation function. newobject allocates the
proper amount of memory for an object of your class and installs a pointer to your class in the object, so that
it can respond with your class's methods if it receives a message.
Referenced by max_jit_obex_new().
36.3.2.14 BEGIN_USING_C_LINKAGE void setup ( t_messlist ∗∗ ident, method makefun, method freefun,
t_getbytes_size size, method menufun, short type, ... )
Use the setup() function to initialize your class by informing Max of its size, the name of your functions that create
and destroy instances, and the types of arguments passed to the instance creation function.
Parameters
ident A global variable in your code that points to the initialized class.
makefun Your instance creation function.
freefun Your instance free function (see Chapter 7).
size The size of your objects data structure in bytes. Usually you use the C sizeof operator here.
menufun No longer used. You should pass NULL for this parameter.
type The first of a list of arguments passed to makefun when an object is created.
... Any additional arguments passed to makefun when an object is created. Together with the
type parameter, this creates a standard Max type list as enumerated in e_max_atomtypes.
The final argument of the type list should be a 0.
See also
Referenced by ext_main().
36.3.2.15 void∗ typedmess ( t_object ∗ op, t_symbol ∗ msg, short argc, t_atom ∗ argp )
Returns
If the receiver object can respond to the message, typedmess() returns the result. Otherwise, an error mes-
sage will be seen in the Max window and 0 will be returned.
Remarks
typedmess sends a message to a Max object (receiver) a message with arguments. Note that the message
must be a t_symbol, not a character string, so you must call gensym on a string before passing it to typedmess.
Also, note that untyped messages defined for classes with the argument list A_CANT cannot be sent using
typedmess. You must use getfn() etc. instead.
Example:
Use zgetfn() to send an untyped message to a Max object without error checking.
Parameters
op Receiver of the message.
msg Message selector.
Returns
zgetfn returns a pointer to the method bound to the message selector msg in the receiver's message list. It
returns 0 but doesn't print an error message in Max Window if the method can't be found.
Referenced by max_jit_attr_getdump().
Functions
Use bangout() to create an outlet that will always send the bang message.
Parameters
x Your object.
Returns
Remarks
You can send a bang message out a general purpose outlet, but creating an outlet using bangout() allows Max
to type-check the connection a user might make and refuse to connect the outlet to any object that cannot
receive a bang message. bangout() returns the created outlet.
Returns
Use floatout() to create an outlet that will always send the float message.
Parameters
x Your object.
Returns
Use inlet_new() to create an inlet that can receive a specific message or any message.
Parameters
x Your object.
Returns
Remarks
inlet_new() ceates a general purpose inlet. You can use it in circumstances where you would like special mes-
sages to be received in inlets other than the leftmost one. To create an inlet that receives a particular message,
pass the message's character string. For example, to create an inlet that receives only bang messages, do
the following
1 inlet_new (myObject,"bang");
To create an inlet that can receive any message, pass NULL for msg
1 inlet_new (myObject, NULL);
Proxies are an alternative method for general-purpose inlets that have a number of advantages. If you create
multiple inlets as shown above, there would be no way to figure out which inlet received a message. See the
discussion in Creating and Using Proxies.
Returns
Remarks
intin creates integer inlets. It takes a pointer to your newly created object and an integer n, from 1 to 9. The
number specifies the message type you'll get, so you can distinguish one inlet from another. For example, an
integer sent in inlet 1 will be of message type in1 and a floating point number sent in inlet 4 will be of type ft4.
You use addinx() and addftx() to add methods to respond to these messages.
The order you create additional inlets is important. If you want the rightmost inlet to be the have the highest number
in- or ft- message (which is usually the case), you should create the highest number message inlet first.
Use intout() to create an outlet that will always send the int message.
Parameters
x Your object.
Returns
Remarks
You can send a bang message out a general purpose outlet, but creating an outlet using bangout() allows Max
to type-check the connection a user might make and refuse to connect the outlet to any object that cannot
receive a bang message. bangout() returns the created outlet.
Use listout() to create an outlet that will always send the list message.
Parameters
x Your object.
Returns
Returns
Remarks
This function lets you send an arbitrary message out an outlet. Here are a couple of examples of its use.
First, here's a hard way to send the bang message (see outlet_bang() for an easier way):
Remarks
And here's an even harder way to send a single integer (instead of using outlet_int()).
1 t_atom myNumber;
2
3 atom_setlong(&myNumber, 432);
4 outlet_anything(myOutlet, gensym("int"), 1, &myNumber);
Notice that outlet_anything() expects the message argument as a t_symbol∗, so you must use gensym() on a
character string.
If you'll be sending the same message a lot, you might call gensym() on the message string at initialization time
and store the result in a global variable to save the (significant) overhead of calling gensym() every time you want
to send a message.
Also, do not send lists using outlet_anything() with list as the selector argument. Use the outlet_list() function
instead.
Referenced by max_jit_mop_jit_matrix(), max_jit_mop_outputmatrix(), and max_jit_obex_dumpout().
Parameters
o Outlet that will send the message.
Returns
Returns
Returns
Returns
Remarks
outlet_list() sends the list specified by argv and argc out the specified outlet. The outlet must have been
created with listout or outlet_new in your object creation function (see above). You create the list as an array
of Atoms, but the first item in the list must be an integer or float.
1 t_atom myList[3];
2 long theNumbers[3];
3 short i;
4
5 theNumbers[0] = 23;
6 theNumbers[1] = 12;
7 theNumbers[2] = 5;
8 for (i=0; i < 3; i++) {
9 atom_setlong(myList+i,theNumbers[i]);
10 }
11 outlet_list(myOutlet,0L,3,&myList);
Remarks
It's not a good idea to pass large lists to outlet_list that are comprised of local (automatic) variables. If the list
is small, as in the above example, there's no problem. If your object will regularly send lists, it might make
sense to keep an array of t_atoms inside your object's data structure.
Use outlet_new() to create an outlet that can send a specific non-standard message, or any message.
Parameters
x Your object.
s A C-string specifying the message that will be sent out this outlet, or NULL to indicate the
outlet will be used to send various messages. The advantage of this kind of outlet's flexibility is
balanced by the fact that Max must perform a message-lookup in real-time for every message
sent through it, rather than when a patch is being constructed, as is true for other types of
outlets. Patchers execute faster when outlets are typed, since the message lookup can be
done before the program executes.
Returns
Use proxy_getinlet to get the inlet number in which a message was received.
Note that the owner argument should point to your external object's instance, not a proxy object.
Parameters
master Your object.
Returns
Referenced by max_jit_obex_inletnumber_get().
Parameters
x Your object.
id A non-zero number to be written into your object when a message is received in this particular
Proxy. Normally, id will be the inlet number analogous to in1, in2 etc.
stuffloc A pointer to a location where the id value will be written.
Returns
Remarks
This routine creates a new Proxy object (that includes an inlet). It allows you to identify messages based on
an id value stored in the location specified by stuffLoc. You should store the pointer returned by proxy_new()
because you'll need to free all Proxies in your object's free function using object_free().
After your method has finished, Proxy sets the stuffLoc location back to 0, since it never sees messages coming in
an object's leftmost inlet. You'll know you received a message in the leftmost inlet if the contents of stuffLoc is 0. As
of Max 4.3, stuffLoc is not always guaranteed to be a correct indicator of the inlet in which a message was received.
Use proxy_getinlet() to determine the inlet number.
Referenced by max_jit_obex_proxy_new().
Max provides a number of ways of storing and manipulating data at a high level.
Collaboration diagram for Data Storage:
Linked List
Quick Map
String Object
Database
Symbol Object
Data Storage
Atom Array
Dictionary
Hash Table
Index Map
Modules
• Atom Array
Max's atomarray object is a container for an array of atoms with an interface for manipulating that array.
• Database
Max's database ( i.e.
• Dictionary
Max 5, introduced the t_dictionary structure/object.
• Hash Table
A hash table is a data structure that associates some data with a unique key.
• Index Map
An indexmap is basically a managed array of pointers, but it allows you to derive relatively quickly the index from a
pointer in the array.
• Linked List
The Max t_linklist data structure is useful for maintaining ordered lists of items where you want to be able to insert
and delete items efficiently.
• Quick Map
A quickmap implements a pair of t_hashtab hash tables so that it is fast to look up a unique value for a unique key or
vice-versa.
• String Object
Max's string object is a simple wrapper for c-strings, useful when working with Max's t_dictionary, t_linklist, or t_←-
hashtab.
• Symbol Object
The symobject class is a simple object that wraps a t_symbol∗ together with a couple of additional fields.
• Dictionary Passing API
The Dictionary Passing API defines a means by which t_dictionary instances may be passed between Max objects in
a way similar to the way Jitter Matrices are passed between objects.
Typedefs
Enumerations
• enum e_max_datastore_flags {
OBJ_FLAG_OBJ, OBJ_FLAG_REF, OBJ_FLAG_DATA, OBJ_FLAG_MEMORY,
OBJ_FLAG_SILENT, OBJ_FLAG_INHERITABLE, OBJ_FLAG_ITERATING, OBJ_FLAG_DEBUG }
Flags used in linklist and hashtab objects.
Max provides a number of ways of storing and manipulating data at a high level.
It is recommended to use Max's data storage mechanisms where possible, as Max's systems are designed for
thread-safety and integration with the rest of Max API.
See also
linklist_match()
hashtab_findfirst()
indexmap_sort()
Enumerator
Max's atomarray object is a container for an array of atoms with an interface for manipulating that array.
Collaboration diagram for Atom Array:
Data Structures
• struct t_atomarray
The atomarray object.
Macros
• #define ATOMARRAY_FLAG_FREECHILDREN
The atomarray flags.
Functions
Max's atomarray object is a container for an array of atoms with an interface for manipulating that array.
It can be useful for passing lists as a single atom, such as for the return value of an A_GIMMEBACK method. It also
used frequently in when working with Max's t_dictionary object.
See also
Dictionary
See also
atomarray_appendatoms()
atomarray_setatoms()
av A pointer to the first of the new atoms to append to the end of the array.
See also
atomarray_appendatom()
atomarray_setatoms()
Returns
Create a new atomarray object which is a full clone of another atomarray object.
Parameters
x The atomarray instance which is to be copied.
Returns
See also
atomarray_new()
Parameters
x The atomarray instance.
ac The address of a long where the number of atoms will be set.
av The address of a t_atom pointer where the atoms will be allocated and copied.
Returns
Remarks
You are responsible for freeing memory allocated for the copy of the atoms returned.
1 long ac = 0;
2 t_atom *av = NULL;
3
4 atomarray_copyatoms(anAtomarray, &ac, &av);
5 if(ac && av){
6 // do something with ac and av here...
7 sysmem_freeptr(av);
8 }
See also
atomarray_getatoms()
Returns
See also
atomarray_new()
Call the specified function for every item in the atom array.
Parameters
x The atomarray instance.
fun The function to call, specified as function pointer cast to a Max method.
arg An argument that you would like to pass to the function being called.
Returns
Remarks
The atomarray_funall() method will call your function for every item in the list. It will pass both a pointer to
the item in the list, and any argument that you provide. The following example shows a function that could be
called by hashtab_funall().
1 void myFun(t_atom *a, void *myArg)
2 {
3 // do something with a and myArg here
4 // a is the atom in the atom array
5 }
See also
linklist_funall()
hashtab_funall()
Returns
See also
atomarray_copyatoms()
Returns
Parameters
x The atomarray instance.
index The zero-based index into the array from which to retrieve an atom pointer.
av The address of an atom to contain the copy.
Returns
Remarks
Example:
1 {
2 t_atom a;
3
4 // fetch a copy of the second atom in a previously existing array
5 atomarray_getindex(anAtomarray, 1, &a);
6 // do something with the atom here...
7 }
Returns
Returns
Remarks
Note that due to the unusual prototype of this method that you cannot instantiate this object using the object←-
_new_typed() function. If you wish to use the dynamically bound creator to instantiate the object, you should
instead should use object_new() as demonstrated below. The primary reason that you might choose to instan-
tiate an atomarray using object_new() instead of atomarray_new() is for using the atomarray object in code
that is also intended to run in Max 4.
1 object_new(CLASS_NOBOX, gensym("atomarray"), argc, argv);
See also
atomarray_duplicate()
Replace the existing array contents with a new set of atoms Note that atoms provided to this function will be copied.
The copies stored internally to the atomarray instance.
Parameters
x The atomarray instance.
ac The number of atoms to be initially contained in the atomarray.
av A pointer to the first of an array of atoms to initially copy into the atomarray.
Returns
36.7 Database
Typedefs
Functions
A database object.
Use db_open() and db_close() to create and free database objects.
Returns
An error code.
36.7.3.2 BEGIN_USING_C_LINKAGE t_max_err db_open ( t_symbol ∗ dbname, const char ∗ fullpath, t_database
∗∗ db )
Returns
An error code.
36.7.3.3 t_max_err db_open_ext ( t_symbol ∗ dbname, const char ∗ fullpath, t_database ∗∗ db, long flags )
Returns
An error code.
36.7.3.4 t_max_err db_query ( t_database ∗ db, t_db_result ∗∗ dbresult, const char ∗ sql, ... )
Returns
An error code.
36.7.3.5 t_max_err db_query_direct ( t_database ∗ db, t_db_result ∗∗ dbresult, const char ∗ sql )
Returns
An error code.
Determine the id (key) number for the most recent INSERT query executed on the database.
Parameters
db The t_database pointer for your database instance.
id The address of a variable to hold the result on return.
Returns
An error code.
36.7.3.7 t_max_err db_query_silent ( t_database ∗ db, t_db_result ∗∗ dbresult, const char ∗ sql, ... )
Execute a SQL query on the database, temporarily overriding the database's error logging attribute.
Parameters
db The t_database pointer for your database instance.
dbresult The address of a t_db_result pointer. If the pointer is passed-in set to NULL then a new
dbresult will be created. If the pointer is not NULL then it is assumed to be a valid dbresult,
which will be filled in with the query results. When you are done with the dbresult you should
free it with object_free().
sql A C-string containing a valid SQL query, possibly with sprintf() formatting codes.
... If an sprintf() formatting codes are used in the sql string, these values will be interpolated into
the sql string.
Returns
An error code.
36.7.3.8 t_max_err db_query_table_addcolumn ( t_database ∗ db, const char ∗ tablename, const char ∗ columnname,
const char ∗ columntype, const char ∗ flags )
Returns
An error code.
Parameters
db The t_database pointer for your database instance.
tablename The name to use for the new table. The new table will be created with one column, which
holds the primary key for the table, and is named according the form {tablename}_id.
Returns
An error code.
Return a single value from a result according to its index and field coordinates.
The value will be coerced from an expected datetime field into seconds.
Parameters
result The t_db_result pointer for your query results.
recordindex The zero-based index number of the record (row) in the result.
fieldindex The zero-based index number of the field (column) in the result.
Returns
Returns
Return a single value from a result according to its index and field coordinates.
Parameters
Returns
The content of the specified cell from the result scanned out to a float.
Return a single value from a result according to its index and field coordinates.
Parameters
result The t_db_result pointer for your query results.
recordindex The zero-based index number of the record (row) in the result.
fieldindex The zero-based index number of the field (column) in the result.
Returns
The content of the specified cell from the result scanned out to a long int.
Return the next record from a set of results that you are walking.
When you are returned a result from a query of the database, the result is prepared for walking the results from the
beginning. You can also reset the result manually to the beginning of the record list by calling db_result_reset().
Parameters
result The t_db_result pointer for your query results.
Returns
An array of C-Strings with the values for every requested column (field) of a database record. To find out how
many columns are represented in the array, use db_result_numfields().
Returns
Parameters
result The t_db_result pointer for your query results.
Returns
Reset the interface for walking a result's record list to the first record.
Parameters
result The t_db_result pointer for your query results.
Return a single value from a result according to its index and field coordinates.
Parameters
result The t_db_result pointer for your query results.
recordindex The zero-based index number of the record (row) in the result.
fieldindex The zero-based index number of the field (column) in the result.
Returns
Returns
An error code.
Returns
An error code.
Returns
An error code.
36.7.3.25 t_max_err db_view_create ( t_database ∗ db, const char ∗ sql, t_db_view ∗∗ dbview )
Returns
An error code.
Parameters
dbview The t_db_view pointer for your database view instance.
result The address of a pointer to a t_db_result object. This pointer will be overwritten with the
view's result pointer upon return.
Returns
An error code.
Returns
An error code.
Returns
An error code.
36.8 Dictionary
Data Structures
• struct t_dictionary_entry
A dictionary entry.
• struct t_dictionary
The dictionary object.
Functions
Dictionaries are used in many places in Max 5. They can be confusing in many respects. It is easy to produce
memory leaks or bugs where objects are freed twice. It is easy to confuse what type of dictionary is used for what.
This page will begin with some high level information to help understand when to free and when not to free. Then,
we will offer recipies for using dictionaries to accomplish common tasks.
A dictionary stores atom values under named key entries. These atoms can contain A_OBJ values. When the
dictionary is freed, any A_OBJ values that are in the dictionary will also be freed. Thus, it is easy to mistakenly free
objects twice, thus this is something to be careful about. For example, look at this code:
t_dictionary *d = dictionary_new();
t_dictionary *sd = dictionary_new();
dictionary_appenddictionary(d, gensym("subdictionary"), sd);
do_something(d);
object_free(d); // this will free *both* d and sd since sd is contained by d
// freeing "sd" here would be bad
You primarily need to keep this in mind when calling dictionary_appendobject(), dictionary_appenddictionary(), or
dictionary_appendatomarray(). So, what do you do if you need to free a dictionary but you also want to hang on to
an object that is inside of the dictionary? In this case, chuck the entry in question first. For example, let's assume
that for some reason you cannot free the "sd" dictionary in the code above. Perhaps it doesn't belong to you. But,
to do some operation you need to append it to a new dictionary. Then, do this:
So, how do you know when you need to free a dictionary? Well, generally if you make a dictionary, you need to free
it when you are done (unless you transfer ownership of the dictionary to someone else). On the other hand, if you
are passed a dictionary (i.e. as a parameter of your function or method) then it is not yours to free and you should
just use it. However, it is not always obvious that you made a dictionary vs just borrowed it.
Here are some common (and not so common) ways to make a dictionary. These functions return a new dictionary
and thus the dictionary you get should be freed when you are done, unless you pass the dictionary on to someone
else who will free it at an appropriate time. Here they are:
• dictionary_new()
• dictionary_clone()
• dictionary_read()
• dictionary_sprintf()
• dictionary_vsprintf()
• jsonreader_parse()
• jpatcher_monikerforobject()
• class_cloneprototype()
• prototype_getdictionary()
• clipboard_todictionary()
• jpatchercontroller_copytodictionary()
Here are some functions that return borrowed dictionaries. These are dictionaries that you can use but you cannot
free since you do not own them. Here they are:
• dictionary_prototypefromclass()
• object_refpage_get_class_info_fromclassname()
• object_refpage_get_class_info()
• object_dictionaryarg()
Finally, most functions that accept dictionaries as parameters will not assume ownership of the dictionary. Usually
the way ownership is assumed is if you add a dictionary as a subdictionary to a dictionary that you do not own.
One exception is the utility newobject_fromdictionary_delete() who's name makes it clear that the dictionary will be
deleted after calling the function.
You can make a patcher by passing a dictionary to object_new_typed() when making a "jpatcher". Using atom_←-
setparse() and attr_args_dictionary() makes this relatively easy.
Use newobject_sprintf() to programmatically make an object in a patch. Actually, you don't explicitly use a dictionary
here! If you do want more control, so you can touch the dictionary to customize it, then see the next bullet.
Use dictionary_sprintf() to make a dictionary to specify a box (i.e. specify class with @maxclass attr). Then,
make another dictionary and append your box dictionary to it under the key "box" via dictionary_appenddictionary().
Finally, make your object with newobject_fromdictionary().
See also
Linked List
Hash Table
Version
5.0
The easiest way to get read a t_dictionary from a JSON file on disk is to use the dictionary_read() function. In some
cases you may wish have more control, such as to generate JSON but not write it to disk. For that purpose you can
create a jsonreader object as demonstrated below.
t_dictionary *d = NULL;
t_max_err err;
t_atom result[1];
t_object *jsonreader = (t_object*)object_new(_sym_nobox, _sym_jsonreader);
// assume we have an argument called ’jsontext’ which is a const char* with the JSON
// from which we wish to create a t_dictionary instance
if (ro) {
if (object_classname_compare(ro, _sym_dictionary))
d = (t_dictionary*)ro;
else
object_free(ro);
}
}
object_free(jsonreader);
The easiest way to get write a t_dictionary to disk as JSON is to use the dictionary_write() function. In some cases
you may wish have more control, such as to generate JSON but not write it to disk. For that purpose you can create
a jsonwriter object as demonstrated below.
str = *json;
object_free(jsonwriter);
Returns
Returns
36.8.4.3 t_max_err dictionary_appendatoms ( t_dictionary ∗ d, t_symbol ∗ key, long argc, t_atom ∗ argv )
Parameters
d The dictionary instance.
key The name of the key used to index the new value. All keys must be unique. If the key name
already exists, then the existing value associated with the key will be freed prior to the new
value's assignment.
argc The number of atoms to append to the dictionary.
argv The address of the first atom in the array to append to the dictionary.
Returns
Returns
Returns
Parameters
d The dictionary instance.
key The name of the key used to index the new value. All keys must be unique. If the key name
already exists, then the existing value associated with the key will be freed prior to the new
value's assignment.
value The new value to append to the dictionary.
Returns
Returns
Returns
Parameters
d The dictionary instance.
key The name of the key used to index the new value. All keys must be unique. If the key name
already exists, then the existing value associated with the key will be freed prior to the new
value's assignment.
value The new value to append to the dictionary.
Returns
Returns
See also
dictionary_deleteentry()
Returns
See also
dictionary_getkeys()
dictionary_chuckentry()
dictionary_deleteentry()
36.8.4.12 t_max_err dictionary_copyatoms ( C74_CONST t_dictionary ∗ d, t_symbol ∗ key, long ∗ argc, t_atom ∗∗
argv )
Parameters
d The dictionary instance.
key The key associated with the value to lookup.
argc The address of a variable to hold the number of atoms in the array.
argv The address of a variable to hold a pointer to the first atom in the array. You should initialize
this pointer to NULL prior to passing it to dictionary_copyatoms().
Returns
See also
dictionary_getatoms()
36.8.4.13 t_max_err dictionary_copydefatoms ( t_dictionary ∗ d, t_symbol ∗ key, long ∗ argc, t_atom ∗∗ argv,
t_atom ∗ def )
Returns
See also
dictionary_getdefatoms()
dictionary_copyatoms()
Returns
See also
dictionary_copyunique()
Given 2 dictionaries, copy the keys unique to one of the dictionaries to the other dictionary.
Parameters
d A dictionary instance. This will be the destination for any values that are copied.
copyfrom A dictionary instance from which we will copy any values with unique keys.
Returns
See also
dictionary_copyentries()
Returns
See also
dictionary_chuckentry()
dictionary_clear()
Returns
Parameters
x The dictionary entry.
Returns
See also
dictionary_entry_getvalue()
dictionary_funall()
See also
dictionary_entry_getkey()
dictionary_funall()
See also
dictionary_entry_getkey()
dictionary_funall()
Test a key to set if the data stored with that key contains a t_atomarray object.
Parameters
d The dictionary instance.
key The key associated with the value to test.
Returns
Test a key to set if the data stored with that key contains a t_dictionary object.
Parameters
d The dictionary instance.
key The key associated with the value to test.
Returns
Test a key to set if the data stored with that key contains a t_string object.
Parameters
d The dictionary instance.
key The key associated with the value to test.
Returns
Returns
See also
dictionary_getkeys()
Remarks
The dictionary_funall() method will call your function for every entry in the dictionary. It will pass both a pointer
to the t_dictionary_entry, and any argument that you provide. The following example shows a function that
could be called by dictionary_funall().
See also
dictionary_entry_getkey()
dictionary_entry_getvalue()
36.8.4.26 t_max_err dictionary_get_ex ( t_dictionary ∗ d, t_symbol ∗ key, long ∗ ac, t_atom ∗∗ av, char ∗ errstr )
Retrieve the address of a t_atom array of in the dictionary within nested dictionaries.
The address can index into nested dictionaries using the '::' operator. For example, the key "field::subfield" will look
for the value at key "field" and then look for the value "subfield" in the value found at "field".
Parameters
d The dictionary instance.
key The key associated with the value to lookup.
ac The number of return values
av The return values
errstr An error message if an error code was returned. Optional, pass NULL if you don't want it.
Returns
Returns
Returns
36.8.4.29 t_max_err dictionary_getatoms ( C74_CONST t_dictionary ∗ d, t_symbol ∗ key, long ∗ argc, t_atom ∗∗ argv
)
Returns
See also
dictionary_copyatoms()
dictionary_getatoms_ext()
36.8.4.30 t_max_err dictionary_getatoms_ext ( const t_dictionary ∗ d, t_symbol ∗ key, long stringstosymbols, long ∗
argc, t_atom ∗∗ argv )
Returns
See also
dictionary_copyatoms()
dictionary_getatoms()
36.8.4.31 t_max_err dictionary_getdefatom ( const t_dictionary ∗ d, t_symbol ∗ key, t_atom ∗ value, t_atom ∗ def )
Returns
See also
dictionary_getatom()
36.8.4.32 t_max_err dictionary_getdefatoms ( t_dictionary ∗ d, t_symbol ∗ key, long ∗ argc, t_atom ∗∗ argv, t_atom
∗ def )
Returns
See also
dictionary_getatoms()
dictionary_copydefatoms()
36.8.4.33 t_max_err dictionary_getdeffloat ( const t_dictionary ∗ d, t_symbol ∗ key, double ∗ value, double def )
Returns
See also
dictionary_getfloat()
Returns
See also
dictionary_getlong()
36.8.4.35 t_max_err dictionary_getdefstring ( const t_dictionary ∗ d, t_symbol ∗ key, const char ∗∗ value, char ∗ def )
Returns
See also
dictionary_getstring()
36.8.4.36 t_max_err dictionary_getdefsym ( const t_dictionary ∗ d, t_symbol ∗ key, t_symbol ∗∗ value, t_symbol ∗
def )
Parameters
d The dictionary instance.
key The key associated with the value to lookup.
value The address of variable to hold the value associated with the key.
def The default value to return in the absence of the key existing in the dictionary.
Returns
See also
dictionary_getsym()
Returns
Returns
Returns
36.8.4.40 t_max_err dictionary_getkeys ( C74_CONST t_dictionary ∗ d, long ∗ numkeys, t_symbol ∗∗∗ keys )
Returns
Remarks
The following example demonstrates fetching all of the keys from a dictionary named 'd' in order to iterate
through each item stored in the dictionary.
See also
dictionary_freekeys()
Returns
Parameters
d The dictionary instance.
key The key associated with the value to lookup.
value The address of variable to hold the value associated with the key.
Returns
36.8.4.43 t_max_err dictionary_getstring ( C74_CONST t_dictionary ∗ d, t_symbol ∗ key, const char ∗∗ value )
Returns
Returns
Returns
Returns
See also
object_free()
Returns
36.8.4.48 t_max_err dictionary_read_yaml ( const char ∗ filename, const short path, t_dictionary ∗∗ d )
Returns
Create a new dictionary populated with values using a combination of attribute and sprintf syntax.
Parameters
fmt An sprintf-style format string specifying key-value pairs with attribute nomenclature.
... One or more arguments which are to be substituted into the format string.
Returns
Remarks
One common use of this to create dictionary that represents an element of a patcher, or even an entire patcher
itself. The example below creates a dictionary that can be passed to a function like newobject_fromdictionary()
to create a new object.
1 t_dictionary *d;
2 char text[4];
3
4 strncpy_zero(text, "foo", 4);
5
6 d = dictionary_sprintf("@maxclass comment @varname _name \
7 @text \"%s\" @patching_rect %.2f %.2f %.2f %.2f \
8 @fontsize %f @textcolor %f %f %f 1.0 \
9 @fontname %s @bgcolor 0.001 0.001 0.001 0.",
10 text, 20.0, 20.0, 200.0, 24.0,
11 18, 0.9, 0.9, 0.9, "Arial");
12
13 // do something with the dictionary here.
14
15 object_free(d);
See also
newobject_sprintf()
newobject_fromdictionary()
atom_setparse()
Returns
36.8.4.51 t_max_err dictionary_write_yaml ( const t_dictionary ∗ d, const char ∗ filename, const short path )
Parameters
d The dictionary to serialize into YAML format and write to disk.
filename The name of the file to write.
path The path to which the file should be written.
Returns
A hash table is a data structure that associates some data with a unique key.
Collaboration diagram for Hash Table:
Data Structures
• struct t_hashtab_entry
A hashtab entry.
• struct t_hashtab
The hashtab object.
Macros
• #define HASH_DEFSLOTS
Default number of slots in the hash table.
Functions
A hash table is a data structure that associates some data with a unique key.
If you know the key, you can get back the data much more quickly than with a linked list, particularly as the number
of items stored grows larger. The Max hash table t_hashtab is optimized to work with symbol pointers as keys, but
you can use any pointer or number, as long as it is unique.
To create a t_hashtab, you use hashtab_new(). To add items, use hashtab_store(). To find items that have been
added, use hashtab_lookup().
By contrast with linked lists and arrays, hash tables do not have a strong sense of ordering. You can iterate through
all items using hashtab_funall(), but the exact order is not under your control as items are added and removed.
There is also no way to "sort" a hash table.
Example:
The following example creates a hashtab, shows how to add some data (in this case, just a number), look it up, and
delete the hashtab.
if (!result)
post("found the value and it is %ld",value);
else
post("did not find the value");
hashtab_chuck(tab);
Note that the Max t_dictionary used for managing patcher data is implemented internally using both a t_hashtab
and a t_linklist in parallel. The t_hashtab provides fast access, and the t_linklist provides sorting.
See also
http://en.wikipedia.org/wiki/Hash_table
Linked List
Returns
See also
object_free
Parameters
x The hashtab instance.
key The key of the item to delete.
Returns
See also
hashtab_delete
Returns
See also
hashtab_flags()
hashtab_delete()
Remove an item from a hashtab associated with the specified key and free it.
The hashtab can contain a variety of different types of data. By default, the hashtab assumes that all items are max
objects with a valid t_object header. Thus by default, it frees items by calling object_free() on them.
You can alter the hashtab's notion of what it contains by using the hashtab_flags() method.
If you wish to remove an item from the hashtab and free it yourself, then you should use hashtab_chuckkey().
Parameters
x The hashtab instance.
key The key of the item to delete.
Returns
See also
hashtab_chuckkey()
hashtab_clear()
hashtab_flags()
36.9.3.5 t_max_err hashtab_findfirst ( t_hashtab ∗ x, void ∗∗ o, long cmpfnvoid ∗, void ∗, void ∗ cmpdata )
Search the hash table for the first item meeting defined criteria.
The items in the hashtab are iteratively processed, calling a specified comparison function on each until the com-
parison function returns true.
Parameters
x The hashtab instance.
o The address to pointer that will be set with the matching item.
cmpfn The function used to determine a match in the list.
cmpdata An argument to be passed to the t_cmpfn. This will be passed as the second of the two args
to the t_cmpfn. The first arg will be the hashtab item at each iteration in the list.
Returns
See also
linklist_findfirst()
t_cmpfn
Returns
Remarks
The hashtab_funall() method will call your function for every item in the list. It will pass both a pointer to the
item in the list, and any argument that you provide. The following example shows a function that could be
called by hashtab_funall().
1 void myFun(t_hashtab_entry *e, void *myArg)
2 {
3 if (e->key && e->value) {
4 // do something with e->key, e->value, and myArg here as appropriate
5 }
6 }
Referenced by jit_class_addinterface().
Parameters
x The hashtab instance.
Returns
Retrieve the flags for an item stored in the hashtab with a given key.
Parameters
x The hashtab instance.
key The key in the hashtab whose flags will be returned.
Returns
See also
hashtab_store_flags()
Returns
Remarks
The following example demonstrates fetching all of the keys from a hashtab in order to iterate through each
item stored in the hashtab.
1 t_symbol **keys = NULL;
2 long numKeys = 0;
3 long i;
4 t_object *anItem;
5
6 hashtab_getkeys(aHashtab, &numKeys, &keys);
7 for(i=0; i<numKeys; i++){
8 hashtab_lookup(aHashtab, keys[i], &anItem);
9 // Do something with anItem here...
10 }
11 if(keys)
12 sysmem_freeptr(keys);
Parameters
x The hashtab instance.
Returns
Change the flags for an item stored in the hashtab with a given key.
Parameters
x The hashtab instance.
key The key in the hashtab whose flags will be changed.
flags One of the values listed in e_max_datastore_flags.
Returns
See also
hashtab_store_flags()
Returns
See also
36.9.3.14 t_max_err hashtab_lookupflags ( t_hashtab ∗ x, t_symbol ∗ key, t_object ∗∗ val, long ∗ flags )
Return an item stored in a hashtab with the specified key, also returning the items flags.
Parameters
x The hashtab instance.
key The key in the hashtab to fetch.
val The address of a pointer to which the fetched value will be assigned.
flags The address of a value to which the fetched flags will be assigned.
Returns
See also
hashtab_lookup()
hashtab_store_flags()
Returns
See also
Returns
See also
Parameters
x The hashtab instance.
s The name of the message to send to the objects.
... Any arguments to be sent with the message.
Returns
Remarks
Internally, this function uses object_method(), meaning that no errors will be posted if the message name does
not exist for the object. It also means that messages sent methods with A_GIMME definitions will need to be
given a symbol argument prior to the argc and argv array information.
Returns
See also
HASH_DEFSLOTS
object_free()
hashtab_chuck()
Referenced by jit_class_addinterface().
Parameters
x The hashtab instance.
readonly A 1 or 0 for setting the readonly bit.
Returns
See also
Referenced by jit_class_addinterface().
Returns
See also
hashtab_store()
36.9.3.23 t_max_err hashtab_storeflags ( t_hashtab ∗ x, t_symbol ∗ key, t_object ∗ val, long flags )
Store an item in a hashtab with an associated key and also flags that define the behavior of the item.
The hashtab_store() method is the same as calling this method with the default (0) flags.
Parameters
x The hashtab instance.
key The key in the hashtab with which to associate the value.
val The value to store.
flags One of the values listed in e_max_datastore_flags.
Returns
See also
hashtab_store()
Returns
See also
Returns
See also
An indexmap is basically a managed array of pointers, but it allows you to derive relatively quickly the index from a
pointer in the array.
Collaboration diagram for Index Map:
Data Structures
• struct t_indexmap_entry
An indexmap element.
• struct t_indexmap
An indexmap object.
Functions
An indexmap is basically a managed array of pointers, but it allows you to derive relatively quickly the index from a
pointer in the array.
The index is assumed to be 0-N (where N is the current size of the array). You can sort the data and retain access
to an index from the data relatively quickly. There is a hashtab which holds pieces of memory that hold indices
that can be referenced by the data pointer. There is also an array of data pointers – this is in "index" order. When
operations take place on the array (insert, delete, sort), the pointers in the hashtab are updated with new indices.
Returns
Returns
Parameters
x The indexmap instance.
index The index of the item to remove from the indexmap.
Returns
Returns
Returns
Returns
Parameters
x The indexmap instance.
data The item whose index you wish to look up.
index The address of a variable to hold the retrieved index.
Returns
Returns
Returns
See also
linklist_sort()
The Max t_linklist data structure is useful for maintaining ordered lists of items where you want to be able to insert
and delete items efficiently.
Collaboration diagram for Linked List:
Data Structures
• struct t_llelem
A linklist element.
• struct t_linklist
The linklist object.
Functions
The Max t_linklist data structure is useful for maintaining ordered lists of items where you want to be able to insert
and delete items efficiently.
Random access of individual items, however, gets appreciably slower as the list grows in size. The t_linklist is
thread-safe by default, but thread safety can be turned off for performance benefits in single-threaded applica-
tions. However, ensure that your use of the linked list is truly single-threaded (based on an understanding of Max's
Threading model) before turning off the thread safety features.
By default, the t_linklist holds pointers to Max objects. However, you can treat what the linklist holds as data rather
than objects to be freed by using the linklist_flags() function.
Here is a simple example of the use of t_linklist. The code below stores five symbols, sorts them, searches for a
specific item, deletes an item, prints all items, and then frees the entire structure. Since symbols in Max are never
freed, linklist_flags() is used to specify that data, rather than object pointers, are being stored.
void mylistfun()
{
t_linklist *list;
// sort
linklist_sort(list, (t_cmpfn)mysortfun);
// search
index = linklist_findfirst(list, &found, mysearchfun,
gensym("four")); // find the "four" symbol
if (index != -1) // found
linklist_chuckindex(list, index);
// iterate
linklist_funall(list, myprintfun, NULL);
// delete
linklist_chuck(list);
}
The sorting function compares two items in the list and returns non-zero if the first one should go before the second
one.
The search function is passed the final argument to linklist_findfirst() and, in this case, just returns the symbol
that matches, which is just testing for pointer equivalence since all Max symbols are unique. You could do more
sophisticated searching if you store more complex data in a linklist.
The iteration function takes some action on all items in the list. The third argument to linklist_funall() is passed as
the second argument to your iteration function. In this example, we don't do anything with it.
See also
http://en.wikipedia.org/wiki/Linked_list
Returns
The updated size of the linklist after appending the new item, or -1 if the append failed.
Referenced by jit_linklist_append().
See also
object_free
Returns
See also
linklist_deleteindex
linklist_chuckobject
Referenced by jit_linklist_chuckindex().
See also
linklist_deleteindex
linklist_chuckindex
linklist_deleteobject
Remove the item from the list at the specified index and free it.
The linklist can contain a variety of different types of data. By default, the linklist assumes that all items are max
objects with a valid t_object header. Thus by default, it frees items by calling object_free() on them.
You can alter the linklist's notion of what it contains by using the linklist_flags() method.
If you wish to remove an item from the linklist and free it yourself, then you should use linklist_chuckptr().
Parameters
x The linklist instance.
index The index of the item to delete.
Returns
Returns the index number of the item delted, or -1 if the operation failed.
See also
linklist_chuckindex
linklist_chuckobject
Referenced by jit_linklist_deleteindex().
See also
linklist_deleteindex
linklist_chuckindex
linklist_chuckobject
36.11.2.8 void linklist_findall ( t_linklist ∗ x, t_linklist ∗∗ out, long cmpfnvoid ∗, void ∗, void ∗ cmpdata )
Search the linked list for all items meeting defined criteria.
The items in the list are traversed, calling a specified comparison function on each, and returning the matches in
another linklist.
Parameters
x The linklist instance.
out The address to a t_linklist pointer. You should initialize the pointer to NULL before calling
linklist_findall(). A new linklist will be created internally by linklist_findall() and returned here.
cmpfn The function used to determine a match in the list.
cmpdata An argument to be passed to the t_cmpfn. This will be passed as the second of the two args
to the t_cmpfn. The first arg will be the linklist item at each iteration in the list.
Remarks
The following example assumes you have a linklist called myLinkList, and t_cmpfn called myCmpFunction,
and some sort of data to match in someCriteria.
See also
linklist_match
t_cmpfn
linklist_findfirst
36.11.2.9 t_atom_long linklist_findfirst ( t_linklist ∗ x, void ∗∗ o, long cmpfnvoid ∗, void ∗, void ∗ cmpdata )
Search the linked list for the first item meeting defined criteria.
The items in the list are traversed, calling a specified comparison function on each until the comparison function
returns true.
Parameters
x The linklist instance.
o The address to pointer that will be set with the matching item.
cmpfn The function used to determine a match in the list.
cmpdata An argument to be passed to the t_cmpfn. This will be passed as the second of the two args
to the t_cmpfn. The first arg will be the linklist item at each iteration in the list.
Returns
Remarks
See also
linklist_match
t_cmpfn
linklist_findall
Referenced by jit_linklist_findfirst().
Remarks
The linklist_funall() method will call your function for every item in the list. It will pass both a pointer to the item
in the list, and any argument that you provide. The following example shows a function that could be called by
linklist_funall().
1 void myFun(t_object *myObj, void *myArg)
2 {
3 // do something with myObj and myArg here
4 // myObj is the item in the linklist
5 }
Remarks
The linklist_funall() method will call your function for every item in the list. It will pass both a pointer to the item
in the list, and any argument that you provide. The following example shows a function that could be called by
linklist_funall().
1 long myFun(t_symbol *myListItemSymbol, void *myArg)
2 {
3 // this function is called by a linklist that contains symbols for its items
4 if(myListItemSymbol == gensym("")){
5 error("empty symbol -- aborting linklist traversal")
6 return 1;
7 }
8 else{
9 // do something with the symbol
10 return 0;
11 }
12 }
Remarks
The linklist_funindex() method will call your function for an item in the list. It will pass both a pointer to the item
in the list, and any argument that you provide. The following example shows a function that could be called by
linklist_funindex().
Returns
Returns
The item from the linklist stored at index. If there is no item at the index, NULL is returned
Referenced by jit_linklist_getindex().
Returns
Insert an item into the list, keeping the list sorted according to a specified comparison function.
Parameters
x The linklist instance.
o The item pointer to insert.
cmpfn A comparison function by which the list should be sorted.
Returns
The index of the new item in the linklist, or -1 if the insert failed.
Parameters
x The linklist instance.
o The item pointer to insert.
objptr The item pointer after which to insert in the list.
Returns
Returns
Returns
Referenced by jit_linklist_insertindex().
Returns
Parameters
x The linklist instance.
a The address of the first pointer in the array to fill.
max The number of pointers in the array.
Returns
The number of items from the list actually returned in the array.
Referenced by jit_linklist_makearray().
A linklist comparison method that determines if two item pointers are equal.
Parameters
a The first item to compare.
b The second item to compare.
Returns
See also
t_cmpfn
Remarks
Internally, this function uses object_method(), meaning that no errors will be posted if the message name does
not exist for the object. It also means that messages sent methods with A_GIMME definitions will need to be
given a symbol argument prior to the argc and argv array information.
Referenced by jit_linklist_methodall().
Parameters
x The linklist instance.
i The index of the item to which to send the message.
s The name of the message to send to the objects.
... Any arguments to be sent with the message.
Remarks
Internally, this function uses object_method(), meaning that no errors will be posted if the message name does
not exist for the object. It also means that messages sent methods with A_GIMME definitions will need to be
given a symbol argument prior to the argc and argv array information.
Referenced by jit_linklist_methodindex().
Move an existing item in the list to a position after another specified item in the list.
Parameters
x The linklist instance.
o The item pointer to insert.
objptr The item pointer after which to move o in the list.
Returns
Move an existing item in the list to a position before another specified item in the list.
Parameters
x The linklist instance.
o The item pointer to insert.
objptr The item pointer before which to move o in the list.
Returns
Returns
See also
object_free()
linklist_chuck()
Referenced by jit_linklist_new().
Returns
The index of the item given in the linklist. If the item is not in the linklist MAX_ERR_GENERIC is returned.
Referenced by jit_linklist_objptr2index().
Parameters
x The linklist instance.
Referenced by jit_linklist_reverse().
Referenced by jit_linklist_rotate().
Referenced by jit_linklist_shuffle().
Remarks
The following is example is a real-world example of sorting a linklist of symbols alphabetically by first letter
only. First the cmpfn is defined, then it is used in a different function by linklist_sort().
Referenced by jit_linklist_sort().
Parameters
x The linklist instance.
p An item in the list.
newp The new value.
Returns
Referenced by jit_linklist_swap().
A quickmap implements a pair of t_hashtab hash tables so that it is fast to look up a unique value for a unique key
or vice-versa.
Collaboration diagram for Quick Map:
Data Structures
• struct t_quickmap
The quickmap object.
Functions
A quickmap implements a pair of t_hashtab hash tables so that it is fast to look up a unique value for a unique key
or vice-versa.
This implies that both the keys and the values must be unique so that look-ups can be performed in both directions.
Parameters
x The quickmap instance.
p1 The (first) key.
p2 The value (or the second key).
Returns
Returns
Returns
Returns
Returns
Max's string object is a simple wrapper for c-strings, useful when working with Max's t_dictionary, t_linklist, or
t_hashtab.
Collaboration diagram for String Object:
Data Structures
• struct t_string
The string object.
Functions
Max's string object is a simple wrapper for c-strings, useful when working with Max's t_dictionary, t_linklist, or
t_hashtab.
See also
Dictionary
Parameters
x The string object instance.
s A string to append/concatenate with the existing string.
Returns
Returns
The symobject class is a simple object that wraps a t_symbol∗ together with a couple of additional fields.
Collaboration diagram for Symbol Object:
Data Structures
• struct t_symobject
The symobject data structure.
Functions
The symobject class is a simple object that wraps a t_symbol∗ together with a couple of additional fields.
It is useful for storing symbols, possibly with additional flags or pointers, into a Hash Table or Linked List.
Version
5.0
Returns
Remarks
The following example shows one common use of the this method.
Returns
The Dictionary Passing API defines a means by which t_dictionary instances may be passed between Max objects
in a way similar to the way Jitter Matrices are passed between objects.
Collaboration diagram for Dictionary Passing API:
Functions
• t_max_err dictobj_key_parse (t_object ∗x, t_dictionary ∗d, t_atom ∗akey, t_bool create, t_dictionary
∗∗targetdict, t_symbol ∗∗targetkey, t_int32 ∗index)
Given a complex key (one that includes potential heirarchy or array-member access), return the actual key and the
dictionary in which the key should be referenced.
The Dictionary Passing API defines a means by which t_dictionary instances may be passed between Max objects
in a way similar to the way Jitter Matrices are passed between objects.
There are important differences, however, between Jitter matrix passing and dictionary passing. Many of these
differences are documented in Max's documentation on dictionaries and structured data.
Every dictionary instance in this system is mapped to a unique name that identifies the dictionary. Dictionaries are
passed between objects using the "dictionary" message with a single argument, which is the name of the dictionary.
The C-API for working with these dictionaries is composed of 5 primary registration/access methods:
• dictobj_register() : register a t_dictionary instance with the system, and map the instance to a name
• dictobj_findregistered_clone() : find the t_dictionary for a given name, and return a copy of that dictionary
• dictobj_findregistered_retain() : find the t_dictionary for a given name, return a pointer to that t_dictionary,
and increment its reference count.
Dictionaries may be represented in a variety of textual formats including JSON. Max also supports a compact Y←-
AML-like dictionary notation which is useful for proving data structure contents as lists of atoms in object boxes.
This format is documented in Max's documentation of the dictionary features. The following functions are used for
formatting and parsing the dictionary syntax.
• dictobj_jsonfromstring()
• dictobj_dictionaryfromstring()
• dictobj_dictionaryfromatoms()
• dictobj_dictionarytoatoms()
36.15.4 Utilities
There are several utility functions available to assist in coding objects that pass dictionaries.
• dictobj_outlet_atoms()
• dictobj_atom_safety()
• dictobj_validate()
The dictobj_validate() object is a utility routine for validating a dictionary against "schema" dictionary. This enables
a behavior somewhat analogous to Objective-C or Smalltalk prototypes. Dictionary validation can be useful to
implement a kind of dictionary polymorphism. For a multiple-inheritance behavior, simply validate a dictionary
against multiple schemas to verify the presence of required keys and values.
36.15.5 Limitations
The dict_outlet_atoms() function will not output A_OBJ atoms directly (nor should any other object) and as such it
will also not output t_atomarray instances containing objects, thus atomarrays are not hierarchical in the dictionary
passing implementation.
It will output an atom array if provided a single A_OBJ atom with class atomarray. If there is an array of atoms which
contain A_OBJ atoms, they are converted to the ∗symbols∗ <dictionary-object>, <atomarray-object>, <string-
object>, <other-object> respectively. Ideally such a case should never be reached if everything which inserts
values into a dictionary is well behaved–i.e.
Version
6.0
a An atom to check, and potentially modify, to ensure safety in the dictionary-passing system.
Returns
Returns
36.15.6.3 t_max_err dictobj_dictionaryfromatoms ( t_dictionary ∗∗ d, const long argc, const t_atom ∗ argv )
Create a new t_dictionary from Dictionary Syntax which is passed in as an array of atoms.
Unlike many t_dictionary calls to create dictionaries, this function does not take over ownership of the atoms you
pass in.
Parameters
d The address of a dictionary variable, which will hold a pointer to the new dictionary upon
return. Should be initialized to NULL.
argc The number of atoms in argv.
argv Pointer to the first of an array of atoms to be interpreted as Dictionary Syntax .
Returns
See also
dictobj_dictionaryfromatoms_extended() dictobj_dictionarytoatoms()
Create a new t_dictionary from from an array of atoms that use Max dictionary syntax, JSON, or compressed JSON.
This function is the C analog to the dict.deserialize object in Max. Unlike many t_dictionary calls to create dictionar-
ies, this function does not take over ownership of the atoms you pass in.
Parameters
d The address of a dictionary variable, which will hold a pointer to the new dictionary upon
return. Should be initialized to NULL.
msg Ignored.
argc The number of atoms in argv.
argv Pointer to the first of an array of atoms to be interpreted as Dictionary Syntax , JSON, or
compressed JSON.
Returns
See also
dictobj_dictionaryfromatoms() dictobj_dictionaryfromstring()
36.15.6.5 t_max_err dictobj_dictionaryfromstring ( t_dictionary ∗∗ d, const char ∗ str, int str_is_already_json, char ∗
errorstring )
Returns
See also
dictobj_dictionarytoatoms()
Returns
See also
dictobj_dictionaryfromatoms()
Find the t_dictionary for a given name, and return a copy of that dictionary When you are done, do not call dictobj←-
_release() on the dictionary, because you are working on a copy rather than on a retained pointer.
Parameters
name The name associated with the dictionary for which you wish to obtain a copy.
Returns
The dictionary cloned from the existing dictionary. Returns NULL if no dictionary is associated with name.
See also
dictobj_findregistered_retain()
Find the t_dictionary for a given name, return a pointer to that t_dictionary, and increment its reference count.
When you are done you should call dictobj_release() on the dictionary.
Parameters
name The name associated with the dictionary for which you wish to obtain a pointer.
Returns
A pointer to the dictionary associated with name. Returns NULL if no dictionary is associated with name.
See also
dictobj_release()
dictobj_findregistered_clone()
36.15.6.9 t_max_err dictobj_jsonfromstring ( long ∗ jsonsize, char ∗∗ json, const char ∗ str )
Returns
See also
dictobj_dictionarytoatoms()
36.15.6.10 t_max_err dictobj_key_parse ( t_object ∗ x, t_dictionary ∗ d, t_atom ∗ akey, t_bool create, t_dictionary
∗∗ targetdict, t_symbol ∗∗ targetkey, t_int32 ∗ index )
Given a complex key (one that includes potential heirarchy or array-member access), return the actual key and the
dictionary in which the key should be referenced.
Parameters
x Your calling object. If there is an error this will be used by the internal call to object_error().
d The dictionary you are querying.
akey The complex key specifying the query.
create If true, create the intermediate dictionaries in the hierarchy specified in akey.
targetdict Returns the t_dictionary that for the (sub)dictionary specified by akey.
targetkey Returns the name of the key in targetdict that to which akey is referencing.
index Returns the index requested if array-member access is specified. Pass NULL if you are not
interested in this.
Returns
Returns
The symbol associated with the dictionary, or NULL if the dictionary is not registered.
See also
dictobj_register()
Send atoms to an outlet in your Max object, handling complex datatypes that may be present in those atoms.
This is particularly when sending the contents of a dictionary entry out of an outlet as in the following example code.
1 long ac = 0;
2 t_atom *av = NULL;
3 t_max_err err;
4
5 err = dictionary_copyatoms(d, key, &ac, &av);
6 if (!err && ac && av) {
7 // handles singles, lists, symbols, atomarrays, dictionaries, etc.
8 dictobj_outlet_atoms(x->outlets[i],ac,av);
9 }
10
11 if (av)
12 sysmem_freeptr(av);
Parameters
out The outlet through which the atoms should be sent.
argc The count of atoms in argv.
argv Pointer to the first of an array of atoms to send to the outlet.
Register a t_dictionary with the dictionary passing system and map it to a unique name.
Parameters
d A valid dictionary object.
name The address of a t_symbol pointer to the name you would like mapped to this dictionary. If
the t_symbol pointer has a NULL value then a unique name will be generated and filled-in
upon return.
Returns
For a t_dictionary/name that was previously retained with dictobj_findregistered_retain(), release it (decrement its
reference count).
Parameters
d A valid dictionary object retained by dictobj_findregistered_retain().
Returns
See also
dictobj_findregistered_retain()
Returns
Parameters
schema The dictionary against which to validate candidate.
candidate A dictionary to test against the schema.
Returns
Returns true if the candidate validates against the schema, otherwise returns false.
See also
dictobj_dictionarytoatoms()
Atoms
Binbufs
Data Types
Atombufs
Symbols
Modules
• Atoms
• Atombufs
An Atombuf is an alternative to Binbufs for temporary storage of atoms.
• Binbufs
You won’t need to know about the internal structure of a Binbuf, so you can use the void ∗ type to refer to one.
• Symbols
Max maintains a symbol table of all strings to speed lookup for message passing.
Data Structures
• struct t_rect
Coordinates for specifying a rectangular region.
• struct t_pt
Coordinates for specifying a point.
• struct t_size
Coordinates for specifying the size of a region.
Typedefs
• typedef void ∗(∗ two_meth) (void ∗x, void ∗z, void ∗a)
Function pointer type for methods with two arguments.
• typedef long ∗(∗ gimmeback_meth) (void ∗x, t_symbol ∗s, long ac, t_atom ∗av, t_atom ∗rv)
Function pointer type for methods that pass back a result value through the last parameter as a t_atom, and return
an error.
36.17 Atoms
Data Structures
• union word
Union for packing any of the datum defined in e_max_atomtypes.
• struct t_atom
An atom is a typed datum.
Macros
• #define ATOM_MAX_STRLEN
Defines the largest possible string size for an atom.
Enumerations
• enum e_max_atomtypes {
A_NOTHING, A_LONG, A_FLOAT, A_SYM,
A_OBJ, A_DEFLONG, A_DEFFLOAT, A_DEFSYM,
A_GIMME, A_CANT, A_SEMI, A_COMMA,
A_DOLLAR, A_DOLLSYM, A_GIMMEBACK, A_DEFER,
A_USURP, A_DEFER_LOW, A_USURP_LOW }
the list of officially recognized types, including pseudotypes for commas and semicolons.
• enum e_max_atom_gettext_flags {
OBEX_UTIL_ATOM_GETTEXT_DEFAULT, OBEX_UTIL_ATOM_GETTEXT_TRUNCATE_ZEROS, OBE←-
X_UTIL_ATOM_GETTEXT_SYM_NO_QUOTE, OBEX_UTIL_ATOM_GETTEXT_SYM_FORCE_QUOTE,
OBEX_UTIL_ATOM_GETTEXT_COMMA_DELIM, OBEX_UTIL_ATOM_GETTEXT_FORCE_ZEROS, OB←-
EX_UTIL_ATOM_GETTEXT_NUM_HI_RES, OBEX_UTIL_ATOM_GETTEXT_NUM_LO_RES }
Flags that determine how functions convert atoms into text (C-strings).
Functions
Flags that determine how functions convert atoms into text (C-strings).
Enumerator
the list of officially recognized types, including pseudotypes for commas and semicolons.
Used in two places: 1. the reader, when it reads a string, returns long, float, sym, comma, semi, or dollar; and
2. each object method comes with an array of them saying what types it needs, from among long, float, sym, obj,
gimme, and cant.
Remarks
While these values are defined in an enum, you should use a long to represent the value. Using the enum
type creates ambiguity in struct size and is subject to various inconsistent compiler settings.
Enumerator
A_DEFER A special signature for declaring methods. This is like A_GIMME, but the call is deferred.
A_USURP A special signature for declaring methods. This is like A_GIMME, but the call is deferred and
multiple calls within one servicing of the queue are filtered down to one call.
A_DEFER_LOW A special signature for declaring methods. This is like A_GIMME, but the call is deferref to
the back of the queue.
A_USURP_LOW A special signature for declaring methods. This is like A_GIMME, but the call is deferred to
the back of the queue and multiple calls within one servicing of the queue are filtered down to one call.
Parameters
ac The address of a variable that will contain the number of atoms allocated (1).
av The address of a pointer that will be set with the new allocated memory for the atom.
alloc Address of a variable that will be set true is memory is allocated, otherwise false.
Returns
36.17.3.2 t_max_err atom_alloc_array ( long minsize, long ∗ ac, t_atom ∗∗ av, char ∗ alloc )
Returns
36.17.3.3 long atom_arg_getdouble ( double ∗ c, long idx, long ac, const t_atom ∗ av )
Retrieves the floating point value, as a double, of a particular t_atom from an atom list, if the atom exists.
Parameters
c Pointer to a double variable to receive the atom's data if the function is successful. Otherwise
the value is left unchanged.
idx Offset into the atom list of the atom of interest, starting from 0. For instance, if you want data
from the 3rd atom in the atom list, idx should be set to 2.
ac Count of av.
av Pointer to the first t_atom of an atom list.
Returns
This function returns the error code MAX_ERR_NONE if successful, or one of the other error codes defined
in e_max_errorcodes if unsuccessful.
Referenced by jit_atom_arg_getdouble().
36.17.3.4 long atom_arg_getfloat ( float ∗ c, long idx, long ac, const t_atom ∗ av )
Retrieves the floating point value of a particular t_atom from an atom list, if the atom exists.
Parameters
c Pointer to a float variable to receive the atom's data if the function is successful. Otherwise,
the value is left unchanged.
idx Offset into the atom list of the atom of interest, starting from 0. For instance, if you want data
from the 3rd atom in the atom list, idx should be set to 2.
ac Count of av.
av Pointer to the first t_atom of an atom list.
Returns
This function returns the error code MAX_ERR_NONE if successful, or one of the other error codes defined
in e_max_errorcodes if unsuccessful.
Referenced by jit_atom_arg_getfloat().
36.17.3.5 t_max_err atom_arg_getlong ( t_atom_long ∗ c, long idx, long ac, const t_atom ∗ av )
Retrieves the integer value of a particular t_atom from an atom list, if the atom exists.
Parameters
c Pointer to a long variable to receive the atom's data if the function is successful.
idx Offset into the atom list of the atom of interest, starting from 0. For instance, if you want data
from the 3rd atom in the atom list, idx should be set to 2.
ac Count of av.
av Pointer to the first t_atom of an atom list.
Returns
This function returns the error code MAX_ERR_NONE if successful, or one of the other error codes defined
in e_max_errorcodes if unsuccessful.
Remarks
The atom_arg_getlong() function only changes the value of c if the function is successful. For instance, the
following code snippet illustrates a simple, but typical use:
Referenced by jit_atom_arg_getlong().
36.17.3.6 t_max_err atom_arg_getobjclass ( t_object ∗∗ x, long idx, long argc, t_atom ∗ argv, t_symbol ∗ cls )
Parameters
x The address of a pointer to the object contained in av if it is of the specified class upon return.
Otherwise NULL upon return.
idx The index of the atom in the array from which to get the object pointer.
argc The count of atoms in argv.
argv The address to the first of an array of atoms.
cls A symbol containing the class name of which the object should be an instance.
Returns
36.17.3.7 long atom_arg_getsym ( t_symbol ∗∗ c, long idx, long ac, const t_atom ∗ av )
Retrieves the t_symbol ∗ value of a particular t_atom from an atom list, if the atom exists.
Parameters
c Pointer to a t_symbol ∗ variable to receive the atom's data if the function is successful. Oth-
erwise, the value is left unchanged.
idx Offset into the atom list of the atom of interest, starting from 0. For instance, if you want data
from the 3rd atom in the atom list, idx should be set to 2.
ac Count of av.
av Pointer to the first t_atom of an atom list.
Returns
This function returns the error code MAX_ERR_NONE if successful, or one of the other error codes defined
in e_max_errorcodes if unsuccessful.
Remarks
The atom_arg_getsym() function only changes the value of c if the function is successful. For instance, the
following code snippet illustrates a simple, but typical use:
1 void myobject_open(t_myobject *x, t_symbol *s, long ac, t_atom *av)
2 {
3 t_symbol *filename = _sym_nothing;
4
5 // here, we are expecting a file name.
6 // if we don’t get it, open a dialog box
7 atom_arg_getsym(&filename, 0, ac, av);
8 if (filename == _sym_nothing) { // i.e. unchanged
9 // open the file dialog box,
10 // get a value for filename
11 }
12 // do something with the filename
13 }
Referenced by jit_atom_arg_getsym().
36.17.3.8 BEGIN_USING_C_LINKAGE void atom_copy ( long argc1, t_atom ∗ argv1, t_atom ∗ argv2 )
36.17.3.9 t_max_err atom_getatom_array ( long ac, t_atom ∗ av, long count, t_atom ∗ vals )
Returns
36.17.3.10 t_max_err atom_getchar_array ( long ac, t_atom ∗ av, long count, unsigned char ∗ vals )
Returns
Returns
This function returns the value of the specified t_atom as an integer between 0 and 255, if possible. Otherwise,
it returns 0.
Remarks
If the t_atom is typed A_LONG, but the data falls outside of the range 0-255, the data is truncated to that
range before output.
If the t_atom is typed A_FLOAT, the floating point value is multiplied by 255. and truncated to the range 0-255
before output. For example, the floating point value 0.5 would be output from atom_getcharfix as 127 (0.5 ∗
255. = 127.5).
No attempt is also made to coerce t_symbol data.
Referenced by jit_atom_getcharfix().
36.17.3.12 t_max_err atom_getdouble_array ( long ac, t_atom ∗ av, long count, double ∗ vals )
Returns
Returns
This function returns the value of the specified t_atom as a floating point number, if possible. Otherwise, it
returns 0.
Remarks
If the t_atom is not of the type specified by the function, the function will attempt to coerce a valid value from
the t_atom. For instance, if the t_atom at is set to type A_LONG with a value of 5, the atom_getfloat() function
will return the value of at as a float, or 5.0. An attempt is also made to coerce t_symbol data.
Referenced by jit_atom_getfloat().
36.17.3.14 t_max_err atom_getfloat_array ( long ac, t_atom ∗ av, long count, float ∗ vals )
Returns
36.17.3.15 t_max_err atom_getformat ( long ac, t_atom ∗ av, C74_CONST char ∗ fmt, ... )
Parameters
ac The number of atoms to parse in av.
av The address of the first t_atom pointer in an array to parse.
fmt An sscanf-style format string specifying types for the atoms.
... One or more arguments which are address of variables to be set according to the fmt string.
Returns
See also
atom_setformat()
Returns
This function returns the value of the specified t_atom as an integer, if possible. Otherwise, it returns 0.
Remarks
If the t_atom is not of the type specified by the function, the function will attempt to coerce a valid value from
the t_atom. For instance, if the t_atom at is set to type A_FLOAT with a value of 3.7, the atom_getlong()
function will return the truncated integer value of at, or 3. An attempt is also made to coerce t_symbol data.
Referenced by jit_atom_getlong().
36.17.3.17 t_max_err atom_getlong_array ( long ac, t_atom ∗ av, long count, t_atom_long ∗ vals )
Returns
Parameters
a Pointer to a t_atom whose value is of interest
Returns
This function returns the value of the specified A_OBJ-typed t_atom, if possible. Otherwise, it returns NULL.
Referenced by jit_atom_getobj().
36.17.3.19 t_max_err atom_getobj_array ( long ac, t_atom ∗ av, long count, t_object ∗∗ vals )
Returns
Returns
Returns
This function returns the value of the specified A_SYM-typed t_atom, if possible. Otherwise, it returns an
empty, but valid, t_symbol ∗, equivalent to gensym(""), or _sym_nothing.
Remarks
Referenced by jit_atom_getsym().
36.17.3.22 t_max_err atom_getsym_array ( long ac, t_atom ∗ av, long count, t_symbol ∗∗ vals )
Parameters
ac The number of atoms allocated in the av parameter.
av The address to the first of an array of allocated atoms.
count The number of values to fetch from the array specified by vals.
vals The address of the array to which is copied the values from av.
Returns
36.17.3.23 t_max_err atom_gettext ( long ac, t_atom ∗ av, long ∗ textsize, char ∗∗ text, long flags )
Returns
See also
atom_setparse()
Returns
This function returns the type of the specified t_atom as defined in e_max_atomtypes
36.17.3.25 t_max_err atom_setatom_array ( long ac, t_atom ∗ av, long count, t_atom ∗ vals )
Returns
36.17.3.26 t_max_err atom_setchar_array ( long ac, t_atom ∗ av, long count, unsigned char ∗ vals )
Returns
36.17.3.27 t_max_err atom_setdouble_array ( long ac, t_atom ∗ av, long count, double ∗ vals )
Returns
Inserts a floating point number into a t_atom and change the t_atom's type to A_FLOAT.
Parameters
a Pointer to a t_atom whose value and type will be modified
b Floating point value to copy into the t_atom
Returns
This function returns the error code MAX_ERR_NONE if successful, or one of the other error codes defined
in e_max_errorcodes if unsuccessful.
Referenced by jit_atom_setfloat().
36.17.3.29 t_max_err atom_setfloat_array ( long ac, t_atom ∗ av, long count, float ∗ vals )
Parameters
ac The number of atoms to try to fetch from the array of floats. You should have at least this
number of atoms allocated in av.
av The address to the first of an array of allocated atoms.
count The number of values in the array specified by vals.
vals The array from which to copy the values into the array of atoms at av.
Returns
36.17.3.30 t_max_err atom_setformat ( long ∗ ac, t_atom ∗∗ av, C74_CONST char ∗ fmt, ... )
Returns
See also
atom_getformat()
atom_setparse()
Inserts an integer into a t_atom and change the t_atom's type to A_LONG.
Parameters
a Pointer to a t_atom whose value and type will be modified
b Integer value to copy into the t_atom
Returns
This function returns the error code MAX_ERR_NONE if successful, or one of the other error codes defined
in e_max_errorcodes if unsuccessful.
Referenced by jit_atom_setlong().
36.17.3.32 t_max_err atom_setlong_array ( long ac, t_atom ∗ av, long count, t_atom_long ∗ vals )
Parameters
ac The number of atoms to try to fetch from the array of longs. You should have at least this
number of atoms allocated in av.
av The address to the first of an array of allocated atoms.
count The number of values in the array specified by vals.
vals The array from which to copy the values into the array of atoms at av.
Returns
Inserts a generic pointer value into a t_atom and change the t_atom's type to A_OBJ.
Parameters
a Pointer to a t_atom whose value and type will be modified
b Pointer value to copy into the t_atom
Returns
This function returns the error code MAX_ERR_NONE if successful, or one of the other error codes defined
in e_max_errorcodes if unsuccessful.
Referenced by jit_atom_setobj().
36.17.3.34 t_max_err atom_setobj_array ( long ac, t_atom ∗ av, long count, t_object ∗∗ vals )
Returns
36.17.3.35 t_max_err atom_setparse ( long ∗ ac, t_atom ∗∗ av, C74_CONST char ∗ parsestr )
Returns
Remarks
The following example will parse the string "foo bar 1 2 3.0" into an array of 5 atoms. The atom types will be
determined automatically as 2 A_SYM atoms, 2 A_LONG atoms, and 1 A_FLOAT atom.
Inserts a t_symbol ∗ into a t_atom and change the t_atom's type to A_SYM.
Parameters
a Pointer to a t_atom whose value and type will be modified
b Pointer to a t_symbol to copy into the t_atom
Returns
This function returns the error code MAX_ERR_NONE if successful, or one of the other error codes defined
in e_max_errorcodes if unsuccessful.
Referenced by jit_atom_setsym().
36.17.3.37 t_max_err atom_setsym_array ( long ac, t_atom ∗ av, long count, t_symbol ∗∗ vals )
Returns
Parameters
a The address of the atom to test.
Returns
Returns
Returns
36.18 Atombufs
Data Structures
• struct t_atombuf
The atombuf struct provides a way to pass a collection of atoms.
Functions
Parameters
argc Number of t_atoms in the argv array. May be 0.
argv Array of t_atoms. If creating an empty Atombuf, you may pass 0.
Returns
atombuf_new() create a new t_atombuf and returns a pointer to it. If 0 is returned, insufficient memory was
available.
36.19 Binbufs
You won’t need to know about the internal structure of a Binbuf, so you can use the void ∗ type to refer to one.
Collaboration diagram for Binbufs:
Functions
You won’t need to know about the internal structure of a Binbuf, so you can use the void ∗ type to refer to one.
Parameters
x Binbuf to receive the items.
s Ignored. Pass NULL.
argc Count of items in the argv array.
argv Array of atoms to add to the Binbuf.
Returns
Returns
1 if there were no t_atoms at the specified offsets, 0 if there's a legitimate t_atom returned in result.
Remarks
To get the first t_atom, set both typeOffset and stuffOffset to 0. Here's an example of getting all the items in a
Binbuf:
1 t_atom holder;
2 long to, so;
3
4 to = 0;
5 so = 0;
6 while (!binbuf_getatom(x, &to, &so, &holder)){
7 // do something with the t_atom
8 }
Parameters
x Binbuf to receive the items.
s Ignored. Pass NULL.
argc Count of items in the argv array.
argv Array of t_atoms to add to the Binbuf.
Remarks
You'll use binbuf_insert() instead of binbuf_append() if you were saving your object into a Binbuf and wanted
a semicolon at the end. If the message is part of a file that will later be evaluated, such as a Patcher file, the
first argument argv[0] will be the receiver of the message and must be a Symbol. binbuf_vinsert() is easier to
use than binbuf_insert(), since you don't have to format your data into an array of Atoms first.
binbuf_insert() will also convert the t_symbols #1 through #9 into $1 through $9. This is used for saving patcher
files that take arguments; you will probably never save these symbols as part of anything you are doing.
Returns
Returns
If binbuf_text encounters an error during its operation, a non-zero result is returned, otherwise it returns 0.
Remarks
Note: Commas, symbols containing a dollar sign followed by a number 1-9, and semicolons are identified by
special pseudo-type constants for you when your text is binbuf-ized.
The following constants in the a_type field of Atoms returned by binbuf_getAtom identify the special symbols A_←-
SEMI, A_COMMA, and A_DOLLAR.
For a t_atom of the pseudo-type A_DOLLAR, the a_w.w_long field of the t_atom contains the number after the dollar
sign in the original text or symbol.
Using these pseudo-types may be helpful in separating 'sentences' and 'phrases' in the input language you design.
For example, the old pop-up umenu object allowed users to have spaces in between words by requiring the menu
items be separated by commas. It's reasonably easy, using binbuf_getatom(), to find the commas in a Binbuf in
order to determine the beginning of a new item when reading the atomized text to be displayed in the menu.
If you want to use a literal comma or semicolon in a symbol, precede it with a backslash (\) character. The backslash
character can be included by using two backslashes in a row.
Returns
If binbuf_totext runs out of memory during its operation, it returns a non-zero result, otherwise it returns 0.
Remarks
binbuf_vinsert() works somewhat like a printf() for Binbufs. It allows you to pass a number of arguments of
different types and insert them into a Binbuf. The entire message will then be terminated with a semicolon.
Only 16 items can be passed to binbuf_vinsert().
The example below shows the implementation of a normal object's save method. The save method requires that you
build a message that begins with #N (the new object) , followed by the name of your object (in this case, represented
by the t_symbol myobject), followed by any arguments your instance creation function requires. In this example, we
save the values of two fields m_val1 and m_val2 defined as longs.
Suppose that such an object had written this data into a file. If you opened the file as text, you would see the
following:
1 #N myobject 10 20;
2 #P newobj 218 82 30 myobject;
The first line will result in a new myobject object to be created; the creation function receives the arguments 10 and
20. The second line contains the text of the object box. The newobj message to a patcher creates the object box
user interface object and attaches it to the previously created myobject object. Normally, the newex message is
used. This causes the object to be created using the arguments that were typed into the object box.
36.19.2.10 short readatom ( char ∗ outstr, char ∗∗ text, long ∗ n, long e, t_atom ∗ ap )
Returns
readatom() returns non-zero if there is more text to read, and zero if it has reached the end of the text. Note
that this return value has the opposite logic from that of binbuf_getatom().
Remarks
This function provides access to the low-level Max text evaluator used by binbuf_text(). It is designed to
operate on a handle of characters (text) and called in a loop, as in the example shown below.
1 long index = 0;
2 t_atom dst;
3 char outstr[256];
4
5 while (readatom(outstr,textHandle,&index,textLength,&dst))
6 {
7 // do something with the resulting t_atom
8 }
An alternative to using readatom is to turn your text into a Binbuf using binbuf_text(), then call binbuf_getatom()
in a loop.
36.20 Symbols
Max maintains a symbol table of all strings to speed lookup for message passing.
Collaboration diagram for Symbols:
Data Structures
• struct t_symbol
The symbol.
Functions
Max maintains a symbol table of all strings to speed lookup for message passing.
If you want to access the bang symbol for example, you’ll have to use the expression gensym("bang"). For example,
gensym() may be needed when sending messages directly to other Max objects such as with object_method() and
outlet_anything(). These functions expect a t_symbol∗, they don’t gensym() character strings for you.
The t_symbol data structure also contains a place to store an arbitrary value. The following example shows how
you can use this feature to use symbols to share values among two different external object classes. (Objects of
the same class can use the code resource’s global variable space to share data.) The idea is that the s_thing field
of a t_symbol can be set to some value, and gensym() will return a reference to the Symbol. Thus, the two classes
just have to agree about the character string to be used. Alternatively, each could be passed a t_symbol that will be
used to share data.
Storing a value:
t_symbol *s;
s = gensym("some_weird_string");
s->s_thing = (t_object *)someValue;
Retrieving a value:
t_symbol *s;
s = gensym("some_weird_string");
someValue = s->s_thing;
Given a C-string, fetch the matching t_symbol pointer from the symbol table, generating the symbol if neccessary.
Parameters
s A C-string to be looked up in Max's symbol table.
Returns
Given a C-string, fetch the matching t_symbol pointer from the symbol table, generating and translating the symbol
if neccessary.
Parameters
s A C-string to be looked up in Max's symbol table and then translated
Returns
These routines assist your object in opening and saving files, as well as locating the user’s files in the Max search
path.
Data Structures
• struct t_fileinfo
Information about a file.
• struct t_path
The path data structure.
• struct t_pathlink
The pathlink data structure.
Macros
• #define MAX_PATH_CHARS
The size you should use when allocating strings for full paths.
• #define MAX_FILENAME_CHARS
The size you should use when allocating strings for filenames.
Typedefs
Enumerations
• enum e_max_path_styles {
PATH_STYLE_MAX, PATH_STYLE_NATIVE, PATH_STYLE_COLON, PATH_STYLE_SLASH,
PATH_STYLE_NATIVE_WIN }
Constants that determine the output of path_nameconform().
• enum e_max_path_types {
PATH_TYPE_IGNORE, PATH_TYPE_ABSOLUTE, PATH_TYPE_RELATIVE, PATH_TYPE_BOOT,
PATH_TYPE_C74, PATH_TYPE_PATH, PATH_TYPE_DESKTOP, PATH_TYPE_TILDE,
PATH_TYPE_TEMPFOLDER, PATH_TYPE_MAXDB }
Constants that determine the output of path_nameconform().
• enum e_max_fileinfo_flags { PATH_FILEINFO_ALIAS, PATH_FILEINFO_FOLDER, PATH_FILEINFO_PA←-
CKAGE }
Flags used to represent properties of a file in a t_fileinfo struct.
• enum e_max_path_folder_flags { PATH_REPORTPACKAGEASFOLDER, PATH_FOLDER_SNIFF, PATH←-
_NOALIASRESOLUTION }
Flags used by functions such as path_foldernextfile() and path_openfolder().
• enum e_max_openfile_permissions { PATH_READ_PERM, PATH_WRITE_PERM, PATH_RW_PERM }
Permissions or mode with which to open a file.
• enum t_sysfile_pos_mode { SYSFILE_ATMARK, SYSFILE_FROMSTART, SYSFILE_FROMLEOF, SYSF←-
ILE_FROMMARK }
Modes used by sysfile_setpos()
• enum t_sysfile_text_flags {
TEXT_LB_NATIVE, TEXT_LB_MAC, TEXT_LB_PC, TEXT_LB_UNIX ,
TEXT_ENCODING_USE_FILE, TEXT_NULL_TERMINATE }
Flags used reading and writing text files.
Functions
Use saveas_promptset() to add a prompt message to the open file dialog displayed by saveas_dialog() or
saveasdialog_extended().
• void ∗ filewatcher_new (t_object ∗owner, C74_CONST short path, C74_CONST char ∗filename)
Create a new filewatcher.
• void fileusage_addfile (void ∗w, long flags, C74_CONST char ∗name, C74_CONST short path)
Add a file to a collective.
• void fileusage_addpackage (void ∗w, C74_CONST char ∗name, t_object ∗subfoldernames)
Add a package to a standalone.
• short open_dialog (char ∗name, short ∗volptr, t_fourcc ∗typeptr, t_fourcc ∗types, short ntypes)
Present the user with the standard open file dialog.
• short saveas_dialog (char ∗filename, short ∗path, short ∗binptr)
Present the user with the standard save file dialog.
• short saveasdialog_extended (char ∗name, short ∗vol, t_fourcc ∗type, t_fourcc ∗typelist, short numtypes)
Present the user with the standard save file dialog with your own list of file types.
• BEGIN_USING_C_LINKAGE t_max_err sysfile_close (t_filehandle f)
Close a file opened with sysfile_open().
• t_max_err sysfile_read (t_filehandle f, t_ptr_size ∗count, void ∗bufptr)
Read a file from disk.
• t_max_err sysfile_readtohandle (t_filehandle f, char ∗∗∗h)
Read the contents of a file into a handle.
• t_max_err sysfile_readtoptr (t_filehandle f, char ∗∗p)
Read the contents of a file into a pointer.
• t_max_err sysfile_write (t_filehandle f, t_ptr_size ∗count, const void ∗bufptr)
Write part of a file to disk.
• t_max_err sysfile_seteof (t_filehandle f, t_ptr_size logeof)
Set the size of a file handle.
• t_max_err sysfile_geteof (t_filehandle f, t_ptr_size ∗logeof)
Get the size of a file handle.
• t_max_err sysfile_setpos (t_filehandle f, t_sysfile_pos_mode mode, t_ptr_int offset)
Set the current file position of a file handle.
• t_max_err sysfile_getpos (t_filehandle f, t_ptr_size ∗filepos)
Get the current file position of a file handle.
• t_max_err sysfile_spoolcopy (t_filehandle src, t_filehandle dst, t_ptr_size size)
Copy the contents of one file handle to another file handle.
• t_max_err sysfile_readtextfile (t_filehandle f, t_handle htext, t_ptr_size maxlen, t_sysfile_text_flags flags)
Read a text file from disk.
• t_max_err sysfile_writetextfile (t_filehandle f, t_handle htext, t_sysfile_text_flags flags)
Write a text file to disk.
• t_max_err sysfile_openhandle (char ∗∗h, t_sysfile_flags flags, t_filehandle ∗fh)
Create a t_filehandle from a pre-existing handle.
• t_max_err sysfile_openptrsize (char ∗p, t_ptr_size length, t_sysfile_flags flags, t_filehandle ∗fh)
Create a t_filehandle from a pre-existing pointer.
These routines assist your object in opening and saving files, as well as locating the user’s files in the Max search
path.
There have been a significant number of changes to these routines (as well as the addition of many functions), so
some history may be useful in understanding their use.
Prior to version 4, Max used a feature of Mac OS 9 called "working directories" to specify files. When you used the
locatefile() service routine, you would get back a file name and a volume number. This name (converted to a Pascal
string) and the volume number could be passed to FSOpen() to open the located file for reading. The open_dialog()
routine worked similarly.
In Mac OSX, working directories are no longer supported. In addition, the use of these "volume" numbers makes it
somewhat difficult to port Max file routines to other operating systems, such as Windows XP, that specify files using
complete pathnames (i.e., "C:\dir1\dir2\file.pat").
However, it is useful to be able to refer to the path and the name of the file separately. The solution involves the
retention of the volume number (now called Path ID), but with a platform- independent wrapper that determines its
meaning. There are now calls to locate, open, and choose files using C filename strings and Path IDs, as well as
routines to convert between a "native" format for specifying a file (such as a full pathname on Windows or an FSRef
on the Macintosh) to the C string and Path ID. As of Max version 5 FSSpecs, long ago deprecated by Apple, are no
longer supported.
Now that paths in Max have changed to use the slash style, as opposed to the old Macintosh colon style (see the
Max 4.3 documentation for a description of the file path styles), there is one function in particular that you will find
useful for converting between the various ways paths can be represented, including operating system native paths.
This function is path_nameconform(). Note that for compatibility purposes Path API functions accept paths in any
number of styles, but will typically return paths, or modify paths inline to use the newer slash style. In addition to
absolute paths, paths relative to the Max Folder, the "Cycling '74" folder and the boot volume are also supported.
See the conformpath.help and ext_path.h files for more information on the various styles and types of paths. See
the "filebyte" SDK example project for a demonstration of how to use the path functions to convert a Max name and
path ref pair to a Windows native path for use with CreateFile().
There are a large number of service routine in the Max 4 kernel that support files, but only a handful will be needed
by most external objects. In addition to the descriptions that follow, you should consult the movie, folder and filedate
examples included with the SDK.
The Sysfile API provides the means of reading and writing files opened by path_createsysfile() and similar. These
functions all make use of an opaque structure, t_filehandle. See the path functions path_opensysfile() and path←-
_createsysfile() described earlier in this chapter for more information. The Sysfile API is relatively similar to parts
of the old Macintosh File Manager API, and not too different from Standard C library file functions. The "filebyte"
example project in the SDK shows how to use these functions to read from a file. It is not safe to mix these routines
with other file routines (e.g. don’t use fopen() to open a file and sysfile_close() to close it).
In addition to being able to use these routines to write cross-platform code in your max externals, another advantage
of the Sysfile API is that it is able to read files stored in the collective file format on both Windows XP and Mac OSX.
36.21.3.1 Paths
36.21.3.2 t_filehandle
• Returned by path_opensysfile
• Refers to an open file you want to read or write using sysfile_read / sysfile_write
• C string
• Can convert to platform-specific format using path_nameconform (not needed if using path_opensysfile)
Use the fileusage routines to add files to a collective when a user chooses to build a collective. Your object can
respond to a "fileusage" message, which is sent by Max when the collective builder is building a collective using the
following:
Then you can use fileusage_addfile() to add any requisite files to the collective.
36.21.5 Filewatchers
Your object can watch a file or folder and be notified of changes. Use filewatcher_new(), filewatcher_start(), and
filewatcher_stop() to implement this functionality. You may wish to use filewatchers sparingly as they can potentially
incur computational overhead in the background.
The size you should use when allocating strings for filenames.
At the time of this writing it supports up to 256 UTF chars
Enumerator
PATH_FILEINFO_ALIAS alias
PATH_FILEINFO_FOLDER folder
PATH_FILEINFO_PACKAGE package (Mac-only)
Enumerator
Enumerator
PATH_REPORTPACKAGEASFOLDER if not true, then a Mac OS package will be reported as a file rather
than a folder.
PATH_FOLDER_SNIFF sniff
PATH_NOALIASRESOLUTION no alias resolution
See also
e_max_path_types
path_nameconform()
Enumerator
See also
e_max_path_styles
path_nameconform()
Enumerator
PATH_TYPE_IGNORE ignore
PATH_TYPE_ABSOLUTE absolute path
PATH_TYPE_RELATIVE relative path
PATH_TYPE_BOOT boot path
PATH_TYPE_C74 Cycling '74 folder.
PATH_TYPE_PATH path
PATH_TYPE_DESKTOP desktop
PATH_TYPE_TILDE "home"
PATH_TYPE_TEMPFOLDER /tmp
PATH_TYPE_MAXDB combi: try PATH_TYPE_C74, PATH_TYPE_TILDE, PATH_TYPE_RELATIVE, PA←-
TH_TYPE_ABSOLUTE in that order
Enumerator
SYSFILE_ATMARK ?
SYSFILE_FROMSTART Calculate the file position from the start of the file.
SYSFILE_FROMLEOF Calculate the file position from the logical end of the file.
SYSFILE_FROMMARK Calculate the file position from the current file position.
Enumerator
36.21.9.1 void fileusage_addfile ( void ∗ w, long flags, C74_CONST char ∗ name, C74_CONST short path )
Parameters
w Handle for the collective builder.
flags If flags == 1, copy this file to support folder of an app instead of to the collective in an app.
name The name of the file.
path The path of the file to add.
Version
36.21.9.3 void∗ filewatcher_new ( t_object ∗ owner, C74_CONST short path, C74_CONST char ∗ filename )
Returns
Remarks
36.21.9.4 short locatefile ( C74_CONST char ∗ name, short ∗ outvol, short ∗ binflag )
Parameters
name A C string that is the name of the file to look for.
outvol The Path ID containing the location of the file if it is found.
binflag If the file found is in binary format (it's of type 'maxb') 1 is returned here; if it's in text format,
0 is returned.
Returns
If a file is found with the name specified by filename, locatefile returns 0, otherwise it returns non-zero.
Remarks
filename and vol can then be passed to binbuf_read to read and open file the file. When using MAXplay, the
search path consists of all subdirectories of the directory containing the MAXplay application. locatefile only
searches for files of type 'maxb' and 'TEXT.'
See also
locatefile_extended()
36.21.9.5 short locatefile_extended ( char ∗ name, short ∗ outvol, t_fourcc ∗ outtype, C74_CONST t_fourcc ∗ filetypelist,
short numtypes )
Version
4.0
Parameters
name The file name for the search, receives actual filename upon return.
outvol The Path ID of the file (if found).
outtype The file type of the file (if found).
filetypelist The file type(s) for which you are searching for, or NULL if any type is acceptable.
numtypes The number of file types in the typelist array (1 if a single entry, 0 if any type is acceptable).
Returns
If a file is found with the name specified by filename, locatefile returns 0, otherwise it returns non-zero.
See also
path_getdefault().
Remarks
The old file search routines locatefile() and locatefiletype() are still supported in Max 4, but the use of a
new routine locatefile_extended() is highly recommended. However, locatefile_extended() has an important
difference from locatefile() and locatefiletype() that may require some rewriting of your code. It modifies its
name parameter in certain cases, while locatefile() and locatefiletype() do not. The two cases where it could
modify the incoming filename string are 1) when an alias is specified, the file pointed to by the alias is returned;
and 2) when a full path is specified, the output is the filename plus the path number of the folder it's in.
This is important because many people pass the s_name field of a t_symbol to locatefile(). If the name field of a
t_symbol were to be modified, the symbol table would be corrupted. To avoid this problem, use strncpy_zero() to
copy the contents of a t_symbol to a character string first, as shown below:
1 char filename[MAX_FILENAME_CHARS];
2 strncpy_zero(filename,str->s_name, MAX_FILENAME_CHARS);
3 result = locatefile_extended(filename,&path,&type,typelist,1);
36.21.9.6 short locatefiletype ( C74_CONST char ∗ name, short ∗ outvol, t_fourcc filetype, t_fourcc creator )
Returns
If a file is found with the name specified by filename, locatefile returns 0, otherwise it returns non-zero.
See also
locatefile_extended()
36.21.9.7 short open_dialog ( char ∗ name, short ∗ volptr, t_fourcc ∗ typeptr, t_fourcc ∗ types, short ntypes )
Returns
0 if the user clicked Open in the dialog box. If the user cancelled, open_dialog() returns a non-zero value.
See also
saveasdialog_extended()
locatefile_extended()
Use open_promptset() to add a prompt message to the open file dialog displayed by open_dialog().
Calling this function before open_dialog() permits a string to displayed in the dialog box instructing the user as
to the purpose of the file being opened. It will only apply to the call of open_dialog() that immediately follows
open_promptset().
Parameters
s A C-string containing the prompt you wish to display in the dialog box.
Returns
Ignore.
See also
open_dialog()
36.21.9.9 t_max_err path_absolutepath ( t_symbol ∗∗ returned_path, const t_symbol ∗ s, const t_fourcc ∗ filetypelist,
short numtypes )
Returns
See also
path_topathname()
locatefile_extended()
36.21.9.11 short path_createsysfile ( C74_CONST char ∗ name, short path, t_fourcc type, t_filehandle ∗ ref )
Parameters
name The name of the file to be opened.
path The Path ID of the file to be opened.
type The file type of the created file.
ref A t_filehandle reference to the opened file will be returned in this parameter.
Returns
An error code.
36.21.9.12 short path_fileinfo ( C74_CONST char ∗ name, C74_CONST short path, t_fileinfo ∗ info )
Returns
36.21.9.13 short path_foldernextfile ( void ∗ xx, t_fourcc ∗ filetype, char ∗ name, short descend )
Returns
Returns non-zero if successful, and zero when there are no more files.
See also
e_max_path_folder_flags
36.21.9.14 short path_frompathname ( C74_CONST char ∗ name, short ∗ path, char ∗ filename )
Create a filename and Path ID combination from a fully qualified file name.
Note that path_frompathname() does not require that the file actually exist. In this way you can use it to convert
a full path you may have received as an argument to a file writing message to a form appropriate to provide to a
routine such as path_createfile().
Parameters
name The extended file path to be converted.
path Contains the Path ID on return.
filename Contains the file name on return.
Returns
Returns
Returns
36.21.9.17 short path_getfilemoddate ( C74_CONST char ∗ filename, C74_CONST short path, t_ptr_uint ∗ date )
Returns
An error code.
Returns
An error code.
36.21.9.19 short path_nameconform ( C74_CONST char ∗ src, char ∗ dst, long style, long type )
Convert a source path string to destination path string using the specified style and type.
Parameters
src A pointer to source character string to be converted.
dst A pointer to destination character string.
style The destination filepath style, as defined in e_max_path_styles
type The destination filepath type, as defined in e_max_path_types
Returns
An error code.
See also
MAX_PATH_CHARS
Returns
The return value of this routine is an internal "folder state" structure used for further folder manipulation. It
should be saved and used for calls to path_foldernextfile() and path_closefolder(). If the folder cannot be found
or accessed, path_openfolder() returns 0.
36.21.9.21 short path_opensysfile ( C74_CONST char ∗ name, C74_CONST short path, t_filehandle ∗ ref, short perm )
Returns
An error code.
36.21.9.22 short path_resolvefile ( char ∗ name, C74_CONST short path, short ∗ outpath )
Resolve a Path ID plus a (possibly extended) file name into a path that identifies the file's directory and a filename.
This routine converts a name and Path ID to a standard form in which the name has no path information and does
not refer to an aliased file.
Parameters
name A file name (which may be fully or partially qualified), will contain the file name on return.
path The Path ID to be resolved.
outpath The Path ID of the returned file name.
Returns
Returns 0 if successful.
36.21.9.24 t_max_err path_toabsolutesystempath ( const short in_path, const char ∗ in_filename, char ∗ out_filepath )
Translates a Max path+filename combo into a correct POSIX absolute path that can be used to pass to libraries and
also handles multiple volumes correctly.
Parameters
in_path The Max path reference
in_filename The name of the file in that path.
out_filepath A string that is MAX_PATH_CHARS in length, which will receive the formatted absolute path
upon return.
Returns
Returns 0 if successful.
See also
path_topotentialname()
path_nameconform()
36.21.9.25 short path_topathname ( C74_CONST short path, C74_CONST char ∗ file, char ∗ name )
Create a fully qualified file name from a Path ID/file name combination.
Unlike path_topotentialname(), this routine will only convert a pathname pair to a valid path string if the path exists.
Parameters
path The path to be used.
file The file name to be used.
name Loaded with the fully extended file name on return.
Returns
36.21.9.26 short path_topotentialname ( C74_CONST short path, C74_CONST char ∗ file, char ∗ name, short check )
Create a fully qualified file name from a Path ID/file name combination, regardless of whether or not the file exists
on disk.
Parameters
path The path to be used.
file The file name to be used.
name Loaded with the fully extended file name on return.
check Flag to check if a file with the given path exists.
Returns
See also
path_topathname()
Returns
0 if the user choose to save the file. If the user cancelled, returns a non-zero value.
See also
open_dialog()
saveasdialog_extended()
locatefile_extended()
Use saveas_promptset() to add a prompt message to the open file dialog displayed by saveas_dialog() or
saveasdialog_extended().
Calling this function before saveasdialog_extended() permits a string to displayed in the dialog box instructing the
user as to the purpose of the file being opened. It will only apply to the call of saveasdialog_extended() that
immediately follows saveas_promptset().
Parameters
s A C-string containing the prompt you wish to display in the dialog box.
Returns
Ignore.
See also
open_dialog()
36.21.9.29 short saveasdialog_extended ( char ∗ name, short ∗ vol, t_fourcc ∗ type, t_fourcc ∗ typelist, short numtypes )
Present the user with the standard save file dialog with your own list of file types.
saveasdialog_extended() is similar to saveas_dialog(), but allows the additional feature of specifying a list of possible
types. These will be displayed in a pop-up menu.
File types found in the typelist argument that match known Max types will be displayed with descriptive text. Un-
matched types will simply display the type name (for example, "foXx" is not a standard type so it would be shown in
the pop-up menu as foXx)
Known file types include:
Parameters
name A C-string containing a default name for the file to save. If the user decides to save a file, its
name is returned here. The C-string should be allocated with a size of at least MAX_FILE←-
NAME_CHARS.
vol If the user decides to save the file, the Path ID of the location chosen is returned here.
type Returns the type of file chosen by the user.
typelist The list of types provided to the user.
numtypes The number of file types in typelist.
Returns
0 if the user choose to save the file. If the user cancelled, returns a non-zero value.
See also
open_dialog()
locatefile_extended()
Returns
An error code.
Returns
An error code.
Parameters
f The file's t_filehandle structure.
filepos The address of a variable to hold the current file position of file handle in bytes.
Returns
An error code.
Returns
An error code.
Returns
An error code.
bufptr Pointer to the buffer that the data will be read into.
Returns
An error code.
Returns
An error code.
Returns
An error code.
Remarks
You should free the pointer, when you are done with it, using sysmem_freehandle().
Returns
An error code.
Remarks
You should free the pointer, when you are done with it, using sysmem_freeptr().
Returns
An error code.
Returns
An error code.
size The number of bytes to copy. If 0 the size of src will be used.
Returns
An error code.
Returns
An error code.
Returns
An error code.
36.22 Jitter
Atom Module
Attribute Module
MOP Module
Memory Module
OB3D Module
Matrix Module
Miscellaneous Utility
Module
Object Module
Class Module
Binary Module
Math Module
Modules
• Atom Module
• Attribute Module
• Binary Module
• Class Module
• Object Module
• Miscellaneous Utility Module
• Linked List Module
• Math Module
• Matrix Module
• Max Wrapper Module
• Memory Module
• MOP Module
• Parallel Utility Module
• MOP Max Wrapper Module
• OB3D Module
• Operator Vector Module
Macros
• #define JIT_ATTR_GET_OPAQUE
private getter (all)
• #define JIT_ATTR_SET_OPAQUE
private setter (all)
• #define JIT_ATTR_GET_OPAQUE_USER
private getter (user)
• #define JIT_ATTR_SET_OPAQUE_USER
private setter (user)
• #define JIT_ATTR_GET_DEFER
defer getter (deprecated)
• #define JIT_ATTR_GET_USURP
usurp getter (deprecated)
• #define JIT_ATTR_GET_DEFER_LOW
defer getter
• #define JIT_ATTR_GET_USURP_LOW
usurp getter
• #define JIT_ATTR_SET_DEFER
defer setter (deprecated)
• #define JIT_ATTR_SET_USURP
usurp setter (deprecated)
• #define JIT_ATTR_SET_DEFER_LOW
defer setter
• #define JIT_ATTR_SET_USURP_LOW
usurp setter
• #define JIT_MATRIX_DATA_HANDLE
data is handle
• #define JIT_MATRIX_DATA_REFERENCE
data is reference to outside memory
• #define JIT_MATRIX_DATA_PACK_TIGHT
data is tightly packed (doesn't use standard 16 byte alignment)
• #define JIT_MATRIX_DATA_FLAGS_USE
necessary if using handle/reference data flags when creating jit_matrix, however, it is never stored in matrix
• #define JIT_MATRIX_MAX_DIMCOUNT
maximum dimension count
• #define JIT_MATRIX_MAX_PLANECOUNT
• #define MAX_JIT_MOP_FLAGS_OWN_NAME
mop flag
• #define MAX_JIT_MOP_FLAGS_OWN_TYPE
mop flag
• #define MAX_JIT_MOP_FLAGS_OWN_DIM
mop flag
• #define MAX_JIT_MOP_FLAGS_OWN_PLANECOUNT
mop flag
• #define MAX_JIT_MOP_FLAGS_OWN_CLEAR
mop flag
• #define MAX_JIT_MOP_FLAGS_OWN_NOTIFY
mop flag
• #define MAX_JIT_MOP_FLAGS_OWN_ADAPT
mop flag
• #define MAX_JIT_MOP_FLAGS_OWN_OUTPUTMODE
mop flag
• #define MAX_JIT_MOP_FLAGS_ONLY_MATRIX_PROBE
mop flag
• #define JIT_MOP_INPUT
mop flag
• #define JIT_MOP_OUTPUT
mop flag
Typedefs
Variables
cached t_symbol
• JIT_EX_DATA t_symbol ∗ _jit_sym_setinfo
cached t_symbol
• JIT_EX_DATA t_symbol ∗ _jit_sym_setinfo_ex
cached t_symbol
• JIT_EX_DATA t_symbol ∗ _jit_sym_getinfo
cached t_symbol
• JIT_EX_DATA t_symbol ∗ _jit_sym_data
cached t_symbol
• JIT_EX_DATA t_symbol ∗ _jit_sym_getdata
cached t_symbol
• JIT_EX_DATA t_symbol ∗ _jit_sym_outputmatrix
cached t_symbol
• JIT_EX_DATA t_symbol ∗ _jit_sym_clear
cached t_symbol
• JIT_EX_DATA t_symbol ∗ _jit_sym_clear_custom
cached t_symbol
• JIT_EX_DATA t_symbol ∗ _jit_sym_err_calculate
cached t_symbol
• JIT_EX_DATA t_symbol ∗ _jit_sym_max_jit_classex
cached t_symbol
• JIT_EX_DATA t_symbol ∗ _jit_sym_setall
cached t_symbol
• JIT_EX_DATA t_symbol ∗ _jit_sym_chuck
cached t_symbol
• JIT_EX_DATA t_symbol ∗ _jit_sym_getsize
cached t_symbol
• JIT_EX_DATA t_symbol ∗ _jit_sym_getindex
cached t_symbol
• JIT_EX_DATA t_symbol ∗ _jit_sym_objptr2index
cached t_symbol
• JIT_EX_DATA t_symbol ∗ _jit_sym_append
cached t_symbol
• JIT_EX_DATA t_symbol ∗ _jit_sym_insertindex
cached t_symbol
• JIT_EX_DATA t_symbol ∗ _jit_sym_deleteindex
cached t_symbol
• JIT_EX_DATA t_symbol ∗ _jit_sym_chuckindex
cached t_symbol
• JIT_EX_DATA t_symbol ∗ _jit_sym_makearray
cached t_symbol
• JIT_EX_DATA t_symbol ∗ _jit_sym_reverse
cached t_symbol
• JIT_EX_DATA t_symbol ∗ _jit_sym_rotate
cached t_symbol
• JIT_EX_DATA t_symbol ∗ _jit_sym_shuffle
cached t_symbol
• JIT_EX_DATA t_symbol ∗ _jit_sym_swap
cached t_symbol
• JIT_EX_DATA t_symbol ∗ _jit_sym_findfirst
cached t_symbol
cached t_symbol
• JIT_EX_DATA t_symbol ∗ _jit_sym_restrict_dim
cached t_symbol
• JIT_EX_DATA t_symbol ∗ _jit_sym_special
cached t_symbol
• JIT_EX_DATA t_symbol ∗ _jit_sym_getspecial
cached t_symbol
• JIT_EX_DATA t_symbol ∗ _jit_sym_adapt
cached t_symbol
• JIT_EX_DATA t_symbol ∗ _jit_sym_decorator
cached t_symbol
• JIT_EX_DATA t_symbol ∗ _jit_sym_frommatrix_trunc
cached t_symbol
• JIT_EX_DATA t_symbol ∗ _jit_sym_ioproc
cached t_symbol
• JIT_EX_DATA t_symbol ∗ _jit_sym_getioproc
cached t_symbol
• JIT_EX_DATA t_symbol ∗ _jit_sym_name
cached t_symbol
• JIT_EX_DATA t_symbol ∗ _jit_sym_types
cached t_symbol
• JIT_EX_DATA t_symbol ∗ _jit_sym_minplanecount
cached t_symbol
• JIT_EX_DATA t_symbol ∗ _jit_sym_maxplanecount
cached t_symbol
• JIT_EX_DATA t_symbol ∗ _jit_sym_mindimcount
cached t_symbol
• JIT_EX_DATA t_symbol ∗ _jit_sym_maxdimcount
cached t_symbol
• JIT_EX_DATA t_symbol ∗ _jit_sym_mindim
cached t_symbol
• JIT_EX_DATA t_symbol ∗ _jit_sym_maxdim
cached t_symbol
• JIT_EX_DATA t_symbol ∗ _jit_sym_gl_points
cached t_symbol
• JIT_EX_DATA t_symbol ∗ _jit_sym_gl_point_sprite
cached t_symbol
• JIT_EX_DATA t_symbol ∗ _jit_sym_gl_lines
cached t_symbol
• JIT_EX_DATA t_symbol ∗ _jit_sym_gl_line_strip
cached t_symbol
• JIT_EX_DATA t_symbol ∗ _jit_sym_gl_line_loop
cached t_symbol
• JIT_EX_DATA t_symbol ∗ _jit_sym_gl_triangles
cached t_symbol
• JIT_EX_DATA t_symbol ∗ _jit_sym_gl_tri_strip
cached t_symbol
• JIT_EX_DATA t_symbol ∗ _jit_sym_gl_tri_fan
cached t_symbol
• JIT_EX_DATA t_symbol ∗ _jit_sym_gl_quads
cached t_symbol
cached t_symbol
• JIT_EX_DATA t_symbol ∗ _jit_sym_bounds
cached t_symbol
• JIT_EX_DATA t_symbol ∗ _jit_sym_boundcalc
cached t_symbol
• JIT_EX_DATA t_symbol ∗ _jit_sym_calcbounds
cached t_symbol
In the past, Max has provided two separate APIs for memory management.
Macros
• #define MM_UNIFIED
This macro being defined means that getbytes and sysmem APIs for memory management are unified.
Functions
In the past, Max has provided two separate APIs for memory management.
One for allocating memory on the stack so that it was interrupt safe, including the getbytes() and freebytes() func-
tions. The other, the "sysmem" API, were for allocating memory on the heap where larger amounts of memory were
needed and the code could be guaranteed to operate at non-interrupt level.
Many things have changed in the environment of recent operating systems (MacOS X and Windows XP/Vista), the
memory routines function differently, and the scheduler is no longer directly triggered by a hardware interrupt. In
Max 5, the sysmem and getbytes API's have been unified, and thus may be used interchangeably.
The memory management unification can be switched on and off in the header files if needed, to compile code for
older versions of Max for example, by changing the use of MM_UNIFIED in the Max headers.
The Sysmem API provides a number of utilities for allocating and managing memory. It is relatively similar to some
of the Macintosh Memory Manager API, and not too different from Standard C library memory functions. It is not safe
to mix these routines with other memory routines (e.g. don’t use malloc() to allocate a pointer, and sysmem_freeptr()
to free it).
This macro being defined means that getbytes and sysmem APIs for memory management are unified.
This is correct for Max 5, but should be commented out when compiling for older max targets.
See also
sysmem_freehandle()
Parameters
b A pointer to the block of memory previously allocated that you want to free.
size The size the block specified (as parameter b) in bytes.
Remarks
Note that freebytes16() will cause memory corruption if you pass it memory that was allocated with getbytes().
Use it only with memory allocated with getbytes16().
Returns
Use getbytes16() to allocate small amounts of non-relocatable memory that is aligned on a 16-byte boundary for
use with vector optimization.
Parameters
size The size to allocate in bytes (up to 32767 bytes).
Returns
Remarks
getbytes16() is identical to getbytes except that it returns memory that is aligned to a 16-byte boundary. This
allows you to allocate storage for vector-optimized memory at interrupt level. Note that any memory allocated
with getbytes16() must be freed with freebytes16(), not freebytes().
Parameters
h The handle to resize.
size The new size to allocate in bytes.
Returns
Ignored.
See also
sysmem_resizehandle()
Returns
See also
sysmem_newhandle()
36.23.4.8 void sysmem_copyptr ( const void ∗ src, void ∗ dst, long bytes )
Referenced by jit_copy_bytes().
Referenced by jit_handle_free().
Parameters
ptr The pointer whose memory will be freed.
Returns
Referenced by jit_handle_size_get().
Returns
Referenced by jit_handle_lock().
Returns
A new t_handle.
Referenced by jit_handle_new().
Parameters
size The size of the handle in bytes that will be allocated.
Returns
A new t_handle.
See also
sysmem_newhandle()
Allocate memory.
This function is similar to NewPtr() or malloc(). It allocates a pointer of a given number of bytes and returns a pointer
to the memory allocated.
Parameters
size The amount of memory to allocate.
Returns
Returns
Returns
An error code.
Add memory to an existing handle and copy memory to the resized portion from a pointer.
This function is similar to PtrAndHand(). It resizes an existing handle by adding a given number of bytes to it and
copies data from a pointer into those bytes.
Parameters
p The existing pointer whose data will be copied into the resized handle.
h The handle which will be enlarged by the size of the pointer.
size The size in bytes that will be added to the handle.
Returns
Add memory to an existing handle and copy memory to the resized portion from a pointer.
Unlike sysmem_ptrandhand(), however, this copies the ptr before the previously exising handle data.
Parameters
p The existing pointer whose data will be copied into the resized handle.
h The handle which will be enlarged by the size of the pointer.
size The size in bytes that will be added to the handle.
Returns
An error code.
Returns
Returns
Referenced by jit_handle_size_set().
Parameters
ptr The pointer to the memory that will be resized.
newsize The new size of the pointer in bytes.
Returns
Returns
36.24 Miscellaneous
Byte Ordering
Table Access
Extending expr
Miscellaneous
Windows
Presets
Console
Modules
• Console
• Byte Ordering
Utilities for swapping the order of bytes to match the Endianness of the required platform.
• Extending expr
If you want to use C-like variable expressions that are entered by a user of your object, you can use the "guts" of
Max’s expr object in your object.
• Table Access
You can use these functions to access named table objects.
• Text Editor Windows
Max has a simple built-in text editor object that can display and edit text in conjunction with your object.
• Presets
Max contains a preset object that has the ability to send preset messages to some or all of the objects (clients) in a
Patcher window.
• Loading Max Files
Several high-level functions permit you to load patcher files.
• Monitors and Displays
Functions for finding our information about the environment.
• Windows
• Mouse and Keyboard
Macros
Typedefs
Enumerations
• enum e_max_errorcodes {
MAX_ERR_NONE, MAX_ERR_GENERIC, MAX_ERR_INVALID_PTR, MAX_ERR_DUPLICATE,
MAX_ERR_OUT_OF_MEM }
Standard values returned by function calls with a return type of t_max_err.
• enum e_max_wind_advise_result { aaYes, aaNo, aaCancel }
Returned values from wind_advise()
Functions
Strip quotes from the beginning and end of a symbol if they are present.
• void error_sym (void ∗x, t_symbol ∗s)
Posts an error message to the Max window.
• void post_sym (void ∗x, t_symbol ∗s)
Posts a message to the Max window.
• t_max_err symbolarray_sort (long ac, t_symbol ∗∗av)
Performs an ASCII sort on an array of t_symbol ∗s.
• void object_obex_quickref (void ∗x, long ∗numitems, t_symbol ∗∗items)
Developers do not need to directly use the object_obex_quickref() function.
• void error_subscribe (t_object ∗x)
Receive messages from the error handler.
• void error_unsubscribe (t_object ∗x)
Remove an object as an error message recipient.
• void quittask_install (method m, void ∗a)
Register a function that will be called when Max exits.
• void quittask_remove (method m)
Unregister a function previously registered with quittask_install().
• short maxversion (void)
Determine version information about the current Max environment.
• BEGIN_USING_C_LINKAGE char ∗ strncpy_zero (char ∗dst, const char ∗src, long size)
Copy the contents of one string to another, in a manner safer than the standard strcpy() or strncpy().
• char ∗ strncat_zero (char ∗dst, const char ∗src, long size)
Concatenate the contents of one string onto the end of another, in a manner safer than the standard strcat() or
strncat().
• int snprintf_zero (char ∗buffer, size_t count, const char ∗format,...)
Copy the contents of a string together with value substitutions, in a manner safer than the standard sprintf() or
snprintf().
• short wind_advise (t_object ∗w, char ∗s,...)
Throw a dialog which may have text and up to three buttons.
• void wind_setcursor (short which)
Change the cursor.
• void classname_openrefpage_ext (t_symbol ∗classnamespace, char ∗classname)
Show the refpage for a given class.
Ensure that any definitions following this macro use a C-linkage, not a C++ linkage.
The Max API uses C-linkage. This is important for objects written in C++ or that use a C++ compiler. This macro
must be balanced with the END_USING_C_LINKAGE macro.
Find byte offset of a named member of a struct, relative to the beginning of that struct.
Parameters
x The name of the struct
y The name of the member
Returns
A pointer-sized integer representing the number of bytes into the struct where the member begins.
Returns
Returns
Returns
Parameters
a The first value to compare.
b The second value to compare.
Returns
Returns
Enumerator
MAX_ERR_NONE No error.
MAX_ERR_GENERIC Generic error.
MAX_ERR_INVALID_PTR Invalid Pointer.
MAX_ERR_DUPLICATE Duplicate.
MAX_ERR_OUT_OF_MEM Out of memory.
Enumerator
Parameters
classnamespace The namespace for the class, e.g. "box".
classname The name of the class.
Remarks
error_subscribe() enables your object to receive a message (error), followed by the list of atoms in the error
message posted to the Max window.
Prior to calling error_subscribe(), you should bind the error message to an internal error handling routine:
name The name of the t_symbol to which the object will be bound.
flags Pass 0.
Returns
36.24.4.6 void globalsymbol_dereference ( t_object ∗ x, C74_CONST char ∗ name, C74_CONST char ∗ classname )
Stop referencing an object that is bound to a t_symbol, previously referenced using globalsymbol_reference().
Parameters
x The object that is getting the reference to the symbol.
name The name of the symbol to reference.
classname The name of the class of which the object we are referencing should be an instance.
See also
globalsymbol_reference()
Returns
Remarks
An example of real-world use is to get the buffer∼ object associated with a symbol.
1 // the struct of our object
2 typedef struct _myobject {
3 t_object obj;
4 t_symbol *buffer_name;
5 t_buffer *buffer_object;
6 } t_myobject;
7
8 void myobject_setbuffer(t_myobject *x, t_symbol *s, long argc, t_atom *argv)
9 {
10 if(s != x->buffer_name){
11 // Reference the buffer associated with the incoming name
12 x->buffer_object = (t_buffer *)globalsymbol_reference((t_object *)x, s->s_name, "buffer~");
13
14 // If we were previously referencing another buffer, we should not longer reference it.
15 globalsymbol_dereference((t_object *)x, x->buffer_name->s_name, "buffer~");
16
17 x->buffer_name = s;
18 }
19 }
Parameters
x The object from which to unbind the t_symbol.
name The name of the t_symbol from which the object will be unbound.
flags Pass 0.
Returns
Remarks
quittask_install() provides a mechanism for your external to register a routine to be called prior to Max shut-
down. This is useful for objects that need to provide disk-based persistance outside the standard Max storage
mechanisms, or need to shut down hardware or their connection to system software and cannot do so in the
termination routine of a code fragment.
Parameters
m Function to be removed as a shutdown method.
36.24.4.14 int snprintf_zero ( char ∗ buffer, size_t count, const char ∗ format, ... )
Copy the contents of a string together with value substitutions, in a manner safer than the standard sprintf() or
snprintf().
This is the prefered function to use for this operation in Max.
Parameters
buffer The destination string (already allocated) for the copy.
count The number of chars allocated to the buffer string.
format The source string that will be copied, which may include sprintf() formatting codes for substi-
tutions.
... An array of arguments to be substituted into the format string.
36.24.4.15 char∗ strncat_zero ( char ∗ dst, const char ∗ src, long size )
Concatenate the contents of one string onto the end of another, in a manner safer than the standard strcat() or
strncat().
This is the prefered function to use for this operation in Max.
Parameters
dst The destination string onto whose end the src string will be appended.
src The source string that will be copied.
size The number of chars allocated to the dst string.
36.24.4.16 BEGIN_USING_C_LINKAGE char∗ strncpy_zero ( char ∗ dst, const char ∗ src, long size )
Copy the contents of one string to another, in a manner safer than the standard strcpy() or strncpy().
This is the prefered function to use for this operation in Max.
Parameters
dst The destination string (already allocated) for the copy.
src The source string that will be copied.
size The number of chars allocated to the dst string.
Strip quotes from the beginning and end of a symbol if they are present.
Parameters
s The symbol to be stipped.
Returns
Returns
Returns
This function returns the error code MAX_ERR_NONE if successful, or one of the other error codes defined
in e_max_errorcodes if unsuccessful.
Referenced by jit_object_exportattrs().
Returns
One of the values defined in e_max_wind_advise_result, depending on what the user selected.
1 #define C_ARROW 1
2 #define C_WATCH 2
3 #define C_IBEAM 3
4 #define C_HAND 4
5 #define C_CROSS 5
6 #define C_PENCIL 6
7 #define C_GROW 8
Remarks
wind_setcursor() keeps track of what the cursor was previously set to, so if something else has changed the
cursor, you may not see a new cursor if you set it to the previous argument to wind_setcursor().
The solution is to call wind_setcursor(0) before calling it with the desired cursor constant. Use wind_setcursor(-1)
to tell Max you’ll set the cursor to your own cursor directly.
36.25 Console
Miscellaneous Console
Functions
Parameters
fmt A C-string containing text and printf-like codes specifying the sizes and formatting of the
additional arguments.
... Arguments of any type that correspond to the format codes in fmtString.
Remarks
Particularly on MacOS 10.5, posting to Console.app can be a computationally expensive operation. Use with
care.
See also
post()
object_post()
Parameters
fmt A C-string containing text and printf-like codes specifying the sizes and formatting of the
additional arguments.
... Arguments of any type that correspond to the format codes in fmtString.
See also
object_post()
post()
cpost()
Print text to the Max window, linked to an instance of your object, and flagged as an error (highlighted with a red
background).
Max window rows which are generated using object_post() or object_error() can be double-clicked by the user to
have Max assist with locating the object in a patcher. Rows created with object_post() and object_error() will also
automatically provide the name of the object's class in the correct column in the Max window.
Parameters
See also
object_post()
object_warn()
Print text to the Max window, linked to an instance of your object, and flagged as an error (highlighted with a red
background), and grab the user's attention by displaying a banner in the patcher window.
This function should be used exceedingly sparingly, with preference given to object_error() when a problem occurs.
Parameters
x A pointer to your object.
s A C-string containing text and printf-like codes specifying the sizes and formatting of the
additional arguments.
... Arguments of any type that correspond to the format codes in fmtString.
See also
object_post()
object_error()
Remarks
Example:
See also
object_error()
Print text to the Max window, linked to an instance of your object, and flagged as a warning (highlighted with a yellow
background).
Max window rows which are generated using object_post(), object_error(), or object_warn can be double-clicked by
the user to have Max assist with locating the object in a patcher. Rows created with object_post(), object_error(), or
object_warn() will also automatically provide the name of the object's class in the correct column in the Max window.
Parameters
x A pointer to your object.
s A C-string containing text and printf-like codes specifying the sizes and formatting of the
additional arguments.
... Arguments of any type that correspond to the format codes in fmtString.
See also
object_post()
object_error()
See also
error()
object_error()
object_error_obtrusive()
... Arguments of any type that correspond to the format codes in fmtString.
Remarks
Note that post only passes 16 bytes of arguments to sprintf, so if you want additional formatted items on a
single line, use postatom().
Example:
1 short whatIsIt;
2
3 whatIsIt = 999;
4 post ("the variable is %ld",(long)whatIsIt);
Remarks
See also
object_post()
error()
cpost()
Referenced by jit_gl_report_error().
Print multiple items in the same line of text in the Max window.
This function prints a single t_atom on a line in the Max window without a carriage return afterwards, as post() does.
Each t_atom printed is followed by a space character.
Parameters
ap The address of a t_atom to print.
See also
object_post()
post()
cpost()
Utilities for swapping the order of bytes to match the Endianness of the required platform.
Collaboration diagram for Byte Ordering:
Macros
• #define BYTEORDER_SWAPW16(x)
Switch the byte ordering of a short integer.
• #define BYTEORDER_SWAPW32(x)
Switch the byte ordering of an integer.
• #define BYTEORDER_SWAPW64(x)
Switch the byte ordering of an integer.
• #define BYTEORDER_SWAPF32
Switch the byte ordering of a float.
• #define BYTEORDER_SWAPF64
Switch the byte ordering of a double.
Utilities for swapping the order of bytes to match the Endianness of the required platform.
An introduction to the issue of endianness can be found at http://en.wikipedia.org/wiki/←-
Endianness.
Of particular relevance is that a Macintosh with a PPC processor uses a Big-endian byte ordering, whereas an Intel
processor in a Mac or Windows machine will use a Little-endian byte ordering.
These utilities are defined to assist with cases where byte ordering needs to be manipulated for floats or ints. Note
that floats are subject to the same byte ordering rules as integers. While the IEEE defines the bits, the machine still
defines how the bits are arranged with regard to bytes.
Returns
Parameters
x A double.
Returns
A double.
Returns
Returns
Returns
If you want to use C-like variable expressions that are entered by a user of your object, you can use the "guts" of
Max’s expr object in your object.
Collaboration diagram for Extending expr:
Data Structures
• struct t_ex_ex
ex_ex.
• struct t_expr
Struct for an instance of expr.
Enumerations
• enum e_max_expr_types {
ET_INT, ET_FLT, ET_OP, ET_STR,
ET_TBL, ET_FUNC, ET_SYM, ET_VSYM,
ET_LP, ET_LB, ET_II, ET_FI,
ET_SI }
Defines for ex_type.
Functions
If you want to use C-like variable expressions that are entered by a user of your object, you can use the "guts" of
Max’s expr object in your object.
For example, the if object uses expr routines for evaluating a conditional expression, so it can decide whether to
send the message after the words then or else. The following functions provide an interface to expr.
We treat parenthesis and brackets special to keep a pointer to their match in the content.
Enumerator
ET_INT an int
ET_FLT a float
ET_OP operator
ET_STR string
ET_TBL a table, the content is a pointer
ET_FUNC a function
ET_SYM symbol ("string")
ET_VSYM variable symbol ("$s?")
ET_LP left parenthesis
ET_LB left bracket
ET_II and integer inlet
ET_FI float inlet
ET_SI string inlet
36.27.3.1 short expr_eval ( t_expr ∗ x, long argc, t_atom ∗ argv, t_atom ∗ result )
Returns
Remarks
Evaluates the expression in an expr object with arguments in argv and returns the type and value of the
evaluated expression as a t_atom in result. result need only point to a single t_atom, but argv should contain
at least argc t_atom values. If, as in the example shown above under expr_new(), there are “gaps” between
arguments, they should be filled in with t_atom of type A_NOTHING.
Returns
expr_new() creates an expr object from the arguments in argv and returns the type of any expr-style arguments
contained in argv (i.e. $i1, etc.) in atoms in an array pointed to by types.
Remarks
types should already exist as an array of nine t_atom values, all of which will be filled in by expr_new(). If an
argument was not present, it will set to type A_NOTHING. For example, suppose argv pointed to the following
atoms:
1 $i1 (A_SYM)
2 + (A_SYM)
3 $f3 (A_SYM)
4 + (A_SYM)
5 3 (A_LONG)
Functions
Returns
Parameters
s Symbol containing the name of the table object to find.
hp Address of a handle where the table's data will be returned if the named table object is found.
sp Number of elements in the table (its size in longs).
Returns
If no table object is associated with the symbol tableName, table_get() returns a non-zero result.
Remarks
table_get searches for a table associated with the t_symbol tableName. If one is found, a Handle to its
elements (stored as an array of long integers) is returned and the function returns 0. Never count on a table
to exist across calls to one of your methods. Call table_get and check the result each time you wish to use a
table.
1 long **storage,size,value;
2 if (!table_get(gensym("somename"),&storage,&size)) {
3 if (size > 40)
4 value = *((*storage)+40);
5 }
Max has a simple built-in text editor object that can display and edit text in conjunction with your object.
Collaboration diagram for Text Editor Windows:
Max has a simple built-in text editor object that can display and edit text in conjunction with your object.
The routines described here let you create a text editor.
When the editor window is about to be closed, your object could receive as many as three messages. The first
one, okclose, will be sent if the user has changed the text in the window. This is the standard okclose message
that is sent to all "dirty" windows when they are about to be closed, but the text editor window object passes it on to
you instead of doing anything itself. Refer to the section on Window Messages for a description of how to write a
method for the okclose message. It’s not required that you write one—if you don’t, the behavior of the window will
be determined by the setting of the window’s w_scratch bit. If it’s set, no confirmation will be asked when a dirty
window is closed (and no okclose message will be sent to the text editor either). The second message, edclose,
requires a method that should be added to your object at initialization time. The third message, edSave, allows you
to gain access to the text before it is saved, or save it yourself.
See also
36.30 Presets
Max contains a preset object that has the ability to send preset messages to some or all of the objects (clients) in a
Patcher window.
Collaboration diagram for Presets:
Miscellaneous Presets
Functions
Max contains a preset object that has the ability to send preset messages to some or all of the objects (clients) in a
Patcher window.
The preset message, sent when the user is storing a preset, is just a request for your object to tell the preset object
how to restore your internal state to what it is now. Later, when the user executes a preset, the preset object will
send you back the message you had previously said you wanted.
The dialog goes something like this:
• During a store. . . preset object to Client object(s): hello, this is the preset message—tell me how to restore
your stateClient object to preset object: send me int 34 (for example)
The client object won’t know the difference between receiving int 34 from a preset object and receiving a 34 in its
leftmost inlet.
It’s not mandatory for your object to respond to the preset message, but it is something that will make users happy.
All Max user interface objects currently respond to preset messages. Note that if your object is not a user interface
object and implements a preset method, the user will need to connect the outlet of the preset object to its leftmost
inlet in order for it to be sent a preset message when the user stores a preset.
Here’s an example of using preset_store() that specifies that the object would like to receive a set message. We
assume it has one field, myvalue, which it would like to save and restore.
When this preset is executed, the object will receive a set message whose argument will be the value of myvalue.
Note that the same thing can be accomplished more easily with preset_set() and preset_int().
Don’t pass more than 12 items to preset_store(). If you want to store a huge amount of data in a preset, use
binbuf_insert().
The following example locates the Binbuf into which the preset data is being collected, then calls binbuf_insert() on
a previously prepared array of Atoms. It assumes that the state of your object can be restored with a set message.
Give the preset object a general message to restore the current state of your object.
This is a general preset function for use when your object's state cannot be restored with a simple int or set message.
The example below shows the expected format for specifying what your current state is to a preset object. The first
thing you supply is your object itself, followed by the symbol that is the name of your object's class (which you can
retrieve from your object using the macro ob_sym, declared in ext_mess.h). Next, supply the symbol that specifies
the message you want receive (a method for which had better be defined in your class), followed by the arguments
to this message—the current values of your object's fields.
Parameters
fmt C string containing one or more letters corresponding to the types of each element of the
message. s for Symbol, l for long, or f for float.
... Elements of the message used to restore the state of your object, passed directly to the
function as Symbols, longs, or floats. See below for an example that conforms to what the
preset object expects.
Functions
• short readtohandle (C74_CONST char ∗name, short volume, char ∗∗∗h, long ∗sizep)
Load a data file into a handle.
• void ∗ fileload (C74_CONST char ∗name, short vol)
Load a patcher file by name and volume reference number.
• void ∗ intload (C74_CONST char ∗name, short volume, t_symbol ∗s, short ac, t_atom ∗av, short couldedit)
Pass arguments to Max files when you open them.
• void ∗ stringload (C74_CONST char ∗name)
Load a patcher file located in the Max search path by name.
Returns
If the file is found, fileload tries to open the file, evaluate it, open a window, and bring it to the front. A pointer
to the newly created Patcher is returned if loading is successful, otherwise, if the file is not found or there is
insufficient memory, zero is returned.
36.31.2.2 void∗ intload ( C74_CONST char ∗ name, short volume, t_symbol ∗ s, short ac, t_atom ∗ av, short couldedit )
This function loads the specified file and returns a pointer to the created object. Historically, intload() is was used
to open patcher files, whether they are in text or Max binary format. It could also open table files whose contents
begin with the word "table".
Parameters
name Name of the file to open.
volume Path ID specifying the location of the file.
s A symbol.
ac Count of t_atoms in av. To properly open a patcher file, ac should be 9.
av Array of t_atoms that will replace the changeable arguments 1-9. The default behavior could
be to set all these to t_atoms of type A_LONG with a value of 0.
couldedit If non-zero and the file is not a patcher file, the file is opened as a text file.
Returns
If couldedit is non-zero and the file is not a patcher file, it is made into a text editor, and intoad() returns 0. If
couldedit is non-zero, intload() will alert the user to an error and return 0. If there is no error, the value returned
will be a pointer to a patcher or table object.
36.31.2.3 short readtohandle ( C74_CONST char ∗ name, short volume, char ∗∗∗ h, long ∗ sizep )
Returns
If the file is found, readtohandle creates a Handle, reads all the data in the file into it, assigns the handle to
the variable hp, and returns the size of the data in size. readtohandle returns 0 if the file was opened and read
successfully, and non-zero if there was an error.
Returns
If stringload() returns a non-zero result, you can later use freeobject() to close the patcher, or just let users do
it themselves. If stringload() returns zero, no file with the specified name was found or there was insufficient
memory to open it.
Functions
• long jmonitor_getnumdisplays ()
Return the number of monitors on which can be displayed.
• void jmonitor_getdisplayrect (long workarea, long displayindex, t_rect ∗rect)
Return the t_rect for a given display.
• void jmonitor_getdisplayrect_foralldisplays (long workarea, t_rect ∗rect)
Return a union of all display rects.
• void jmonitor_getdisplayrect_forpoint (long workarea, t_pt pt, t_rect ∗rect)
Return the t_rect for the display on which a point exists.
rect The address of a valid t_rect whose values will be filled-in upon return.
Returns
36.33 Windows
Miscellaneous Windows
Functions
Returns
Returns
Returns
Enumerations
• enum t_modifiers {
eCommandKey, eShiftKey, eControlKey, eAltKey,
eLeftButton, eRightButton, eMiddleButton, ePopupMenu,
eCapsLock, eAutoRepeat }
Bit mask values for various meta-key presses on the keyboard.
• enum t_jmouse_cursortype {
JMOUSE_CURSOR_NONE, JMOUSE_CURSOR_ARROW, JMOUSE_CURSOR_WAIT, JMOUSE_CUR←-
SOR_IBEAM,
JMOUSE_CURSOR_CROSSHAIR, JMOUSE_CURSOR_COPYING, JMOUSE_CURSOR_POINTINGHA←-
ND, JMOUSE_CURSOR_DRAGGINGHAND,
JMOUSE_CURSOR_RESIZE_LEFTRIGHT, JMOUSE_CURSOR_RESIZE_UPDOWN, JMOUSE_CURS←-
OR_RESIZE_FOURWAY, JMOUSE_CURSOR_RESIZE_TOPEDGE,
JMOUSE_CURSOR_RESIZE_BOTTOMEDGE, JMOUSE_CURSOR_RESIZE_LEFTEDGE, JMOUSE_C←-
URSOR_RESIZE_RIGHTEDGE, JMOUSE_CURSOR_RESIZE_TOPLEFTCORNER,
JMOUSE_CURSOR_RESIZE_TOPRIGHTCORNER, JMOUSE_CURSOR_RESIZE_BOTTOMLEFTCOR←-
NER, JMOUSE_CURSOR_RESIZE_BOTTOMRIGHTCORNER }
Mouse cursor types.
Functions
• t_modifiers jkeyboard_getcurrentmodifiers ()
Return the last known combination of modifier keys being held by the user.
• t_modifiers jkeyboard_getcurrentmodifiers_realtime ()
Return the current combination of modifier keys being held by the user.
• void jmouse_getposition_global (int ∗x, int ∗y)
Get the position of the mouse cursor in screen coordinates.
• void jmouse_setposition_global (int x, int y)
Set the position of the mouse cursor in screen coordinates.
• void jmouse_setposition_view (t_object ∗patcherview, double cx, double cy)
Set the position of the mouse cursor relative to the patcher canvas coordinates.
• void jmouse_setposition_box (t_object ∗patcherview, t_object ∗box, double bx, double by)
Set the position of the mouse cursor relative to a box within the patcher canvas coordinates.
• void jmouse_setcursor (t_object ∗patcherview, t_object ∗box, t_jmouse_cursortype type)
Set the mouse cursor.
Enumerator
JMOUSE_CURSOR_NONE None.
JMOUSE_CURSOR_ARROW Arrow.
JMOUSE_CURSOR_WAIT Wait.
JMOUSE_CURSOR_IBEAM I-Beam.
JMOUSE_CURSOR_CROSSHAIR Crosshair.
JMOUSE_CURSOR_COPYING Copying.
JMOUSE_CURSOR_POINTINGHAND Pointing Hand.
JMOUSE_CURSOR_DRAGGINGHAND Dragging Hand.
JMOUSE_CURSOR_RESIZE_LEFTRIGHT Left-Right.
JMOUSE_CURSOR_RESIZE_UPDOWN Up-Down.
JMOUSE_CURSOR_RESIZE_FOURWAY Four Way.
JMOUSE_CURSOR_RESIZE_TOPEDGE Top Edge.
JMOUSE_CURSOR_RESIZE_BOTTOMEDGE Bottom Edge.
JMOUSE_CURSOR_RESIZE_LEFTEDGE Left Edge.
JMOUSE_CURSOR_RESIZE_RIGHTEDGE Right Edge.
JMOUSE_CURSOR_RESIZE_TOPLEFTCORNER Top-Left Corner.
JMOUSE_CURSOR_RESIZE_TOPRIGHTCORNER Top-Right Corner.
JMOUSE_CURSOR_RESIZE_BOTTOMLEFTCORNER Bottom-Left Corner.
JMOUSE_CURSOR_RESIZE_BOTTOMRIGHTCORNER Bottom-Right Corner.
Enumerator
Return the last known combination of modifier keys being held by the user.
Returns
Return the current combination of modifier keys being held by the user.
Returns
36.34.3.5 void jmouse_setposition_box ( t_object ∗ patcherview, t_object ∗ box, double bx, double by )
Set the position of the mouse cursor relative to a box within the patcher canvas coordinates.
Parameters
patcherview The patcherview containing the box upon which the mouse coordinates are based.
box The box upon which the mouse coordinates are based.
bx The new x-coordinate of the mouse cursor position.
by The new y-coordinate of the mouse cursor position.
Parameters
x The new x-coordinate of the mouse cursor position.
y The new y-coordinate of the mouse cursor position.
Set the position of the mouse cursor relative to the patcher canvas coordinates.
Parameters
patcherview The patcherview upon which the mouse coordinates are based.
cx The new x-coordinate of the mouse cursor position.
cy The new y-coordinate of the mouse cursor position.
36.35 MSP
PFFT
MSP Poly
Buffers
Modules
• Buffers
Your object can access shared data stored in an MSP buffer∼ object.
• PFFT
When an object is instantiated, it is possible to determine if it is being created in pfft∼ context in the new method.
• Poly
If your object is instatiated as a voice of a poly∼ object, it is possible both to determine this context and to determine
information about the specific voice.
Data Structures
• struct t_pxdata
Common struct for MSP objects.
• struct t_pxobject
Header for any non-ui signal processing object.
• struct t_signal
The signal data structure.
• struct t_pxjbox
Header for any ui signal processing object.
Macros
• #define Z_NO_INPLACE
flag indicating the object doesn't want signals in place
• #define Z_PUT_LAST
when list of ugens is resorted, put this object at end
• #define Z_PUT_FIRST
when list of ugens is resorted, put this object at beginning
• #define PI
The pi constant.
• #define TWOPI
Typedefs
Enumerations
Functions
Variables
36.35.2.1 #define PI
The pi constant.
A void pointer.
A void pointer.
Enumerator
See also
class_dspinitjbox()
See also
class_dspinit()
See also
See also
Returns
Query MSP to determine whether or not a given audio object is in a running dsp chain.
This is preferable over sys_getdspstate() since global audio can be on but an object could be in a patcher that is not
running.
Returns
Returns true if the MSP object is in a patcher that has audio on, otherwise returns false.
Returns
Returns
Returns
See also
dsp_free
Call this routine after creating your object in the new instance routine with object_alloc().
Cast your object to t_pxobject as the first argument, then specify the number of signal inputs your object will have.
dsp_setup() initializes fields of the t_pxobject header and allocates any proxies needed (if num_signal_inputs is
greater than 1).
Some signal objects have no inputs; you should pass 0 for num_signal_inputs in this case. After calling dsp_setup(),
you can create additional non-signal inlets using intin(), floatin(), or inlet_new().
Parameters
x Your object's pointer.
nsignals The number of signal/proxy inlets to create for the object.
See also
dsp_setup
A function pointer for the audio perform routine used by MSP objects to process blocks of samples.
36.36 Buffers
Your object can access shared data stored in an MSP buffer∼ object.
Collaboration diagram for Buffers:
MSP Buffers
Data Structures
• struct t_buffer_info
Common buffer∼ data/metadata.
Typedefs
Functions
Your object can access shared data stored in an MSP buffer∼ object.
Similar to table and coll objects, buffer∼ objects are bound to a t_symbol from which you can direct gain access
to the t_buffer struct. This is potentially dangerous, and not guaranteed to be forward (or backward) compatible.
Beginning with Max 6.1, developers accessing buffer∼ objects are encouraged to use the t_buffer_ref API. The
t_buffer_ref API provides many enhancements to improve thread-safety, simplify your perform routine, and manage
the binding to the buffer∼ object.
A class that accesses a buffer∼ is the simpwave∼ object included with Max SDK example projects.
While the Max 6 signal processing chain operates on 64-bit double-precision floats, the t_buffer_obj storage remains
as 32-bit single-precision float format. This is essential to maintain backward compatibility with older third-party
externals.
If you have written to the buffer∼ and thus changed the values of its samples, you should now mark the buffer∼ as
dirty. This will ensure that objects such as waveform∼ update their rendering of the contents of this buffer∼. This
can be accomplished with the following call:
object_method(b, gensym("dirty"));
A buffer∼ object.
This represents the actual buffer∼ object. You can use this to send messages, query attributes, etc. of the actual
buffer object referenced by a t_buffer_ref.
A buffer∼ reference.
Use this struct to represent a reference to a buffer∼ object in Max. Use the buffer_ref_getbuffer() call to return a
pointer to the buffer. You can then make calls on the buffer itself.
Query a buffer∼ to find out how many channels are present in the buffer content.
Parameters
buffer_object the buffer object
Returns
Returns
The name of the file last read, or gensym("") if no files have been read.
Version
Query a buffer∼ to find out how many frames long the buffer content is in samples.
Parameters
buffer_object the buffer object
Returns
Query a buffer∼ to find out its native sample rate in samples per millisecond.
Parameters
buffer_object the buffer object
Returns
Query a buffer∼ to find out its native sample rate in samples per second.
Parameters
buffer_object the buffer object
Returns
Claim the buffer∼ and get a pointer to the first sample in memory.
When you are done reading/writing to the buffer you must call buffer_unlocksamples(). If the attempt to claim the
buffer∼ fails the returned pointer will be NULL.
Parameters
buffer_object the buffer object
Returns
a pointer to the first sample in memory, or NULL if the buffer doesn't exist.
Query to find out if a buffer∼ with the referenced name actually exists.
Parameters
x the buffer reference
Returns
Query a buffer reference to get the actual buffer∼ object being referenced, if it exists.
Parameters
x the buffer reference
Returns
Parameters
self pointer to your object
name the name of the buffer∼
Returns
36.36.3.10 t_max_err buffer_ref_notify ( t_buffer_ref ∗ x, t_symbol ∗ s, t_symbol ∗ msg, void ∗ sender, void ∗ data )
Your object needs to handle notifications issued by the buffer∼ you reference.
You do this by defining a "notify" method. Your notify method should then call this notify method for the t_buffer_ref.
Parameters
x the buffer reference
s the registered name of the sending object
msg then name of the notification/message sent
sender the pointer to the sending object
data optional argument sent with the notification/message
Returns
Set the buffer's dirty flag, indicating that changes have been made.
Parameters
buffer_object the buffer object
Returns
an error code
Set the number of samples with which to zero-pad the buffer∼'s contents.
The typical application for this need is to pad a buffer with enough room to allow for the reach of a FIR kernel in
convolution.
Parameters
buffer_object the buffer object
samplecount the number of sample to pad the buffer with on each side of the contents
Returns
an error code
Release your claim on the buffer∼ contents so that other objects may read/write to the buffer∼.
Parameters
buffer_object the buffer object
36.37 PFFT
When an object is instantiated, it is possible to determine if it is being created in pfft∼ context in the new method.
Collaboration diagram for PFFT:
MSP PFFT
Data Structures
• struct t_pfftpub
Public FFT Patcher struct.
When an object is instantiated, it is possible to determine if it is being created in pfft∼ context in the new method.
In the new method (and only at this time), you can check the s_thing member of the t_symbol '__pfft∼__'. If this is
non-null, then you will have a pointer to a t_pfftpub struct.
if (pfft_parent) {
// in a pfft~ context
}
else {
// not in a pfft~
}
36.38 Poly
If your object is instatiated as a voice of a poly∼ object, it is possible both to determine this context and to determine
information about the specific voice.
Collaboration diagram for Poly:
MSP Poly
If your object is instatiated as a voice of a poly∼ object, it is possible both to determine this context and to determine
information about the specific voice.
This is done by querying the patcher in which your object exists for an associated object, and then calling methods
on that object.
36.39 Objects
Data Structures
• struct t_messlist
A list of symbols and their corresponding methods, complete with typechecking information.
• struct t_tinyobject
The tiny object structure sits at the head of any object to which you may pass messages (and which you may feed to
freeobject()).
• struct t_object
The structure for the head of any object which wants to have inlets or outlets, or support attributes.
Macros
• #define MAGIC
Magic number used to determine if memory pointed to by a t_object∗ is valid.
• #define NOGOOD(x)
Returns true if a pointer is not a valid object.
• #define MSG_MAXARG
Maximum number of arguments that can be passed as a typed-list rather than using A_GIMME.
• #define object_method_direct(rt, sig, x, s, ...)
do a strongly typed direct call to a method of an object
Functions
• t_max_err object_method_format (t_object ∗x, t_symbol ∗s, t_atom ∗rv, C74_CONST char ∗fmt,...)
Convenience wrapper for object_method_typed() that uses atom_setformat() to define the arguments.
• t_max_err object_method_char (t_object ∗x, t_symbol ∗s, unsigned char v, t_atom ∗rv)
Convenience wrapper for object_method_typed() that passes a single char as an argument.
• t_max_err object_method_long (t_object ∗x, t_symbol ∗s, long v, t_atom ∗rv)
Convenience wrapper for object_method_typed() that passes a single long integer as an argument.
• t_max_err object_method_float (t_object ∗x, t_symbol ∗s, float v, t_atom ∗rv)
Convenience wrapper for object_method_typed() that passes a single 32bit float as an argument.
• t_max_err object_method_double (t_object ∗x, t_symbol ∗s, double v, t_atom ∗rv)
Convenience wrapper for object_method_typed() that passes a single 64bit float as an argument.
• t_max_err object_method_sym (t_object ∗x, t_symbol ∗s, t_symbol ∗v, t_atom ∗rv)
Convenience wrapper for object_method_typed() that passes a single t_symbol∗ as an argument.
• t_max_err object_method_obj (t_object ∗x, t_symbol ∗s, t_object ∗v, t_atom ∗rv)
Convenience wrapper for object_method_typed() that passes a single t_object∗ as an argument.
• t_max_err object_method_char_array (t_object ∗x, t_symbol ∗s, long ac, unsigned char ∗av, t_atom ∗rv)
Convenience wrapper for object_method_typed() that passes an array of char values as an argument.
• t_max_err object_method_long_array (t_object ∗x, t_symbol ∗s, long ac, t_atom_long ∗av, t_atom ∗rv)
Convenience wrapper for object_method_typed() that passes an array of long integers values as an argument.
• t_max_err object_method_float_array (t_object ∗x, t_symbol ∗s, long ac, float ∗av, t_atom ∗rv)
Convenience wrapper for object_method_typed() that passes an array of 32bit floats values as an argument.
• t_max_err object_method_double_array (t_object ∗x, t_symbol ∗s, long ac, double ∗av, t_atom ∗rv)
Convenience wrapper for object_method_typed() that passes an array of 64bit float values as an argument.
• t_max_err object_method_sym_array (t_object ∗x, t_symbol ∗s, long ac, t_symbol ∗∗av, t_atom ∗rv)
Convenience wrapper for object_method_typed() that passes an array of t_symbol∗ values as an argument.
• t_max_err object_method_obj_array (t_object ∗x, t_symbol ∗s, long ac, t_object ∗∗av, t_atom ∗rv)
Convenience wrapper for object_method_typed() that passes an array of t_object∗ values as an argument.
• void object_openhelp (t_object ∗x)
Open the help patcher for a given instance of an object.
• void object_openrefpage (t_object ∗x)
Open the reference page for a given instance of an object.
• void object_openquery (t_object ∗x)
Open a search in the file browser for files with the name of the given object.
• void classname_openhelp (char ∗classname)
Open the help patcher for a given object class name.
• void classname_openrefpage (char ∗classname)
Open the reference page for a given object class name.
• void classname_openquery (char ∗classname)
Open a search in the file browser for files with the name of the given class.
See also
http://www.cycling74.com/twiki/bin/view/ProductDocumentation/JitterSdk←-
ObjectModel
http://www.cycling74.com/twiki/bin/view/ProductDocumentation/JitterSdk←-
RegNotify
Maximum number of arguments that can be passed as a typed-list rather than using A_GIMME.
It is generally recommended to use A_GIMME.
Returns
will return anything that the called function returns, typed by (rt)
Remarks
Example: To call the function identified by getcolorat on the object pwindow which is declared like:
t_jrgba pwindow_getcolorat(t_object ∗window, double x, double y)
1 double x = 44.73;
2 double y = 79.21;
3 t_object *pwindow;
4 t_jrgba result = object_method_direct(t_jrgba, (t_object *, double, double), pwindow, gensym("getcolorat"),
x, y);
Open a search in the file browser for files with the name of the given class.
Parameters
classname The class name for which to query.
Parameters
classname The class name for which to open the reference page.
Returns
A pointer to the newly created object instance, or NULL if creation of the object fails.
See also
newobject_sprintf()
Returns
A pointer to the newly created object instance, or NULL if creation of the object fails.
Remarks
The example below creates a new object that in a patcher whose object pointer is stored in a variable called
"aPatcher".
1 t_dictionary *d;
2 t_object *o;
3 char text[4];
4
5 strncpy_zero(text, "foo", 4);
6
7 d = dictionary_sprintf("@maxclass comment @varname _name \
8 @text \"%s\" @patching_rect %.2f %.2f %.2f %.2f \
9 @fontsize %f @textcolor %f %f %f 1.0 \
10 @fontname %s @bgcolor 0.001 0.001 0.001 0.",
11 text, 20.0, 20.0, 200.0, 24.0,
12 18, 0.9, 0.9, 0.9, "Arial");
13
14 o = newobject_fromdictionary(aPatcher, d);
See also
newobject_sprintf()
newobject_fromdictionary()
atom_setparse()
Create a new object in a specified patcher with values using a combination of attribute and sprintf syntax.
Parameters
patcher An instance of a patcher object.
fmt An sprintf-style format string specifying key-value pairs with attribute nomenclature.
... One or more arguments which are to be substituted into the format string.
Returns
A pointer to the newly created object instance, or NULL if creation of the object fails.
Remarks
The example below creates a new object that in a patcher whose object pointer is stored in a variable called
"aPatcher".
1 t_object *my_comment;
2 char text[4];
3
4 strncpy_zero(text, "foo", 4);
5
6 my_comment = newobject_sprintf(aPatcher, "@maxclass comment @varname _name \
7 @text \"%s\" @patching_rect %.2f %.2f %.2f %.2f \
8 @fontsize %f @textcolor %f %f %f 1.0 \
9 @fontname %s @bgcolor 0.001 0.001 0.001 0.",
10 text, 20.0, 20.0, 200.0, 24.0,
11 18, 0.9, 0.9, 0.9, "Arial");
See also
dictionary_sprintf()
newobject_fromdictionary()
atom_setparse()
Allocates the memory for an instance of an object class and initialize its object header.
It is used like the traditional function newobject, inside of an object's new method, but its use is required with
obex-class objects.
Parameters
c The class pointer, returned by class_new()
Returns
This function returns a new instance of an object class if successful, or NULL if unsuccessful.
Returns
This function returns a pointer to the registered object (to the object referred to by the combination of name←-
_space and s arguments) if successful, or NULL if unsuccessful.
Remarks
You should not attach an object to itself if the object is a UI object. UI objects automatically register and attach
to themselves in jbox_new().
See also
object_notify()
object_detach()
object_attach_byptr()
object_register()
Referenced by jit_object_attach().
Returns
Remarks
You should not attach an object to itself if the object is a UI object. UI objects automatically register and attach
to themselves in jbox_new().
See also
object_notify()
object_detach()
object_attach()
object_register()
object_attach_byptr_register()
Returns
See also
object_register()
object_attach_byptr()
Mark an attribute as being touched by some code not from the attribute setter.
This will notify clients that the attribute has changed.
Parameters
x The object whose attribute has been changed
attrname The attribute name
Returns
Mark one or more attributes as being touched by some code not from the attribute setter.
This will notify clients that the attributes have changed. Utility to call object_attr_touch() for several attributes
Parameters
x The object whose attribute has been changed
attrnames The attribute names as a space separated string
Returns
Parameters
x The object to test
Returns
This function returns the t_class ∗ of the object's class, if successful, or NULL, if unsuccessful.
Returns
Referenced by jit_object_classname().
Returns
This function returns 1 if the object is an instance of the named class. Otherwise, 0 is returned.
Remarks
For instance, to determine whether an unknown object pointer is a pointer to a print object, one would call:
s The name of the registered object in the namespace. If you don't know the name of the
registered object, the object_findregisteredbyptr() function can be used to determine it.
x The client object to attach. Generally, this is the pointer to your Max object.
Returns
This function returns the error code MAX_ERR_NONE if successful, or one of the other error codes defined
in e_max_errorcodes if unsuccessful.
Referenced by jit_object_detach().
Returns
See also
object_detach()
object_attach_byptr()
Returns
See also
attr_dictionary_process()
Parameters
name_space The namespace of the registered object
s The name of the registered object in the namespace
Returns
This function returns the pointer of the registered object, if successful, or NULL, if unsuccessful.
Referenced by jit_object_findregistered().
Determines the namespace and/or name of a registered object, given the object's pointer.
Parameters
name_space Pointer to a t_symbol ∗, to receive the namespace of the registered object
s Pointer to a t_symbol ∗, to receive the name of the registered object within the namespace
x Pointer to the registered object
Returns
This function returns the error code MAX_ERR_NONE if successful, or one of the other error codes defined
in e_max_errorcodes if unsuccessful.
Referenced by jit_object_findregisteredbyptr().
Call the free function and release the memory for an instance of an internal object class previously instantiated
using object_new(), object_new_typed() or other new-style object constructor functions (e.g.
hashtab_new()). It is, at the time of this writing, a wrapper for the traditional function freeobject(), but its use is
suggested with obex-class objects.
Parameters
x The pointer to the object to be freed.
Returns
This function returns the error code MAX_ERR_NONE if successful, or one of the other error codes defined
in e_max_errorcodes if unsuccessful.
Referenced by jit_object_free().
Returns
Referenced by jit_object_getmethod().
Returns
This function returns the error code MAX_ERR_NONE if successful, or one of the other error codes defined
in e_max_errorcodes if unsuccessful.
Remarks
Calling the object_getvalueof() function allocates memory for any data it returns. It is the developer's respon-
sibility to free it, using the freebytes() function.
Developers wishing to design objects which will support this function being called on them must define and
implement a special method, getvalueof, like so:
Referenced by max_jit_obex_gimmeback_dumpout().
Parameters
x The object that will receive the message
s The message selector
... Any arguments to the message
Returns
If the receiver object can respond to the message, object_method() returns the result. Otherwise, the function
will return 0.
Remarks
Referenced by jit_attr_symcompare().
Returns
See also
object_method_typed()
36.39.3.26 t_max_err object_method_char_array ( t_object ∗ x, t_symbol ∗ s, long ac, unsigned char ∗ av, t_atom ∗ rv
)
Convenience wrapper for object_method_typed() that passes an array of char values as an argument.
Parameters
x The object to which the message will be sent.
s The name of the method to call on the object.
ac The number of arguments to pass to the method.
av The address of the first of the array of arguments to pass to the method.
rv The address of an atom to hold a return value.
Returns
See also
object_method_typed()
Convenience wrapper for object_method_typed() that passes a single 64bit float as an argument.
Parameters
x The object to which the message will be sent.
s The name of the method to call on the object.
v An argument to pass to the method.
rv The address of an atom to hold a return value.
Returns
See also
object_method_typed()
36.39.3.28 t_max_err object_method_double_array ( t_object ∗ x, t_symbol ∗ s, long ac, double ∗ av, t_atom ∗ rv )
Convenience wrapper for object_method_typed() that passes an array of 64bit float values as an argument.
Parameters
x The object to which the message will be sent.
s The name of the method to call on the object.
ac The number of arguments to pass to the method.
av The address of the first of the array of arguments to pass to the method.
rv The address of an atom to hold a return value.
Returns
See also
object_method_typed()
Convenience wrapper for object_method_typed() that passes a single 32bit float as an argument.
Parameters
x The object to which the message will be sent.
s The name of the method to call on the object.
v An argument to pass to the method.
rv The address of an atom to hold a return value.
Returns
See also
object_method_typed()
36.39.3.30 t_max_err object_method_float_array ( t_object ∗ x, t_symbol ∗ s, long ac, float ∗ av, t_atom ∗ rv )
Convenience wrapper for object_method_typed() that passes an array of 32bit floats values as an argument.
Parameters
x The object to which the message will be sent.
s The name of the method to call on the object.
ac The number of arguments to pass to the method.
av The address of the first of the array of arguments to pass to the method.
rv The address of an atom to hold a return value.
Returns
See also
object_method_typed()
36.39.3.31 t_max_err object_method_format ( t_object ∗ x, t_symbol ∗ s, t_atom ∗ rv, C74_CONST char ∗ fmt, ... )
Convenience wrapper for object_method_typed() that uses atom_setformat() to define the arguments.
Parameters
x The object to which the message will be sent.
s The name of the method to call on the object.
rv The address of an atom to hold a return value.
fmt An sprintf-style format string specifying values for the atoms.
... One or more arguments which are to be substituted into the format string.
Returns
See also
object_method_typed()
atom_setformat()
Convenience wrapper for object_method_typed() that passes a single long integer as an argument.
Parameters
x The object to which the message will be sent.
s The name of the method to call on the object.
v An argument to pass to the method.
rv The address of an atom to hold a return value.
Returns
See also
object_method_typed()
36.39.3.33 t_max_err object_method_long_array ( t_object ∗ x, t_symbol ∗ s, long ac, t_atom_long ∗ av, t_atom ∗
rv )
Convenience wrapper for object_method_typed() that passes an array of long integers values as an argument.
Parameters
x The object to which the message will be sent.
s The name of the method to call on the object.
ac The number of arguments to pass to the method.
av The address of the first of the array of arguments to pass to the method.
rv The address of an atom to hold a return value.
Returns
See also
object_method_typed()
Returns
See also
object_method_typed()
36.39.3.35 t_max_err object_method_obj_array ( t_object ∗ x, t_symbol ∗ s, long ac, t_object ∗∗ av, t_atom ∗ rv )
Convenience wrapper for object_method_typed() that passes an array of t_object∗ values as an argument.
Parameters
x The object to which the message will be sent.
s The name of the method to call on the object.
ac The number of arguments to pass to the method.
av The address of the first of the array of arguments to pass to the method.
rv The address of an atom to hold a return value.
Returns
See also
object_method_typed()
Convenience wrapper for object_method_typed() that uses atom_setparse() to define the arguments.
Parameters
x The object to which the message will be sent.
s The name of the method to call on the object.
parsestr A C-string to parse into an array of atoms to pass to the method.
rv The address of an atom to hold a return value.
Returns
See also
object_method_typed()
atom_setparse()
Returns
See also
object_method_typed()
36.39.3.38 t_max_err object_method_sym_array ( t_object ∗ x, t_symbol ∗ s, long ac, t_symbol ∗∗ av, t_atom ∗ rv )
Convenience wrapper for object_method_typed() that passes an array of t_symbol∗ values as an argument.
Parameters
x The object to which the message will be sent.
s The name of the method to call on the object.
ac The number of arguments to pass to the method.
av The address of the first of the array of arguments to pass to the method.
rv The address of an atom to hold a return value.
Returns
See also
object_method_typed()
36.39.3.39 t_max_err object_method_typed ( void ∗ x, t_symbol ∗ s, long ac, t_atom ∗ av, t_atom ∗ rv )
Parameters
x The object that will receive the message
s The message selector
ac Count of message arguments in av
av Array of t_atoms; the message arguments
rv Return value of function, if available
Returns
This function returns the error code MAX_ERR_NONE if successful, or one of the other error codes defined
in e_max_errorcodes if unsuccessful.
Remarks
If the receiver object can respond to the message, object_method_typed() returns the result in rv. Otherwise,
rv will contain an A_NOTHING atom.
36.39.3.40 t_max_err object_method_typedfun ( void ∗ x, t_messlist ∗ mp, t_symbol ∗ s, long ac, t_atom ∗ av,
t_atom ∗ rv )
Currently undocumented.
Parameters
x The object that will receive the message
mp Undocumented
s The message selector
ac Count of message arguments in av
av Array of t_atoms; the message arguments
rv Return value of function, if available
Returns
This function returns the error code MAX_ERR_NONE if successful, or one of the other error codes defined
in e_max_errorcodes if unsuccessful.
Remarks
If the receiver object can respond to the message, object_method_typedfun() returns the result in rv. Other-
wise, rv will contain an A_NOTHING atom.
Allocates the memory for an instance of an object class and initialize its object header internal to Max.
It is used similarly to the traditional function newinstance(), but its use is required with obex-class objects.
Parameters
name_space The desired object's name space. Typically, either the constant CLASS_BOX, for obex
classes which can instantiate inside of a Max patcher (e.g. boxes, UI objects, etc.), or the
constant CLASS_NOBOX, for classes which will only be used internally. Developers can
define their own name spaces as well, but this functionality is currently undocumented.
classname The name of the class of the object to be created
... Any arguments expected by the object class being instantiated
Returns
This function returns a new instance of the object class if successful, or NULL if unsuccessful.
36.39.3.42 void∗ object_new_typed ( t_symbol ∗ name_space, t_symbol ∗ classname, long ac, t_atom ∗ av )
Allocates the memory for an instance of an object class and initialize its object header internal to Max.
It is used similarly to the traditional function newinstance(), but its use is required with obex-class objects. The
object_new_typed() function differs from object_new() by its use of an atom list for object arguments—in this way, it
more resembles the effect of typing something into an object box from the Max interface.
Parameters
name_space The desired object's name space. Typically, either the constant CLASS_BOX, for obex
classes which can instantiate inside of a Max patcher (e.g. boxes, UI objects, etc.), or the
constant CLASS_NOBOX, for classes which will only be used internally. Developers can
define their own name spaces as well, but this functionality is currently undocumented.
classname The name of the class of the object to be created
ac Count of arguments in av
av Array of t_atoms; arguments to the class's instance creation function.
Returns
This function returns a new instance of the object class if successful, or NULL if unsuccessful.
Broadcast a message (with an optional argument) from a registered object to any attached client objects.
Parameters
x Pointer to the registered object
s The message to send
data An optional argument which will be passed with the message. Sets this argument to NULL if
it will be unused.
Returns
This function returns the error code MAX_ERR_NONE if successful, or one of the other error codes defined
in e_max_errorcodes if unsuccessful.
Remarks
In order for client objects to receive notifications, they must define and implement a special method, notify,
like so:
1 void myobject_notify(t_myobject *x, t_symbol *s, t_symbol *msg, void *sender, void *data);
where x is the pointer to the receiving object, s is the name of the sending (registered) object in its namespace,
msg is the sent message, sender is the pointer to the sending object, and data is an optional argument
sent with the message. This value corresponds to the data argument in the object_notify() method.
Returns
This function returns the error code MAX_ERR_NONE if successful, or one of the other error codes defined
in e_max_errorcodes if unsuccessful.
Referenced by ext_main().
Returns
This function returns the error code MAX_ERR_NONE if successful, or one of the other error codes defined
in e_max_errorcodes if unsuccessful.
Remarks
By default, pointers to the object's containing patcher and box objects are stored in the obex, under the keys
'#P' and '#B', respectively. To retrieve them, the developer could do something like the following:
Parameters
x The object pointer. This function should only be called on instantiated objects (i.e. in the new
method or later), not directly on classes (i.e. in main()).
key A symbolic name for the data to be stored
val A t_object ∗, to be stored in the obex, referenced under the key.
Returns
This function returns the error code MAX_ERR_NONE if successful, or one of the other error codes defined
in e_max_errorcodes if unsuccessful.
Remarks
Most developers will need to use this function for the specific purpose of storing the dumpout outlet in the obex
(the dumpout outlet is used by attributes to report data in response to 'get' queries). For this, the developer
should use something like the following in the object's new method:
Open a search in the file browser for files with the name of the given object.
Parameters
x The object instance for which to query.
Returns
The function returns a pointer to the registered object. Under some circumstances, object_register will du-
plicate the object, and return a pointer to the duplicate—the developer should not assume that the pointer
passed in is the same pointer that has been registered. To be safe, the returned pointer should be stored and
used with the bject_unregister() function.
Remarks
You should not register an object if the object is a UI object. UI objects automatically register and attach to
themselves in jbox_new().
Referenced by jit_object_register().
36.39.3.51 t_max_err object_register_getnames ( t_symbol ∗ name_space, long ∗ namecount, t_symbol ∗∗∗ names )
Returns
This function returns the error code MAX_ERR_NONE if successful, or one of the other error codes defined in
"ext_obex.h" if unsuccessful.
Returns
This function returns the error code MAX_ERR_NONE if successful, or one of the other error codes defined
in e_max_errorcodes if unsuccessful.
Remarks
Developers wishing to design objects which will support this function being called on them must define and
implement a special method, setvalueof, like so:
1 class_addmethod(c, (method)myobject_setvalueof, "setvalueof", A_CANT, 0);
Returns
This function returns a pointer to the object if registered (to the object referred to by the combination of
name_space and s arguments) if successful, or NULL if the object is not yet registered.
Returns
If the receiver object can respond to the message, object_method() returns the result. Otherwise, the function
will return 0.
Sends an untyped message to an object, respects a thread specific class stack from object_super_method() calls.
Parameters
x The object that will receive the message
s The message selector
... Any arguments to the message
Returns
If the receiver object can respond to the message, object_method() returns the result. Otherwise, the function
will return 0.
Parameters
x The object to unregister. This should be the pointer returned from the object_register() func-
tion.
Returns
This function returns the error code MAX_ERR_NONE if successful, or one of the other error codes defined
in e_max_errorcodes if unsuccessful.
Referenced by jit_object_unregister().
Returns
This function returns the error code MAX_ERR_NONE if successful, or one of the other error codes defined in
"ext_obex.h" if unsuccessful.
36.40 Patcher
jbox
jpatchline
Patcher
jpatcher
jpatcherview
Modules
• jpatcher
The patcher.
• jbox
A box in the patcher.
• jpatchline
A patch cord.
• jpatcherview
A view of a patcher.
Data Structures
• struct t_jbox
The t_jbox struct provides the header for a Max user-interface object.
Typedefs
Enumerations
Variables
A box.
As of Max 5, the box struct is opaque. Messages can be sent to a box using object_method() or object_method_←-
typed(), or by using Attributes accessors.
Enumerator
A patcher.
As of Max 5, the patcher struct is opaque. Messages can be sent to a patcher using object_method() or object_←-
method_typed(), or by using Attributes accessors.
36.41 jpatcher
The patcher.
Collaboration diagram for jpatcher:
Patcher jpatcher
Functions
Return the index of the default font face used for new objects in a patcher.
• long jpatcher_get_fileversion (t_object ∗p)
Return the file version of the patcher.
• long jpatcher_get_currentfileversion (void)
Return the file version for any new patchers, e.g.
The patcher.
Returns
Returns
Parameters
p The patcher to be queried.
Returns
Returns
Returns
Returns
Return the index of the default font face used for new objects in a patcher.
Parameters
p A pointer to a patcher instance.
Returns
The index of the default font face used for new objects in a patcher.
Return the name of the default font used for new objects in a patcher.
Parameters
p A pointer to a patcher instance.
Returns
The name of the default font used for new objects in a patcher.
Return the size of the default font used for new objects in a patcher.
Parameters
p A pointer to a patcher instance.
Returns
The size of the default font used for new objects in a patcher.
Query a patcher to determine the location and dimensions of its window when initially opened.
Parameters
p A pointer to a patcher instance.
pr The address of valid t_rect whose values will be filled-in upon return.
Returns
Returns
prgba The address of a valid t_jrgba struct that will be filled-in with the current patcher color values.
Returns
Returns
Returns
Returns
Returns
Parameters
p The patcher to be queried.
Returns
Returns
See also
Returns
Returns
Given a patcher, return the patcher that will be responsible for holding the parameter hub.
Parameters
p The patcher to be queried.
Returns
Returns
See also
Returns
Returns
Parameters
p The patcher to be queried.
Returns
The patcher's parent patcher, if there is one. If there is no parent patcher (this is a top-level patcher) then
NULL is returned.
Returns
Returns
Returns
Given a patcher, return the top-level patcher for the tree in which it exists.
Parameters
Returns
Returns
Returns
Returns
c Pass true to lock the patcher's background layer, otherwise pass false.
Returns
Returns
Returns
Returns
Returns
Returns
Returns
Returns
Parameters
p The patcher whose locked state will be changed.
c Pass true to switch the patcher to presentation mode, otherwise pass false.
Returns
Returns
Returns
Returns
Remarks
36.42 jbox
Patcher jbox
Data Structures
• struct t_jboxdrawparams
The t_jboxdrawparams structure.
Macros
• #define JBOX_DRAWFIRSTIN
draw first inlet
• #define JBOX_NODRAWBOX
don't draw the frame
• #define JBOX_DRAWINLAST
draw inlets after update method
• #define JBOX_TRANSPARENT
don't make transparent unless you need it (for efficiency)
• #define JBOX_NOGROW
don't even draw grow thingie
• #define JBOX_GROWY
can grow in y direction by dragging
• #define JBOX_GROWBOTH
can grow independently in both x and y
• #define JBOX_IGNORELOCKCLICK
box should ignore a click if patcher is locked
• #define JBOX_HILITE
flag passed to jbox_new() to tell max that the UI object can receive the focus when clicked on – may be replaced by
JBOX_FOCUS in the future
• #define JBOX_BACKGROUND
immediately set box into the background
• #define JBOX_NOFLOATINSPECTOR
no floating inspector window
• #define JBOX_TEXTFIELD
save/load text from textfield, unless JBOX_BINBUF flag is set
• #define JBOX_FIXWIDTH
give the box a textfield based fix-width (bfixwidth) method
• #define JBOX_FONTATTR
if you want font related attribute you must add this to jbox_initclass()
• #define JBOX_TEXTJUSTIFICATIONATTR
give your object a textjustification attr to control textfield
• #define JBOX_BINBUF
save/load text from b_binbuf
• #define JBOX_MOUSEDRAGDELTA
hides mouse cursor in drag and sends mousedragdelta instead of mousedrag (for infinite scrolling like number)
• #define JBOX_COLOR
support the "color" method for color customization
• #define JBOX_DRAWIOLOCKED
draw inlets and outlets when locked (default is not to draw them)
• #define JBOX_DRAWBACKGROUND
set to have box bg filled in for you based on getdrawparams method or brgba attribute
• #define JBOX_NOINSPECTFIRSTIN
flag for objects such as bpatcher that have a different b_firstin,
• #define JBOX_FOCUS
more advanced focus support (passed to jbox_initclass() to add "nextfocus" and "prevfocus" attributes to the U←-
I object). Not implemented as of 2009-05-11
• #define JBOX_BOXVIEW
enable jboxview methods
• #define JBOX_LEGACYCOLOR
add undocumented color N message to objects from Max 4 that used it
• #define JBOX_COPYLEGACYDEFAULT
if there is a legacy default, copy it instead of the regular default
• #define JBOX_NOLEGACYDEFAULT
if there is a legacy default, don't copy any default
Enumerations
Functions
Enumerator
JBOX_FONTFACE_REGULAR normal
JBOX_FONTFACE_BOLD bold
JBOX_FONTFACE_ITALIC italic
JBOX_FONTFACE_BOLDITALIC bold and italic
Enumerator
Parameters
b The address of your object's t_jbox member (which should be the first member of the object's
struct).
Returns
Returns
Returns
Returns
Parameters
b The box to query.
Returns
Returns
Returns
Returns
Returns
Parameters
b The box to query.
Returns
Returns
Returns
Returns
Returns
The unique id of the object. This is a symbol that is referenced, for example, by patchlines.
Parameters
b The box to query.
Returns
Returns
Returns
Returns
Returns
Parameters
b The box to query.
Returns
Returns
If the box has a patcher, the patcher's pointer is returned. Otherwise NULL is returned.
Returns
Returns
Returns
Returns
Returns
Returns
Returns
Parameters
b The box to query.
Returns
Returns
Returns
Returns
The textfield for the box, assuming it has one. If the box does not own a textfield then NULL is returned.
Parameters
b The box to query.
Returns
36.42.4.35 t_max_err jbox_new ( t_jbox ∗ b, long flags, long argc, t_atom ∗ argv )
Returns
36.42.4.36 t_max_err jbox_notify ( t_jbox ∗ b, t_symbol ∗ s, t_symbol ∗ msg, void ∗ sender, void ∗ data )
Returns
Parameters
b The address of your object's t_jbox member.
Returns
Returns
Returns
Returns
Parameters
b The box to query.
d The fontsize in points.
Returns
Returns
Returns
Returns
Parameters
b The box to query.
c Pass zero to tell the box to respond to clicks, or non-zero to indicate that the box should
ignore clicks.
Returns
Returns
Returns
Returns
Parameters
box The box whose size will be changed.
size The address of a t_size with the new width and height values.
Returns
Set the position of a box for both the presentation and patching views.
Parameters
box The box whose position will be changed.
pos The address of a t_pt with the new x and y values.
Returns
Returns
Returns
Parameters
box The box whose rect will be changed.
pr The address of a t_rect with the new rect values.
Returns
Returns
Returns
Returns
Parameters
box The box whose rect will be changed.
patcherview A patcherview in which the box exists.
rect The address of a valid t_rect that will replace the current values used by the box in the given
view.
Returns
Set the size of a box for both the presentation and patching views.
Parameters
box The box whose size will be changed.
size The address of a t_size with the new size values.
Returns
Returns
36.43 jpatchline
A patch cord.
Collaboration diagram for jpatchline:
Patcher jpatchline
Functions
A patch cord.
Parameters
l A pointer to the patchline's instance.
Returns
Returns
Returns
An error code.
Returns
Parameters
l A patchline instance.
Returns
Return the inlet number of the destination object box to which a patchline is connected.
Parameters
l A pointer to the patchline's instance.
Returns
Returns
The next patchline. If the current patchline is at the end (tail) of the list, then NULL is returned.
Returns
Return the outlet number of the originating object box from which a patchline begins.
Parameters
l A pointer to the patchline's instance.
Returns
Parameters
l A pointer to the patchline's instance.
x The address of a variable to hold the x-coordinate of the starting point's position upon return.
y The address of a variable to hold the y-coordinate of the starting point's position upon return.
Returns
Returns
An error code.
Returns
An error code.
36.44 jpatcherview
A view of a patcher.
Collaboration diagram for jpatcherview:
Patcher jpatcherview
Functions
A view of a patcher.
36.44.2.1 void patcherview_canvas_to_screen ( t_object ∗ pv, double cx, double cy, long ∗ sx, long ∗ sy )
Returns
A pointer to the patcherview at the specified location, or NULL if no patcherview exists at that location.
Returns
Returns
Returns
The next patcherview in the list, or NULL if the patcherview passed in pv is the tail.
Returns
The patcher.
Returns
Returns
An error code.
Parameters
pv The patcherview instance whose top view you want to get.
Returns
Returns
Returns
36.44.2.12 void patcherview_screen_to_canvas ( t_object ∗ pv, long sx, long sy, double ∗ cx, double ∗ cy )
Returns
An error code.
Parameters
p The patcherview instance whose attribute value will be set.
c Set this value to non-zero to make the patcherview a presentation view, otherwise pass zero.
Returns
An error code.
Returns
An error code.
Returns
An error code.
Returns
An error code.
36.45 Timing
Qelems
Clocks
Timing
ITM Time Objects
Systime API
Modules
• Clocks
Clock objects are your interface to Max’s scheduler.
• Qelems
Your object’s methods may be called at interrupt level.
• Systime API
The Systime API provides the means of getting the system time, instead of the scheduler time as you would with
functions like gettime().
• ITM Time Objects
ITM Time Objects are a high-level interface to ITM, a tempo-based scheduler API.
36.46 Clocks
Timing Clocks
Typedefs
Functions
The argument x is determined by the arg argument to clock_new(). Almost always it will be pointer to your object.
Then, in one of your methods, use clock_delay() or clock_fdelay() to schedule yourself. If you want unschedule
yourself, call clock_unset(). To find out what time it is now, use gettime() or clock_getftime(). More advanced clock
operations are possible with the setclock object interface described in Chapter 9. We suggest you take advantage
of the higher timing precision of the floating-point clock routines—all standard Max 4 timing objects such as metro
use them.
When the user has Overdrive mode enabled, your clock function will execute at interrupt level.
Under normal circumstances, gettime or clock_getftime will not be necessary for scheduling purposes if you use
clock_delay or clock_fdelay, but it may be useful for recording the timing of messages or events.
As an example, here’s a fragment of how one might go about writing a metronome using the Max scheduler. First,
here’s the data structure we’ll use.
We’ll assume that the class has been initialized already. Here’s the instance creation function that will allocate a
new Clock.
Here’s the method written to respond to the bang message that starts the metronome.
You may also want to stop the metronome at some point. Here’s a method written to respond to the message stop.
It uses clock_unset.
In your object’s free function, you should call freeobject on any Clocks you’ve created.
The setclock object allows a more general way of scheduling Clocks by generalizing the advancement of the time
associated with a scheduler. Each setclock object’s "time" can be changed by a process other than the internal
millisecond clock. In addition, the object implements routines that modify the mapping of the internal millisecond
clock onto the current value of time in an object. Your object can call a set of routines that use either setclock or
the normal millisecond clock transparently. Many Max objects accept the message clock followed by an optional
symbol to set their internal scheduling to a named setclock object. The typical implementation passes the binding
of a Symbol (the s_thing field) to the Setclock functions. By default, the empty symbol is passed. If the binding has
been linked to a setclock object, it will be used to schedule the Clock. Otherwise, the Clock is scheduled using the
main internal millisecond scheduler. The Setclock data structure is a replacement for void ∗ since there will be no
reason for external objects to access it directly.
Here’s an example implementation of the relevant methods of a metronome object using the Setclock routines.
Here’s the implementation of the routines for turning the metronome on and off. Assume that in the instance creation
function, the t_symbol m_setclock has been set to the empty symbol (gensym ("")) and m_clock has been created;
the clock function metro_tick() is defined further on.
setclock_delay(x->m_setclock->s_thing,x->m_clock,0);
}
Here is the implementation of the clock function metro_tick() that runs periodically.
Finally, here is an implementation of the method to respond to the clock message. Note that the function tries to
verify that a non-zero value bound to the t_symbol passed as an argument is in fact an instance of setclock by
checking to see if it responds to the unset message. If not, the metronome refuses to assign the t_symbol to its
internal m_setclock field.
If you want to schedule events independently of the time of the global Max scheduler, you can create your own
scheduler with scheduler_new(). By calling scheduler_set() with the newly created scheduler, calls to clock_new()
will create Clocks tied to your scheduler instead of Max’s global one. You can then control the time of the scheduler
(using scheduler_settime()) as well as when it executes clock functions (using scheduler_run()). This is a more
general facility than the setclock object routines, but unlike using the time from a setclock object to determine when
a Clock function runs, once a Clock is tied to a scheduler.
See also
clock_fdelay()
See also
clock_delay()
Find out the current logical time of the scheduler in milliseconds as a floating-point number.
Parameters
time Returns the current time.
See also
gettime()
setclock_getftime()
setclock_gettime()
Returns
x Clock to cancel.
Returns
See also
clock_getftime()
Find the correct scheduler for the object and return the current time in milliseconds.
Returns
See also
clock_getftime()
Returns
See also
Creating Schedulers
Returns
See also
Creating Schedulers
Parameters
x The scheduler to query.
time The current time of the selected scheduler.
See also
Creating Schedulers
Returns
See also
Creating Schedulers
See also
Creating Schedulers
Make a scheduler current, so that future related calls (such as clock_delay()) will affect the appropriate scheduler.
Parameters
x The scheduler to make current.
Returns
This routine returns a pointer to the previously current scheduler, saved and restored when local scheduling
is complete.
See also
Creating Schedulers
Parameters
x The scheduler to set.
time The new current time for the selected scheduler (in milliseconds).
See also
Creating Schedulers
Shift scheduler's current time and run time for all pending clock.
Could be used to change scheduler's time reference without impacting current clocks.
Parameters
x The scheduler to affect.
amount Number of milliseconds to shift by.
See also
Creating Schedulers
See also
See also
Find out the current time value of a setclock object in floating-point milliseconds.
Parameters
s A setclock object.
time The current time in milliseconds.
See also
Returns
Returns the current time value of the setclock object scheduler. If scheduler is 0, setclock_gettime is equivalent
to the function gettime that returns the current value of the internal millisecond clock.
See also
See also
While most Max timing references "logical" time derived from Max's millisecond scheduler, time values produced
by the systimer_gettime() are referenced from the CPU clock and can be used to time real world events with
microsecond precision.
The standard 'cpuclock' external in Max is a simple wrapper around this function.
Returns
36.47 Qelems
Timing Qelems
Typedefs
Functions
Qelem is already set, qelem_set() will not set it again. However, when drawing the counter, you’ll display its current
value, not a specific value generated in the Clock function.
Note that the Qelem-based defer mechanism discussed later in this chapter may be easier for lowering the priority
of one-time events, such as opening a standard file dialog box in response to a read message.
If your Qelem routine sends messages using outlet_int() or any other of the outlet functions, it needs to use the
lockout mechanism described in the Interrupt Level Considerations section.
Returns
A pointer to a Qelem instance. You need to store this value to pass to qelem_set().
Remarks
Any kind of drawing or calling of Macintosh Toolbox routines that allocate or purge memory should be done in
a Qelem function.
Parameters
q The Qelem whose function will be executed in the main thread.
Remarks
The key behavior of qelem_set() is this: if the Qelem object has already been set, it will not be set again. (If
this is not what you want, see defer().) This is useful if you want to redraw the state of some data when it
changes, but not in response to changes that occur faster than can be drawn. A Qelem object is unset after
its queue function has been called.
The Systime API provides the means of getting the system time, instead of the scheduler time as you would with
functions like gettime().
Collaboration diagram for Systime API:
Data Structures
• struct t_datetime
The Systime data structure.
Enumerations
Functions
The Systime API provides the means of getting the system time, instead of the scheduler time as you would with
functions like gettime().
Enumerator
SYSDATEFORMAT_FLAGS_SHORT short
SYSDATEFORMAT_FLAGS_MEDIUM medium
SYSDATEFORMAT_FLAGS_LONG long
36.48.3.1 void sysdateformat_formatdatetime ( t_datetime ∗ d, long dateflags, long timeflags, char ∗ s, long buflen )
Returns
Parameters
d The address of a t_datetime that contains a valid period of time.
Returns
Returns
Returns
Returns
Referenced by jit_rand_setseed().
ITM Time Objects are a high-level interface to ITM, a tempo-based scheduler API.
Collaboration diagram for ITM Time Objects:
Enumerations
• enum {
TIME_FLAGS_LOCATION, TIME_FLAGS_TICKSONLY, TIME_FLAGS_FIXEDONLY, TIME_FLAGS_LO←-
OKAHEAD,
TIME_FLAGS_USECLOCK, TIME_FLAGS_USEQELEM, TIME_FLAGS_FIXED, TIME_FLAGS_PERMA←-
NENT,
TIME_FLAGS_TRANSPORT, TIME_FLAGS_EVENTLIST, TIME_FLAGS_CHECKSCHEDULE, TIME_FL←-
AGS_LISTENTICKS,
TIME_FLAGS_NOUNITS, TIME_FLAGS_BBUSOURCE, TIME_FLAGS_POSITIVE }
Flags that determine attribute and time object behavior.
Functions
Variables
ITM Time Objects are a high-level interface to ITM, a tempo-based scheduler API.
They provide an abtraction so your object can schedule events either in milliseconds (as traditional clock objects) or
ticks (tempo-relative units).
Enumerator
36.49.3.1 void class_time_addattr ( t_class ∗ c, const char ∗ attrname, const char ∗ attrlabel, long flags )
Parameters
c Class being initialized.
attrname Name of the attribute associated with the time object.
attrlabel Descriptive label for the attribute (appears in the inspector)
flags Options, see "Flags that determine time object behavior" above
36.49.3.2 void itm_barbeatunitstoticks ( t_itm ∗ x, long bars, long beats, double units, double ∗ ticks, char position )
Convert a time value in bbu to the equivalent value in ticks, given the context of a specified itm object.
Parameters
x An itm object.
bars The measure number of the location/position.
beats The beat number of the location/position.
units The number of ticks past the beat of the location/position.
ticks The address of a variable to hold the number of ticks upon return.
position Set this parameter to TIME_FLAGS_LOCATION or to zero (for position mode).
Returns
Returns
36.49.3.7 void∗ itm_getnamed ( t_symbol ∗ s, void ∗ scheduler, t_symbol ∗ defaultclocksourcename, long create )
Returns
Returns
See also
itm_setresolution()
Returns
See also
itm_pause()
itm_resume()
Parameters
x The itm object.
Returns
Returns
Returns
Zero if the unit is fixed (milliseconds, for example) or non-zero if it is flexible (ticks, for example).
Convert a time value in milliseconds to the equivalent value in samples, given the context of a specified itm object.
Parameters
x An itm object.
ms A time specified in ms.
Returns
Convert a time value in milliseconds to the equivalent value in ticks, given the context of a specified itm object.
Parameters
x An itm object.
ms A time specified in ms.
Returns
Start the passage of time for an itm object, from it's current location.
This is the equivalent to setting the state of a transport object to 0 with a toggle.
Parameters
x The itm object.
Convert a time value in samples to the equivalent value in milliseconds, given the context of a specified itm object.
Parameters
x An itm object.
samps A time specified in samples.
Returns
See also
itm_getresolution()
36.49.3.21 void itm_settimesignature ( t_itm ∗ x, long num, long denom, long flags )
36.49.3.22 void itm_tickstobarbeatunits ( t_itm ∗ x, double ticks, long ∗ bars, long ∗ beats, double ∗ units, char position )
Convert a time value in bbu to the equivalent value in ticks, given the context of a specified itm object.
Parameters
x An itm object.
ticks The number of ticks to translate into a time represented as bars, beats, and ticks.
bars The address of a variable to hold the measure number of the location/position upon return.
beats The address of a variable to hold the beat number of the location/position upon return.
units The address of a variable to hold the number of ticks past the beat of the location/position
upon return.
position Set this parameter to TIME_FLAGS_LOCATION or to zero (for position mode).
Convert a time value in ticks to the equivalent value in milliseconds, given the context of a specified itm object.
Parameters
x An itm object.
ticks A time specified in ticks.
Returns
Calculate the quantized interval (in ticks) if this time object were to be scheduled at the current time.
Parameters
ox Time object.
vitm The associated ITM object (use time_getitm() to determine it).
oq A time object that holds a quantization interval, can be NULL.
Returns
Returns
Returns
Parameters
owner Object that owns this time object (task routine, if any, will pass owner as argument).
attrname Name of the attribute associated with the time object.
Returns
36.49.3.28 void time_getphase ( t_timeobject ∗ tx, double ∗ phase, double ∗ slope, double ∗ ticks )
Return the phase of the ITM object (transport) associated with a time object.
Parameters
tx The time object.
phase Pointer to a double to receive the progress within the specified time value of the associated
ITM object.
slope Pointer to a double to receive the slope (phase difference) within the specified time value of
the associated ITM object.
ticks
Returns
Return whether this time object currently holds a fixed (millisecond-based) value.
Parameters
x Time object.
Returns
Specify that a millisecond-based attribute to be updated automatically when the converted milliseconds of the time
object's value changes.
Parameters
x The time object.
attr Name of the millisecond based attribute in the owning object that will be updated
flags If TIME_FLAGS_LISTENTICKS is passed here, updating will not happen if the time value is
fixed (ms) based
36.49.3.32 void∗ time_new ( t_object ∗ owner, t_symbol ∗ attrname, method tick, long flags )
Returns
Parameters
tx Time object.
sc Name of an associated setclock object.
36.49.3.37 void time_setvalue ( t_timeobject ∗ tx, t_symbol ∗ s, long argc, t_atom ∗ argv )
Set the current value of a time object (either an interval or a position) using a Max message.
Parameters
tx The time object.
s Message selector.
argc Count of arguments.
argv Message arguments.
Execute a time object's task, then if it was already set to execute, reschedule for the current interval value of the
object.
Parameters
x The time object.
See also
t_timeobject
ITM
See also
t_itm
ITM
36.50 Threads
Critical Regions
Threads
Mutexes
Modules
• Critical Regions
A critical region is a simple mechanism that prevents multiple threads from accessing at once code protected by the
same critical region.
• Mutexes
Macros
• #define ATOMIC_INCREMENT(atomicptr)
increment an atomic int value
return value of ATOMIC_INCREMENT and ATOMIC_DECREMENT is the ∗new∗ value after performing the operation
• #define ATOMIC_INCREMENT_BARRIER(atomicptr)
increment an atomic int value with a memory barrier
return value of ATOMIC_INCREMENT and ATOMIC_DECREMENT is the ∗new∗ value after performing the operation
• #define ATOMIC_DECREMENT(atomicptr)
decrement an atomic int value
return value of ATOMIC_INCREMENT and ATOMIC_DECREMENT is the ∗new∗ value after performing the operation
• #define ATOMIC_DECREMENT_BARRIER(atomicptr)
decrement an atomic int value with a memory barrier
return value of ATOMIC_INCREMENT and ATOMIC_DECREMENT is the ∗new∗ value after performing the operation
Typedefs
Enumerations
Functions
• void schedule (void ∗ob, method fun, long when, t_symbol ∗sym, short argc, t_atom ∗argv)
Cause a function to be executed at the timer level at some time in the future.
• void schedule_delay (void ∗ob, method fun, long delay, t_symbol ∗sym, short argc, t_atom ∗argv)
Cause a function to be executed at the timer level at some time in the future specified by a delay offset.
• long isr (void)
Determine whether your code is executing in the Max scheduler thread.
• void ∗ defer (void ∗ob, method fn, t_symbol ∗sym, short argc, t_atom ∗argv)
Defer execution of a function to the main thread if (and only if) your function is executing in the scheduler thread.
• void ∗ defer_low (void ∗ob, method fn, t_symbol ∗sym, short argc, t_atom ∗argv)
Defer execution of a function to the back of the queue on the main thread.
• long systhread_create (method entryproc, void ∗arg, long stacksize, long priority, long flags, t_systhread
∗thread)
Create a new thread.
• long systhread_terminate (t_systhread thread)
Forcefully kill a thread – not recommended.
• void systhread_sleep (long milliseconds)
Suspend the execution of the calling thread.
• void systhread_exit (long status)
Exit the calling thread.
• long systhread_join (t_systhread thread, unsigned int ∗retval)
Wait for thread to quit and get return value from systhread_exit().
• long systhread_detach (t_systhread thread)
Detach a thread.
• t_systhread systhread_self (void)
Return the thread instance pointer for the calling thread.
• void systhread_setpriority (t_systhread thread, int priority)
Set the thread priority for the given thread.
• int systhread_getpriority (t_systhread thread)
Get the thread priority for the given thread.
• short systhread_ismainthread (void)
Check to see if the function currently being executed is in the main thread.
• short systhread_istimerthread (void)
Check to see if the function currently being executed is in a scheduler thread.
• short systhread_isaudiothread (void)
Check to see if the function currently being executed is in an audio thread.
Variables
See also
http://www.cycling74.com/twiki/bin/view/ProductDocumentation/JitterSdk←-
SchedQueue
http://www.cycling74.com/story/2005/5/2/133649/9742
systhread_mutex_new() flags
Enumerator
SYSTHREAD_MUTEX_NORMAL Normal.
SYSTHREAD_MUTEX_ERRORCHECK Error-checking.
SYSTHREAD_MUTEX_RECURSIVE Recursive.
36.50.3.1 void∗ defer ( void ∗ ob, method fn, t_symbol ∗ sym, short argc, t_atom ∗ argv )
Defer execution of a function to the main thread if (and only if) your function is executing in the scheduler thread.
Parameters
ob First argument passed to the function fun when it executes.
fn Function to be called, see below for how it should be declared.
sym Second argument passed to the function fun when it executes.
argc Count of arguments in argv. argc is also the third argument passed to the function fun when
it executes.
argv Array containing a variable number of t_atom function arguments. If this argument is non-
zero, defer allocates memory to make a copy of the arguments (according to the size passed
in argc) and passes the copied array to the function fun when it executes as the fourth argu-
ment.
Returns
Remarks
This function uses the isr() routine to determine whether you're at the Max timer interrupt level (in the scheduler
thread). If so, defer() creates a Qelem (see Qelems), calls qelem_front(), and its queue function calls the
function fn you passed with the specified arguments. If you're not in the scheduler thread, the function is
executed immediately with the arguments. Note that this implies that defer() is not appropriate for using in
situations such as Device or File manager I/0 completion routines. The defer_low() function is appropriate
however, because it always defers.
1 void myobject_do (myObject *client, t_symbol *s, short argc, t_atom *argv);
See also
defer_low()
36.50.3.2 void∗ defer_low ( void ∗ ob, method fn, t_symbol ∗ sym, short argc, t_atom ∗ argv )
Defer execution of a function to the back of the queue on the main thread.
Parameters
ob First argument passed to the function fun when it executes.
fn Function to be called, see below for how it should be declared.
sym Second argument passed to the function fun when it executes.
argc Count of arguments in argv. argc is also the third argument passed to the function fun when
it executes.
argv Array containing a variable number of t_atom function arguments. If this argument is non-
zero, defer allocates memory to make a copy of the arguments (according to the size passed
in argc) and passes the copied array to the function fun when it executes as the fourth argu-
ment.
Returns
Remarks
defer_low() always defers a call to the function fun whether you are already in the main thread or not, and uses
qelem_set(), not qelem_front(). This function is recommended for responding to messages that will cause your
object to open a dialog box, such as read and write.
1 void myobject_do (myObject *client, t_symbol *s, short argc, t_atom *argv);
See also
defer()
Returns
This function returns non-zero if you are within Max's scheduler thread, zero otherwise. Note that if your code
sets up other types of interrupt-level callbacks, such as for other types of device drivers used in asynchronous
mode, isr will return false.
36.50.3.4 void schedule ( void ∗ ob, method fun, long when, t_symbol ∗ sym, short argc, t_atom ∗ argv )
Cause a function to be executed at the timer level at some time in the future.
Parameters
ob First argument passed to the function fun when it executes.
fun Function to be called, see below for how it should be declared.
when The logical time that the function fun will be executed.
sym Second argument passed to the function fun when it executes.
argc Count of arguments in argv. argc is also the third argument passed to the function fun when
it executes.
argv Array containing a variable number of t_atom function arguments. If this argument is non-
zero, defer allocates memory to make a copy of the arguments (according to the size passed
in argc) and passes the copied array to the function fun when it executes as the fourth argu-
ment.
Remarks
schedule() calls a function at some time in the future. Unlike defer(), the function is called in the scheduling
loop when logical time is equal to the specified value when. This means that the function could be called at
interrupt level, so it should follow the usual restrictions on interrupt-level conduct. The function fun passed to
schedule should be declared as follows:
1 void myobject_do (myObject *client, t_symbol *s, short argc, t_atom *argv);
Remarks
See also
defer()
36.50.3.5 void schedule_delay ( void ∗ ob, method fun, long delay, t_symbol ∗ sym, short argc, t_atom ∗ argv )
Cause a function to be executed at the timer level at some time in the future specified by a delay offset.
Parameters
ob First argument passed to the function fun when it executes.
fun Function to be called, see below for how it should be declared.
delay The delay from the current time before the function will be executed.
sym Second argument passed to the function fun when it executes.
argc Count of arguments in argv. argc is also the third argument passed to the function fun when
it executes.
argv Array containing a variable number of t_atom function arguments. If this argument is non-
zero, schedule_delay() allocates memory to make a copy of the arguments (according to the
size passed in argc) and passes the copied array to the function fun when it executes as the
fourth argument.
Remarks
schedule_delay() is similar to schedule() but allows you to specify the time as a delay rather than a specific
logical time.
See also
schedule()
36.50.3.6 long systhread_create ( method entryproc, void ∗ arg, long stacksize, long priority, long flags, t_systhread ∗
thread )
Parameters
entryproc A method to call in the new thread when the thread is created.
arg An argument to pass to the method specified for entryproc. Typically this might be a pointer
to your object's struct.
stacksize Not used. Pass 0 for this argument.
priority Pass 0 for default priority. The priority can range from -32 to 32 where -32 is low, 0 is default
and 32 is high.
flags Not used. Pass 0 for this argument.
thread The address of a t_systhread where this thread's instance pointer will be stored.
Returns
Detach a thread.
After detaching a thread you cannot call systhread_join() on it.
Parameters
thread The thread to join.
Returns
Remarks
You should either call systhread_join() on a thread or systhread_detach() to allow the system to reclaim re-
sources.
Returns
Returns
Returns true if the function is being executed in an audio thread, otherwise false.
Check to see if the function currently being executed is in the main thread.
Returns
Returns true if the function is being executed in the main thread, otherwise false.
Returns
Returns true if the function is being executed in a scheduler thread, otherwise false.
Wait for thread to quit and get return value from systhread_exit().
Parameters
thread The thread to join.
retval The address of a long to hold the return value (status) from systhread_exit().
Returns
Remarks
If your object is freed, and your thread function accesses memory from your object, then you will obviously
have a memory violation. A common use of systhread_join() is to prevent this situation by waiting (in your free
method) for the thread to exit.
Returns
The thread instance pointer for the thread from which this function is called.
Parameters
thread The thread for which to set the priority.
priority A value in the range -32 to 32 where -32 is lowest, 0 is default, and 32 is highest.
Returns
A critical region is a simple mechanism that prevents multiple threads from accessing at once code protected by the
same critical region.
Collaboration diagram for Critical Regions:
Functions
Variables
A critical region is a simple mechanism that prevents multiple threads from accessing at once code protected by the
same critical region.
The code fragments could be different, and in completely different modules, but as long as the critical region is
the same, no two threads should call the protected code at the same time. If one thread is inside a critical region,
and another thread wants to execute code protected by the same critical region, the second thread must wait for
the first thread to exit the critical region. In some implementations a critical region can be set so that if it takes
too long for the first thread to exit said critical region, the second thread is allowed to execute, dangerously and
potentially causing crashes. This is the case for the critical regions exposed by Max and the default upper limit for a
given thread to remain inside a critical region is two seconds. Despite the fact that there are two seconds of leeway
provided before two threads can dangerously enter a critical region, it is important to only protect as small a portion
of code as necessary with a critical region.
Under Max 4.1 and earlier there was a simple protective mechanism called "lockout" that would prevent the sched-
uler from interrupting the low priority thread during sensitive operations such as sending data out an outlet or
modifying members of a linked list. This lockout mechanism has been deprecated, and under the Mac OS X and
Windows XP versions (Max 4.2 and later) does nothing. So how do you protect thread sensitive operations? Use
critical regions (also known as critical sections). However, it is very important to mention that all outlet calls are now
thread safe and should never be contained inside a critical region. Otherwise, this could result in serious timing
problems. For other tasks which are not thread safe, such as accessing a linked list, critical regions or some other
thread protection mechanism are appropriate.
In Max, the critical_enter() function is used to enter a critical region, and the critical_exit() function is used to exit
a critical region. It is important that in any function which uses critical regions, all control paths protected by the
critical region, exit the critical region (watch out for goto or return statements). The critical_enter() and critical_←-
exit() functions take a critical region as an argument. However, for almost all purposes, we recommend using the
global critical region in which case this argument is zero. The use of multiple critical regions can cause problems
such as deadlock, i.e. when thread #1 is inside critical region A waiting on critical region B, but thread #2 is inside
critical region B and is waiting on critical region A. In a flexible programming environment such as Max, deadlock
conditions are easier to generate than you might think. So unless you are completely sure of what you are doing,
and absolutely need to make use of multiple critical regions to protect your code, we suggest you use the global
critical region.
In the following example code we show how one might use critical regions to protect the traversal of a linked list,
testing to find the first element whose values is equal to "val". If this code were not protected, another thread which
was modifying the linked list could invalidate assumptions in the traversal code.
critical_enter(0);
for (p = head; p; p = p->next) {
if (p->value == val)
break;
}
critical_exit(0);
return p;
And just to illustrate how to ensure a critical region is exited when multiple control paths are protected by a critical
region, here's a slight variant.
critical_enter(0);
for (p = head; p; p = p->next) {
if (p->value == val) {
critical_exit(0);
return p;
}
}
critical_exit(0);
return NULL;
For more information on multi-threaded programming, hardware interrupts, and related topics, we suggest you per-
form some research online or read the relevant chapters of "Modern Operating Systems" by Andrew S. Tanenbaum
(Prentice Hall). At the time of writing, some relevant chapters from this book are available for download in PDF
format on Prentice Hall’s web site. See:
http://www.prenhall.com/divisions/esm/app/author_tanenbaum/custom/mos2e/
Look under "sample sections".
See also
critical_exit()
Referenced by jit_global_critical_enter().
Referenced by jit_global_critical_exit().
Returns
See also
critical_enter()
36.52 Mutexes
Threads Mutexes
Functions
See also
Critical Regions
Returns
Parameters
pmutex The mutex instance pointer.
Returns
See also
systhread_mutex_trylock()
Create a new mutex, which can be used to place thread locks around critical code.
The mutex should be freed with systhread_mutex_free().
Parameters
pmutex The address of a variable to store the mutex pointer.
flags Flags to determine the behaviour of the mutex, as defined in e_max_systhread_mutex_flags.
Returns
Remarks
One reason to use systhread_mutex_new() instead of Critical Regions is to create non-recursive locks, which
are lighter-weight than recursive locks.
Returns
Returns
See also
systhread_mutex_lock()
Returns
JGraphics
User Interface
DataView
Modules
• JGraphics
JGraphics is the API for creating user interface objects introduced with Max 5.
• DataView
The jdataview object provides a mechanism to display data in a tabular format.
36.54 JGraphics
JGraphics is the API for creating user interface objects introduced with Max 5.
Collaboration diagram for JGraphics:
Popup Menus
Colors
JPattern
Styles
TextField
Box Layer
JSurface
TextLayout
JFont
Modules
• JSurface
A surface is an abstract base class for something you render to.
• Scalable Vector Graphics
• JFont
• JGraphics Matrix Transformations
The t_jmatrix is one way to represent a transformation.
• JPattern
A pattern is like a brush that is used to fill a path with.
• Colors
• Styles
Styles provide a means by which to inherit attribute values from a patcher that are consistently used across many
objects.
• TextField
The textfield is a high-level text display object that may be used by a UI object to represent text in a patcher.
• TextLayout
A textlayout is lower-level text rendering object used by higher-level entities such as TextField.
• Popup Menus
Popup menu API so externals can create popup menus that can also be drawn into.
• Box Layer
The boxlayer functions provide way to make it easier to use cached offscreen images (layers) in your drawing.
Data Structures
• struct t_jgraphics_font_extents
A structure for holding information related to how much space the rendering of a given font will use.
Macros
• #define JGRAPHICS_RECT_BOTTOM(rect)
Determine the coordinate of the bottom of a rect.
• #define JGRAPHICS_RECT_RIGHT(rect)
Determine the coordinate of the right side of a rect.
• #define JGRAPHICS_PI
Utility macro to return the value of Pi.
• #define JGRAPHICS_2PI
Utility macro to return the value of twice Pi.
• #define JGRAPHICS_PIOVER2
Utility macro to return the value of half of Pi.
• #define JGRAPHICS_3PIOVER2
Utility macro to return the 270º Case.
Typedefs
Enumerations
Functions
• void jgraphics_arc (t_jgraphics ∗g, double xc, double yc, double radius, double angle1, double angle2)
Add a circular, clockwise, arc to the current path.
• void jgraphics_ovalarc (t_jgraphics ∗g, double xc, double yc, double radiusx, double radiusy, double angle1,
double angle2)
Add a non-circular arc to the current path.
• void jgraphics_arc_negative (t_jgraphics ∗g, double xc, double yc, double radius, double angle1, double
angle2)
Add a circular, counter-clockwise, arc to the current path.
• void jgraphics_curve_to (t_jgraphics ∗g, double x1, double y1, double x2, double y2, double x3, double y3)
Add a cubic Bezier spline to the current path.
• void jgraphics_rel_curve_to (t_jgraphics ∗g, double x1, double y1, double x2, double y2, double x3, double
y3)
Add a cubic Bezier spline to the current path, using coordinates relative to the current point.
• void jgraphics_line_to (t_jgraphics ∗g, double x, double y)
Add a line segment to the current path.
• void jgraphics_rel_line_to (t_jgraphics ∗g, double x, double y)
Add a line segment to the current path, using coordinates relative to the current point.
• void jgraphics_move_to (t_jgraphics ∗g, double x, double y)
Move the cursor to a new point and begin a new subpath.
• void jgraphics_rel_move_to (t_jgraphics ∗g, double x, double y)
Move the cursor to a new point and begin a new subpath, using coordinates relative to the current point.
• void jgraphics_rectangle (t_jgraphics ∗g, double x, double y, double width, double height)
Add a closed rectangle path in the context.
• void jgraphics_oval (t_jgraphics ∗g, double x, double y, double width, double height)
Deprecated – do not use.
• void jgraphics_rectangle_rounded (t_jgraphics ∗g, double x, double y, double width, double height, double
ovalwidth, double ovalheight)
Add a closed rounded-rectangle path in the context.
• void jgraphics_ellipse (t_jgraphics ∗g, double x, double y, double width, double height)
Add a closed elliptical path in the context.
• void jgraphics_bubble (t_jgraphics ∗g, double bodyx, double bodyy, double bodywidth, double bodyheight,
double cornersize, double arrowtipx, double arrowtipy, t_jgraphics_bubble_side whichside, double arrowedge-
prop, double arrowwidth)
Add a closed bubble path in the context.
• void jgraphics_triangle (t_jgraphics ∗g, double x1, double y1, double x2, double y2, double x3, double y3)
Add a closed triangular path in the context.
• void jgraphics_select_font_face (t_jgraphics ∗g, const char ∗family, t_jgraphics_font_slant slant, t_jgraphics←-
_font_weight weight)
Specify a font for a graphics context.
• void jgraphics_select_jfont (t_jgraphics ∗g, t_jfont ∗jfont)
Specify a font for a graphics context by passing a t_jfont object.
• void jgraphics_set_font_size (t_jgraphics ∗g, double size)
Specify the font size for a context.
• void jgraphics_set_underline (t_jgraphics ∗g, char underline)
Turn underlining on/off for text in a context.
• void jgraphics_show_text (t_jgraphics ∗g, const char ∗utf8)
Display text at the current position in a context.
• void jgraphics_text_path (t_jgraphics ∗g, const char ∗utf8)
Add a path of text to the current path.
• void jgraphics_font_extents (t_jgraphics ∗g, t_jgraphics_font_extents ∗extents)
Return the extents of the currently selected font for a given graphics context.
• void jgraphics_text_measure (t_jgraphics ∗g, const char ∗utf8, double ∗width, double ∗height)
Return the height and width of a string given current graphics settings in a context.
• void jgraphics_text_measuretext_wrapped (t_jgraphics ∗g, const char ∗utf8, double wrapwidth, long include-
whitespace, double ∗width, double ∗height, long ∗numlines)
Return the height, width, and number of lines that will be used to render a given string.
• long jgraphics_system_canantialiastexttotransparentbg ()
Determine if you can anti-alias text to a transparent background.
• void jgraphics_user_to_device (t_jgraphics ∗g, double ∗x, double ∗y)
User coordinates are those passed to drawing functions in a given t_jgraphics context.
• void jgraphics_device_to_user (t_jgraphics ∗g, double ∗x, double ∗y)
User coordinates are those passed to drawing functions in a given t_jgraphics context.
• void jgraphics_getfiletypes (void ∗dummy, long ∗count, t_fourcc ∗∗filetypes, char ∗alloc)
Get a list of of filetypes appropriate for use with jgraphics surfaces.
• long jgraphics_rectintersectsrect (t_rect ∗r1, t_rect ∗r2)
Simple utility to test for rectangle intersection.
• long jgraphics_rectcontainsrect (t_rect ∗outer, t_rect ∗inner)
Simple utility to test for rectangle containment.
• void jgraphics_position_one_rect_near_another_rect_but_keep_inside_a_third_rect (t_rect ∗positioned_rect,
const t_rect ∗positioned_near_this_rect, const t_rect ∗keep_inside_this_rect)
Generate a t_rect according to positioning rules.
• void jgraphics_clip (t_jgraphics ∗g, double x, double y, double width, double height)
Clip to a subset of the graphics context; once done, cannot be undone, only further reduced.
JGraphics is the API for creating user interface objects introduced with Max 5.
It includes functions for drawing vector-based shapes, managing pop-up menus, rendering text, and importing
graphics resources. The API design is inspired by and analogous to the Cairo API, though the underlying imple-
mentation is actually drawn using JUCE (JUCE functions, however, cannot be called directly).
Enumerator
Enumerator
JGRAPHICS_FORMAT_ARGB32 Color is represented using 32 bits, 8 bits each for the components, and
including an alpha component.
JGRAPHICS_FORMAT_RGB24 Color is represented using 32 bits, 8 bits each for the components. There is
no alpha component.
JGRAPHICS_FORMAT_A8 The color is represented only as an 8-bit alpha mask.
Enumerator
36.54.4.2 void jgraphics_arc ( t_jgraphics ∗ g, double xc, double yc, double radius, double angle1, double angle2 )
Parameters
g The graphics context.
xc The horizontal coordinate of the arc's center.
yc The vertical coordinate of the arc's center.
radius The radius of the arc.
angle1 The starting angle of the arc in radians. Zero radians is center right (positive x axis).
angle2 The terminal angle of the arc in radians. Zero radians is center right (positive x axis).
36.54.4.3 void jgraphics_arc_negative ( t_jgraphics ∗ g, double xc, double yc, double radius, double angle1, double angle2
)
36.54.4.4 void jgraphics_bubble ( t_jgraphics ∗ g, double bodyx, double bodyy, double bodywidth, double bodyheight,
double cornersize, double arrowtipx, double arrowtipy, t_jgraphics_bubble_side whichside, double arrowedgeprop,
double arrowwidth )
36.54.4.5 void jgraphics_clip ( t_jgraphics ∗ g, double x, double y, double width, double height )
Clip to a subset of the graphics context; once done, cannot be undone, only further reduced.
Parameters
g The t_jgraphics context to be clipped.
x x origin of clip region.
y y origin of clip region.
Returns
36.54.4.8 void jgraphics_curve_to ( t_jgraphics ∗ g, double x1, double y1, double x2, double y2, double x3, double y3 )
User coordinates are those passed to drawing functions in a given t_jgraphics context.
Device coordinates refer to patcher canvas coordinates, before any zooming.
36.54.4.11 void jgraphics_ellipse ( t_jgraphics ∗ g, double x, double y, double width, double height )
Parameters
g The graphics context.
x The horizontal origin.
y The vertical origin.
width The width of the rect.
height The height of the rect.
Return the extents of the currently selected font for a given graphics context.
Parameters
g Pointer to a jgraphics context.
extents The address of a t_jgraphics_font_extents structure to be filled with the results.
36.54.4.14 void jgraphics_getfiletypes ( void ∗ dummy, long ∗ count, t_fourcc ∗∗ filetypes, char ∗ alloc )
Remarks
1 char filename[MAX_PATH_CHARS];
2 t_fourcc *type = NULL;
3 long ntype;
4 long outtype;
5 t_max_err err;
6 char alloc;
7 short path;
8 t_jsurface *surface;
9
10 if (want_to_show_dialog) {
11 jgraphics_getfiletypes(x, &ntype, &type, &alloc);
12 err = open_dialog(filename, &path,(void *)&outtype, (void *)type, ntype);
13 if (err)
14 goto out;
15 }
16 else {
17 strncpy_zero(filename, s->s_name, MAX_PATH_CHARS);
18 err = locatefile_extended(filename, &path, &outtype, type, ntype);
19 if (err)
20 goto out;
21 }
36.54.4.18 void jgraphics_oval ( t_jgraphics ∗ g, double x, double y, double width, double height )
36.54.4.19 void jgraphics_ovalarc ( t_jgraphics ∗ g, double xc, double yc, double radiusx, double radiusy, double angle1,
double angle2 )
Parameters
g The graphics context.
xc The horizontal coordinate of the arc's center.
yc The vertical coordinate of the arc's center.
radiusx The horizontal radius of the arc.
radiusy The vertical radius of the arc.
angle1 The starting angle of the arc in radians. Zero radians is center right (positive x axis).
angle2 The terminal angle of the arc in radians. Zero radians is center right (positive x axis).
Create a new path consisting of the original path stroked with a given thickness.
Parameters
p the path to be stroked
thickness thickness of the stroke
join the style to join segments together at corners
cap the style of end cap to use
Returns
the new path, which must be freed with jgraphics_path_destroy() when done
Release/free a path.
Parameters
path The path to release.
Returns
36.54.4.24 double jgraphics_path_getnearestpoint ( t_jpath ∗ path, double x, double y, double ∗ path_x, double ∗ path_y )
Finds the point on the path that is nearest to the point x,y passed in.
Parameters
path the path to search
x x position of the target point
y y position of the target point
path_x pointer to double to receive the x position of closest point on path
path_y pointer to double to receive the y position of the closest point on path
Returns
returns the distance along the path from the path start position to the found point on the path
Returns
Return a point that lies a given distance from the start of the path.
Parameters
path the path
distancefrom- distance from the start point
start
x pointer to double to receive the x position of the point
y pointer to double to receive the y position of the point
36.54.4.27 long jgraphics_path_intersectsline ( t_jpath ∗ path, double x1, double y1, double x2, double y2 )
Test if the path intersects the line defined by x1,y1 and x2,y2.
Parameters
path the path
x1 the x-coordinate of the first point on the line
y1 the y-coordinate of the first point on the line
x2 the x-coordinate of the second point on the line
y2 the y-coordinate of the second point on the line
Parameters
g The graphics context.
cornerRadius The amount by which to round corners.
36.54.4.30 void jgraphics_rectangle ( t_jgraphics ∗ g, double x, double y, double width, double height )
36.54.4.31 void jgraphics_rectangle_rounded ( t_jgraphics ∗ g, double x, double y, double width, double height, double
ovalwidth, double ovalheight )
Returns
Returns true if the inner rect is completely inside the outer rect, otherwise false.
Returns
Returns
36.54.4.35 void jgraphics_rel_curve_to ( t_jgraphics ∗ g, double x1, double y1, double x2, double y2, double x3, double y3
)
Add a cubic Bezier spline to the current path, using coordinates relative to the current point.
Parameters
g The graphics context.
x1 The first control point.
y1 The first control point.
x2 The second control point.
y2 The second control point.
x3 The destination point.
y3 The destination point.
Add a line segment to the current path, using coordinates relative to the current point.
Parameters
g The graphics context.
x The destination point.
y The destination point.
Move the cursor to a new point and begin a new subpath, using coordinates relative to the current point.
Parameters
g The graphics context.
x The new location.
y The new location.
Returns
Parameters
g The graphics context.
size The font size.
Returns
36.54.4.45 void jgraphics_text_measure ( t_jgraphics ∗ g, const char ∗ utf8, double ∗ width, double ∗ height )
Return the height and width of a string given current graphics settings in a context.
Parameters
g Pointer to a jgraphics context.
utf8 A string containing the text whose dimensions we wish to find.
width The address of a variable to be filled with the width of the rendered text.
height The address of a variable to be filled with the height of the rendered text.
36.54.4.46 void jgraphics_text_measuretext_wrapped ( t_jgraphics ∗ g, const char ∗ utf8, double wrapwidth, long
includewhitespace, double ∗ width, double ∗ height, long ∗ numlines )
Return the height, width, and number of lines that will be used to render a given string.
Parameters
36.54.4.48 void jgraphics_triangle ( t_jgraphics ∗ g, double x1, double y1, double x2, double y2, double x3, double y3 )
User coordinates are those passed to drawing functions in a given t_jgraphics context.
Device coordinates refer to patcher canvas coordinates, before any zooming.
36.55 JSurface
JGraphics JSurface
Typedefs
Functions
Returns
36.55.2.2 t_max_err jgraphics_get_resource_data ( const void ∗ moduleRef, const char ∗ resname, long extcount, t_atom
∗ exts, void ∗∗ data, unsigned long ∗ datasize )
Remarks
You are responsible for freeing any data returned in the data pointer
Returns
36.55.2.3 void jgraphics_image_surface_clear ( t_jsurface ∗ s, int x, int y, int width, int height )
Returns
Returns
Returns
Returns
See also
jgraphics_write_image_surface_to_filedata()
Remarks
The following example shows an example of how this might be used in an external.
Create an image surface, filling it with the contents of a file, and get a reference to the surface.
Use jgraphics_surface_destroy() to release your reference to the surface when you are done.
Parameters
filename The name of the file.
path The path id of the file.
Returns
See also
jgraphics_image_surface_draw_fast()
See also
jgraphics_image_surface_draw
Returns
Returns
36.55.2.15 void jgraphics_image_surface_scroll ( t_jsurface ∗ s, int x, int y, int width, int height, int dx, int dy, t_jpath ∗∗
path )
Parameters
s The surface to scroll.
x The origin of the rect to scroll.
36.55.2.17 t_max_err jgraphics_image_surface_writejpeg ( t_jsurface ∗ surface, const char ∗ filename, short path )
Returns
36.55.2.18 t_max_err jgraphics_image_surface_writepng ( t_jsurface ∗ surface, const char ∗ filename, short path, long
dpi )
Returns
Parameters
s The surface to release.
Returns
36.55.2.21 void jgraphics_write_image_surface_to_filedata ( t_jsurface ∗ surf, long fmt, void ∗∗ data, long ∗ size )
Remarks
1 long size = 0;
2 void *data = NULL;
3
4 jgraphics_write_image_surface_to_filedata(x->j_surface, JGRAPHICS_FILEFORMAT_PNG, &data, &size);
5 if (size) {
6 x->j_format = gensym("png");
7 binarydata_appendtodictionary(data, size, gensym("data"), x->j_format, d);
8 x->j_imagedata = data;
9 x->j_imagedatasize = size;
10 }
See also
jgraphics_image_surface_create_from_filedata()
Functions
Returns
Parameters
moduleRef The external's moduleRef.
resname The name of the SVG resource.
Returns
See also
jgraphics_image_surface_create_from_resource()
Returns
36.57 JFont
JGraphics JFont
Typedefs
Enumerations
Functions
• t_jfont ∗ jfont_create (const char ∗family, t_jgraphics_font_slant slant, t_jgraphics_font_weight weight, double
size)
Create a new font object.
• t_jfont ∗ jfont_reference (t_jfont ∗font)
Create new reference to an existing font object.
• void jfont_destroy (t_jfont ∗font)
Release or free a font object.
• long jfont_isequalto (t_jfont ∗font, t_jfont ∗other)
Compare two fonts to see if they are equivalent.
• void jfont_set_family (t_jfont ∗font, t_symbol ∗family)
Set the name of the font family (e.g.
• t_symbol ∗ jfont_get_family (t_jfont ∗font)
Get the name of the font family (e.g.
• void jfont_set_slant (t_jfont ∗font, t_jgraphics_font_slant slant)
Set the slant of the font.
• t_jgraphics_font_slant jfont_get_slant (t_jfont ∗font)
Get the slant of the font.
• void jfont_set_weight (t_jfont ∗font, t_jgraphics_font_weight weight)
Set the weight of the font.
• t_jgraphics_font_weight jfont_get_weight (t_jfont ∗font)
Get the weight of the font.
Enumerator
Enumerator
Returns
Returns
36.57.3.3 t_jfont∗ jfont_create ( const char ∗ family, t_jgraphics_font_slant slant, t_jgraphics_font_weight weight,
double size )
Returns
Parameters
font The font object.
extents The font extents upon return/
Given a font, find out the width and height of the 'M' character.
This is equivalent to jfont_text_measure(font, "M", width, height) but is faster.
Parameters
font The font object.
width The address of a variable to hold the width upon return.
height The address of a variable to hold the height upon return.
Returns
Returns
Returns
Parameters
font The font object.
Returns
Returns
Returns
Returns
Parameters
font The font object for which to obtain a reference.
Returns
36.57.3.20 void jfont_text_measure ( t_jfont ∗ font, const char ∗ utf8, double ∗ width, double ∗ height )
Given a font, find out how much area is required to render a string of text.
Parameters
font The font object.
utf8 The text whose rendering will be measured.
width The address of a variable to hold the width upon return.
height The address of a variable to hold the height upon return.
36.57.3.21 void jfont_text_measuretext_wrapped ( t_jfont ∗ font, const char ∗ utf8, double wrapwidth, long
includewhitespace, double ∗ width, double ∗ height, long ∗ numlines )
Given a font, find out how much area is required to render a string of text, provided a horizontal maximum limit at
which the text is wrapped.
Parameters
font The font object.
utf8 The text whose rendering will be measured.
wrapwidth The maximum width, above which text should wrap onto a new line.
includewhites- If non-zero, include whitespace in the measurement.
pace
width The address of a variable to hold the width upon return.
height The address of a variable to hold the height upon return.
numlines The address of a variable to hold the number of lines of text after wrapping upon return.
Returns
Returns
Returns
Returns
Data Structures
• struct t_jmatrix
An affine transformation (such as scale, shear, etc).
Functions
• void jgraphics_matrix_init (t_jmatrix ∗x, double xx, double yx, double xy, double yy, double x0, double y0)
Set a t_jmatrix to an affine transformation.
• void jgraphics_matrix_init_identity (t_jmatrix ∗x)
Modify a matrix to be an identity transform.
• void jgraphics_matrix_init_translate (t_jmatrix ∗x, double tx, double ty)
Initialize a t_jmatrix to translate (offset) a point.
• void jgraphics_matrix_init_scale (t_jmatrix ∗x, double sx, double sy)
Initialize a t_jmatrix to scale (offset) a point.
• void jgraphics_matrix_init_rotate (t_jmatrix ∗x, double radians)
Initialize a t_jmatrix to rotate (offset) a point.
• void jgraphics_matrix_translate (t_jmatrix ∗x, double tx, double ty)
Apply a translation to an existing matrix.
• void jgraphics_matrix_scale (t_jmatrix ∗x, double sx, double sy)
Apply a scaling to an existing matrix.
• void jgraphics_matrix_rotate (t_jmatrix ∗x, double radians)
Apply a rotation to an existing matrix.
• void jgraphics_matrix_invert (t_jmatrix ∗x)
Invert an existing matrix.
• void jgraphics_matrix_multiply (t_jmatrix ∗result, const t_jmatrix ∗a, const t_jmatrix ∗b)
Multiply two matrices: resulting matrix has effect of first applying a and then applying b.
• void jgraphics_matrix_transform_point (const t_jmatrix ∗matrix, double ∗x, double ∗y)
Transform a point using a t_jmatrix transormation.
36.58.2.1 void jgraphics_matrix_init ( t_jmatrix ∗ x, double xx, double yx, double xy, double yy, double x0, double y0 )
Remarks
1 xnew = xx * x + xy * y + x0;
2 ynew = yx * x + yy * y + y0;
Parameters
x The t_jmatrix.
tx The amount of x-axis translation.
ty The amount of y-axis translation.
Multiply two matrices: resulting matrix has effect of first applying a and then applying b.
Parameters
result The resulting product t_jmatrix.
a The first operand.
b The second operand.
36.59 JPattern
JGraphics JPattern
Typedefs
36.60 Colors
JGraphics Colors
Data Structures
• struct t_jrgb
A color composed of red, green, and blue components.
• struct t_jrgba
A color composed of red, green, blue, and alpha components.
Functions
Parameters
argc The number of atoms in the array provided in argv. This should be 3 or 4 depending on
whether or not the alpha channel is being provided.
argv The address to the first of an array of atoms that define the color.
c The address of a t_jrgba struct for which the color will be defined.
Returns
Get the value of a t_jrgba struct, returned as an array of atoms with the values for each component.
Parameters
jrgba The color struct whose color will be retrieved.
argc The address of a variable that will be set with the number of atoms in the argv array. The
returned value should be 4. The value of the int should be set to 0 prior to calling this function.
argv The address of a t_atom pointer that will receive the a new array of atoms set to the values of
the jrgba struct. The pointer should be set to NULL prior to calling this function. There should
be 4 atoms returned, representing alpha, red, green, and blue components. When you are
done using the atoms, you are responsible for freeing the pointer using sysmem_freeptr().
Returns
This function returns the error code MAX_ERR_NONE if successful, or one of the other error codes defined
in e_max_errorcodes if unsuccessful.
Set the value of a t_jrgba struct, given an array of atoms with the values to use.
Parameters
jrgba The color struct whose color will be set.
argc The number of atoms in the array. This must be 4.
argv The address of the first of the atoms in the array. There must be 4 atoms, representing alpha,
red, green, and blue components.
Returns
This function returns the error code MAX_ERR_NONE if successful, or one of the other error codes defined
in e_max_errorcodes if unsuccessful.
Returns
Copy a color.
Parameters
dest The address of a t_jrgba struct to which the color will be copied.
src The address of a t_jrgba struct from which the color will be copied.
36.61 Styles
Styles provide a means by which to inherit attribute values from a patcher that are consistently used across many
objects.
Collaboration diagram for Styles:
JGraphics Styles
Macros
• #define FILL_ATTR_SAVE
Flag indicating we want this fill attribute saved (creates attrs).
• #define CLASS_ATTR_STYLE_RGBA_NOSAVE(c, attrname, flags, structname, structmember, label)
Define an RGBA style attribute with standard settings.
• #define CLASS_ATTR_STYLE_RGBA(c, attrname, flags, structname, structmember, label)
Define an RGBA style attribute with standard settings.
• #define CLASS_ATTR_STYLE_RGBA_PREVIEW(c, attrname, flags, structname, structmember, label, pre-
viewtype)
Define an RGBA style attribute with standard settings.
• #define CLASS_ATTR_STYLE_ALIAS_NOSAVE(c, attrname, aliasname)
Define an unsaved alias.
• #define CLASS_ATTR_STYLE_ALIAS_COMPATIBILITY(c, attrname, aliasname)
Define a Max 5/6 saved compatibility alias.
• #define CLASS_ATTR_STYLE_ALIAS_RGBA_LEGACY(c, attrname, aliasname)
Define a Max 4 legacy RGB attribute alias.
Functions
Styles provide a means by which to inherit attribute values from a patcher that are consistently used across many
objects.
See also
See also
See also
CLASS_ATTR_STYLE_RGBA_NOSAVE is a variant that does not save the state with the Patcher.
CLASS_ATTR_STYLE_RGBA_PREVIEW is a variant that provides a style preview.
class_attr_setstyle() is the lower level function used to provide the style part of the attribute definition.
See also
See also
CLASS_ATTR_STYLE_RGBA_NOSAVE is a variant that does not save the state with the Patcher.
CLASS_ATTR_STYLE_RGBA is a variant that saves the state with the Patcher but does not provide the
preview.
class_attr_setstyle() is the lower level function used to provide the style part of the attribute definition.
See also
class_attr_setfill()
The 'uitextfield' example project in the SDK.
See also
See also
36.61.3.3 void class_attr_style_alias ( t_class ∗ c, const char ∗ name, const char ∗ aliasname, long legacy )
See also
CLASS_ATTR_STYLE_ALIAS_NOSAVE
The 'jslider' project in the SDK.
Associate the name of an attribute of your class with the name of an attribute of a style.
Parameters
c The class whose attribute will be added to the style.
attrname The name of the attribute of your class.
mapname The name of the attribute from the style.
See also
Fill using the current value of a named style color that exists either in the object or the defined style.
Abdridged example from the 'attrui' object:
Parameters
b The instance of your object.
g The jgraphics context.
attrname The name of the attribute whose fill style you want.
area The rect area to be filled.
Fill using the current value of a named style color that exists either in the object or the defined style.
Example from the 'panel' object:
1 t_rect r;
2
3 r.x = r.y = thick * 0.5;
4 r.width = rect->width - thick;
5 r.height = rect->height - thick;
6
7 pat = jgraphics_attr_setfill((t_object *)x, g, ps_bgfillcolor, &r);
8 jgraphics_rectangle_rounded(g, r.x, r.y, r.width, r.height, round, round);
9 jgraphics_fill_preserve(g);
10 jgraphics_pattern_destroy(pat);
11
12 object_attr_getjrgba(x, ps_bordercolor, &color);
13 jgraphics_set_source_jrgba(g, &color);
14 jgraphics_set_line_width(g, thick);
15 jgraphics_stroke(g);
Parameters
b The instance of your object.
g The jgraphics context.
attrname The name of the attribute whose fill style you want.
area The rect area to be filled.
Returns
The pattern.
Returns
36.61.3.8 void object_attr_getfillcolor_atposition ( t_object ∗ b, const char ∗ attrname, double pos, t_jrgba ∗ c )
Returns
36.62 TextField
The textfield is a high-level text display object that may be used by a UI object to represent text in a patcher.
Collaboration diagram for TextField:
JGraphics TextField
Functions
The textfield is a high-level text display object that may be used by a UI object to represent text in a patcher.
It is built on the lower-level TextLayout
Returns
Parameters
tf The textfield instance pointer.
prgba The address of a valid t_jrgba whose values will be filled-in upon return.
Returns
Returns
Returns
Returns
Returns
Returns
Returns
Returns
36.62.2.10 t_max_err textfield_get_textmargins ( t_object ∗ tf, double ∗ pleft, double ∗ ptop, double ∗ pright, double ∗
pbottom )
Retrieve the margins from the edge of the textfield to the text itself in a textfield.
Parameters
tf The textfield instance pointer.
pleft The address of a variable to hold the value of the left margin upon return.
ptop The address of a variable to hold the value of the top margin upon return.
pright The address of a variable to hold the value of the right margin upon return.
pbottom The address of a variable to hold the value of the bottom margin upon return.
Returns
Returns
Returns
Returns
Returns
Returns
Returns
Returns
Returns
Returns
Returns
Returns
Parameters
tf The textfield instance pointer.
c The new value for the attribute.
Returns
Returns
36.62.2.24 t_max_err textfield_set_textmargins ( t_object ∗ tf, double left, double top, double right, double bottom )
Set the margins from the edge of the textfield to the text itself in a textfield.
Parameters
tf The textfield instance pointer.
left The new value for the left margin.
top The new value for the top margin.
right The new value for the right margin.
bottom The new value for the bottom margin.
Returns
Returns
Parameters
tf The textfield instance pointer.
c The new value for the attribute.
Returns
Returns
Returns
Returns
36.63 TextLayout
A textlayout is lower-level text rendering object used by higher-level entities such as TextField.
Collaboration diagram for TextLayout:
JGraphics TextLayout
Enumerations
Functions
• t_jtextlayout ∗ jtextlayout_create ()
Create a new textlayout object.
• t_jtextlayout ∗ jtextlayout_withbgcolor (t_jgraphics ∗g, t_jrgba ∗bgcolor)
Create a new textlayout object.
• void jtextlayout_destroy (t_jtextlayout ∗textlayout)
Release/free a textlayout object.
• void jtextlayout_set (t_jtextlayout ∗textlayout, const char ∗utf8, t_jfont ∗jfont, double x, double y, double width,
double height, t_jgraphics_text_justification justification, t_jgraphics_textlayout_flags flags)
Set the text and attributes of a textlayout object.
• void jtextlayout_settext (t_jtextlayout ∗textlayout, const char ∗utf8, t_jfont ∗jfont)
Set the text of a textlayout object.
• void jtextlayout_settextcolor (t_jtextlayout ∗textlayout, t_jrgba ∗textcolor)
Set the color to render text in a textlayout object.
• void jtextlayout_measuretext (t_jtextlayout ∗textlayout, long startindex, long numchars, long includewhites-
pace, double ∗width, double ∗height, long ∗numlines)
Return a measurement of how much space will be required to draw the text of a textlayout.
• void jtextlayout_draw (t_jtextlayout ∗tl, t_jgraphics ∗g)
Draw a textlayout in a given graphics context.
• long jtextlayout_getnumchars (t_jtextlayout ∗tl)
Retrieve a count of the number of characters in a textlayout object.
• t_max_err jtextlayout_getcharbox (t_jtextlayout ∗tl, long index, t_rect ∗rect)
Retrieve the t_rect containing a character at a given index.
• t_max_err jtextlayout_getchar (t_jtextlayout ∗tl, long index, long ∗pch)
Retrieve the unicode character at a given index.
• t_jpath ∗ jtextlayout_createpath (t_jtextlayout ∗tl)
Create a t_jpath object representing the text layout.
A textlayout is lower-level text rendering object used by higher-level entities such as TextField.
Enumerator
Returns
Returns
Returns
Returns
Returns
36.63.3.8 void jtextlayout_measuretext ( t_jtextlayout ∗ textlayout, long startindex, long numchars, long includewhitespace,
double ∗ width, double ∗ height, long ∗ numlines )
Return a measurement of how much space will be required to draw the text of a textlayout.
Parameters
textlayout The textlayout object to query.
startindex You can measure a subset of the characters. This defines the character from which to start.
numchars Pass -1 for all characters from startindex to end
includewhites- Define whether to measure with or without whitespace truncated from edges.
pace
width Returns the width of text not including any margins.
height Returns the height of text not including any margins.
numlines Returns the number of lines of text.
36.63.3.9 void jtextlayout_set ( t_jtextlayout ∗ textlayout, const char ∗ utf8, t_jfont ∗ jfont, double x, double y, double
width, double height, t_jgraphics_text_justification justification, t_jgraphics_textlayout_flags flags )
36.63.3.10 void jtextlayout_settext ( t_jtextlayout ∗ textlayout, const char ∗ utf8, t_jfont ∗ jfont )
Parameters
g The graphics context for the textlayout.
bgcolor The background color for the textlayout.
Returns
Popup menu API so externals can create popup menus that can also be drawn into.
Collaboration diagram for Popup Menus:
Functions
• t_jpopupmenu ∗ jpopupmenu_create ()
Create a pop-up menu.
• void jpopupmenu_destroy (t_jpopupmenu ∗menu)
Free a pop-up menu created with jpopupmenu_create().
• void jpopupmenu_clear (t_jpopupmenu ∗menu)
Clear the conents of a pop-up menu.
• void jpopupmenu_setcolors (t_jpopupmenu ∗menu, t_jrgba text, t_jrgba bg, t_jrgba highlightedtext, t_jrgba
highlightedbg)
Set the colors used by a pop-up menu.
• void jpopupmenu_setfont (t_jpopupmenu ∗menu, t_jfont ∗font)
Set the font used by a pop-up menu.
• void jpopupmenu_additem (t_jpopupmenu ∗menu, int itemid, const char ∗utf8Text, t_jrgba ∗textColor, int
checked, int disabled, t_jsurface ∗icon)
Add an item to a pop-up menu.
• void jpopupmenu_addsubmenu (t_jpopupmenu ∗menu, const char ∗utf8Name, t_jpopupmenu ∗submenu, int
disabled)
Add a pop-menu to another pop-menu as a submenu.
• void jpopupmenu_addseperator (t_jpopupmenu ∗menu)
Add a separator to a pop-menu.
• int jpopupmenu_popup (t_jpopupmenu ∗menu, t_pt screen, int defitemid)
Tell a menu to display at a specified location.
• int jpopupmenu_popup_abovebox (t_jpopupmenu ∗menu, t_object ∗box, t_object ∗view, int offset, int de-
fitemid)
Tell a menu to display above a given box in a patcher.
• int jpopupmenu_popup_nearbox (t_jpopupmenu ∗menu, t_object ∗box, t_object ∗view, int defitemid)
Tell a menu to display near a given box in a patcher.
• int jpopupmenu_popup_belowrect (t_jpopupmenu ∗menu, t_rect rect, int defitemid)
Tell a menu to display below a given rectangle in a patcher.
• int jpopupmenu_popup_aboverect (t_jpopupmenu ∗menu, t_rect rect, int defitemid)
Tell a menu to display above a given rectangle in a patcher.
Popup menu API so externals can create popup menus that can also be drawn into.
36.64.2.1 void jpopupmenu_additem ( t_jpopupmenu ∗ menu, int itemid, const char ∗ utf8Text, t_jrgba ∗ textColor, int
checked, int disabled, t_jsurface ∗ icon )
36.64.2.3 void jpopupmenu_addsubmenu ( t_jpopupmenu ∗ menu, const char ∗ utf8Name, t_jpopupmenu ∗ submenu,
int disabled )
Returns
Parameters
menu The pop-up menu to be freed.
Returns
The item id for the item in the menu choosen by the user.
36.64.2.8 int jpopupmenu_popup_abovebox ( t_jpopupmenu ∗ menu, t_object ∗ box, t_object ∗ view, int offset, int
defitemid )
Returns
The item id for the item in the menu choosen by the user.
Returns
The item id for the item in the menu choosen by the user.
Parameters
menu The pop-up menu to display.
rect The rectangle below which to display the menu.
defitemid The initially choosen item id.
Returns
The item id for the item in the menu choosen by the user.
36.64.2.11 int jpopupmenu_popup_nearbox ( t_jpopupmenu ∗ menu, t_object ∗ box, t_object ∗ view, int defitemid )
Returns
The item id for the item in the menu choosen by the user.
36.64.2.12 void jpopupmenu_setcolors ( t_jpopupmenu ∗ menu, t_jrgba text, t_jrgba bg, t_jrgba highlightedtext,
t_jrgba highlightedbg )
The boxlayer functions provide way to make it easier to use cached offscreen images (layers) in your drawing.
Collaboration diagram for Box Layer:
Functions
The boxlayer functions provide way to make it easier to use cached offscreen images (layers) in your drawing.
The general idea is to do something like this:
t_jgraphics *g;
g = jbox_start_layer(box, view, layername, width, height);
if (g) {
// draw to your new offscreen context here
// the second time you call jbox_start_layer() it will return NULL
// since you already drew it -- you don’t have to do drawing the second time
jbox_end_layer(box, view, layername);
}
jbox_paint_layer(box, view, layername, xpos, ypos);
Then, if something changes where you would need to redraw the layer you invalidate it:
or
Each view has its own layer stored since if a patcher has multiple views each could be at a different zoom level.
Parameters
b The object/box for the layer opened by jbox_start_layer().
view The patcherview for the object opened by jbox_start_layer().
name The name of the layer.
Returns
Returns
36.65.2.3 t_max_err jbox_paint_layer ( t_object ∗ b, t_object ∗ view, t_symbol ∗ name, double x, double y )
Returns
36.65.2.4 t_jgraphics∗ jbox_start_layer ( t_object ∗ b, t_object ∗ view, t_symbol ∗ name, double width, double height
)
Returns
36.66 DataView
Data Structures
• struct t_celldesc
A dataview cell description.
• struct t_jcolumn
A dataview column.
• struct t_jdataview
The dataview object.
• struct t_privatesortrec
used to pass data to a client sort function
Functions
Parameters
dv The dataview instance.
Returns
Create a dataview.
You should free it with object_free().
Returns
36.67 Unicode
Data Structures
• struct t_charset_converter
The charset_converter object.
Functions
• t_max_err charset_convert (t_symbol ∗src_encoding, const char ∗in, long inbytes, t_symbol ∗dest_encoding,
char ∗∗out, long ∗outbytes)
A convenience function that simplifies usage by wrapping the other charset functions.
• unsigned short ∗ charset_utf8tounicode (char ∗s, long ∗outlen)
Convert a UTF8 C-String into a 16-bit-wide-character array.
• char ∗ charset_unicodetoutf8 (unsigned short ∗s, long len, long ∗outlen)
Convert a 16-bit-wide-character array into a UTF C-string.
• long charset_utf8_count (char ∗utf8, long ∗bytecount)
Returns utf8 character count, and optionally bytecount.
• char ∗ charset_utf8_offset (char ∗utf8, long charoffset, long ∗byteoffset)
Returns utf8 character offset (positive or negative), and optionally byte offset.
• _sym_charset_converter;
• _sym_convert;
if (conv) {
// note that it isn’t necessary to send in a 0-terminated string, although we do so here
if (object_method(conv, gensym("convert"), cstr, strlen(cstr) + 1, &cvtbuffer, &
cvtbuflen) == ERR_NONE) {
// do something with the converted buffer
sysmem_freeptr(cvtbuffer); // free newly allocated data buffer
}
object_free(conv); // free converter
}
36.67.3.1 t_max_err charset_convert ( t_symbol ∗ src_encoding, const char ∗ in, long inbytes, t_symbol ∗
dest_encoding, char ∗∗ out, long ∗ outbytes )
A convenience function that simplifies usage by wrapping the other charset functions.
Parameters
src_encoding The name encoding of the input.
in The input string.
inbytes The number of bytes in the input string.
dest_encoding The name of the encoding to use for the output.
out The address of a char∗, which will be allocated and filled with the string in the new encoding.
outbytes The address of a value that will hold the number of bytes long the output is upon return.
Returns
Remarks
Returns
A UTF8-encoded C-string.
Parameters
utf8 The UTF-8 encoded string whose characters are to be counted.
bytecount The address of a variable to hold the byte count on return. Pass NULL if you don't require the
byte count.
Returns
Returns utf8 character offset (positive or negative), and optionally byte offset.
Parameters
utf8 A UTF-8 encoded string.
charoffset The char offset into the string at which to find the byte offset.
byteoffset The address of a variable to hold the byte offset on return. Pass NULL if you don't require the
byte offset.
Returns
Returns
Functions
Retrieves atom argument at index as double precision floating point number if present.
This function is useful for setting the values only if there is an argument at the specified index, otherwise, the input
value is untouched.
Parameters
c pointer to double (should contain desired default)
idx atom argument index
ac atom argument count
av atom argument vector
Returns
References atom_arg_getdouble().
Here is the call graph for this function:
jit_atom_arg_getdouble atom_arg_getdouble
Returns
References atom_arg_getfloat().
Here is the call graph for this function:
jit_atom_arg_getfloat atom_arg_getfloat
Returns
References atom_arg_getlong().
Referenced by max_jit_mop_matrix_args().
Here is the call graph for this function:
jit_atom_arg_getlong atom_arg_getlong
Returns
References atom_arg_getsym().
Referenced by max_jit_mop_matrix_args().
Here is the call graph for this function:
jit_atom_arg_getsym atom_arg_getsym
Returns
8 bit fixed point value in the range 0-255. 0 if atom has no numeric value.
References atom_getcharfix().
Referenced by jit_matrix_fillplane(), jit_matrix_setall(), and jit_matrix_setcell().
Here is the call graph for this function:
jit_atom_getcharfix atom_getcharfix
a atom pointer
Returns
References atom_getfloat().
Referenced by jit_matrix_fillplane(), jit_matrix_setall(), and jit_matrix_setcell().
Here is the call graph for this function:
jit_atom_getfloat atom_getfloat
Returns
Returns
References atom_getobj().
Referenced by jit_matrix_setcell().
jit_atom_getobj atom_getobj
Returns
Returns
References atom_setfloat().
Referenced by jit_matrix_getcell().
Here is the call graph for this function:
jit_atom_setfloat atom_setfloat
Parameters
a atom pointer
b integer value
Returns
Returns
References atom_setobj().
Referenced by jit_gl_begincapture(), jit_matrix_getcell(), and jit_matrix_jit_gl_texture().
Here is the call graph for this function:
jit_atom_setobj atom_setobj
Returns
References atom_setsym().
Referenced by jit_matrix_getcell(), jit_matrix_setcell1d(), jit_matrix_setcell2d(), jit_matrix_setcell3d(), jit_matrix_←-
setplane1d(), jit_matrix_setplane2d(), jit_matrix_setplane3d(), jit_mop_single_type(), jit_ob3d_new(), jit_object_←-
exportattrs(), and max_jit_mop_outputmatrix().
jit_atom_setsym atom_setsym
Data Structures
• struct t_jit_attribute
t_jit_attribute object struct.
• struct t_jit_attr_offset
t_jit_attr_offset object struct.
• struct t_jit_attr_offset_array
t_jit_attr_offset_array object struct.
• struct t_jit_attr_filter_clip
t_jit_attr_filter_clip object struct.
• struct t_jit_attr_filter_proc
t_jit_attr_filter_proc object struct.
• struct t_jit_attr
Common attribute struct.
Functions
• t_jit_err jit_attr_set (t_jit_attr ∗x, void ∗parent, long ac, t_atom ∗av)
Calls attribute setter to set in parent object.
• t_jit_object ∗ jit_attribute_new (char ∗name, t_symbol ∗type, long flags, method mget, method mset)
Constructs instance of t_jit_attribute.
• t_jit_object ∗ jit_attr_offset_new (char ∗name, t_symbol ∗type, long flags, method mget, method mset, long
offset)
Constructs instance of t_jit_attr_offset.
• t_jit_object ∗ jit_attr_offset_array_new (char ∗name, t_symbol ∗type, long size, long flags, method mget,
method mset, long offsetcount, long offset)
Constructs instance of t_jit_attr_offset_array.
• t_jit_object ∗ jit_attr_filter_clip_new (void)
Constructs instance of t_jit_attr_filter_clip.
• t_jit_object ∗ jit_attr_filter_proc_new (method proc)
Constructs instance of t_jit_attr_filter_proc.
• t_atom_long jit_attr_getlong (void ∗x, t_symbol ∗s)
Retrieves attribute value as a long integer value.
• t_jit_err jit_attr_setlong (void ∗x, t_symbol ∗s, t_atom_long c)
Sets attribute value as a long integer value.
• t_atom_float jit_attr_getfloat (void ∗x, t_symbol ∗s)
Retrieves attribute value as a floating point value.
• t_jit_err jit_attr_setfloat (void ∗x, t_symbol ∗s, t_atom_float c)
Sets attribute value as a floating point value.
• t_symbol ∗ jit_attr_getsym (void ∗x, t_symbol ∗s)
Retrieves attribute value as a symbol value.
• t_jit_err jit_attr_setsym (void ∗x, t_symbol ∗s, t_symbol ∗c)
Sets attribute value as a symbol value.
• long jit_attr_getlong_array (void ∗x, t_symbol ∗s, long max, t_atom_long ∗vals)
Retrieves attribute value as an array of long integer values.
• t_jit_err jit_attr_setlong_array (void ∗x, t_symbol ∗s, long count, t_atom_long ∗vals)
Sets attribute value as an array of long integer values.
• long jit_attr_getchar_array (void ∗x, t_symbol ∗s, long max, uchar ∗vals)
Retrieves attribute value as an array of char values.
• t_jit_err jit_attr_setchar_array (void ∗x, t_symbol ∗s, long count, uchar ∗vals)
Sets attribute value as an array of char values.
• long jit_attr_getfloat_array (void ∗x, t_symbol ∗s, long max, float ∗vals)
Retrieves attribute value as an array of floating point values.
• t_jit_err jit_attr_setfloat_array (void ∗x, t_symbol ∗s, long count, float ∗vals)
Sets attribute value as an array of floating point values.
• long jit_attr_getdouble_array (void ∗x, t_symbol ∗s, long max, double ∗vals)
Retrieves attribute value as an array of double precision floating point values.
• t_jit_err jit_attr_setdouble_array (void ∗x, t_symbol ∗s, long count, double ∗vals)
Sets attribute value as an array of double precision floating point values.
• long jit_attr_getsym_array (void ∗x, t_symbol ∗s, long max, t_symbol ∗∗vals)
Retrieves attribute value as an array of symbol values.
• t_jit_err jit_attr_setsym_array (void ∗x, t_symbol ∗s, long count, t_symbol ∗∗vals)
Sets attribute value as an array of symbol values.
• long jit_attr_symcompare (void ∗x, t_symbol ∗name)
Compares symbol name with name provided.
Parameters
x attribute object pointer
Returns
gettable flag
Warning
This function is not exported, but is provided for reference when calling via jit_object_method on an intance of
any attribute obejct.
Returns
settable flag
Warning
This function is not exported, but is provided for reference when calling via jit_object_method on an intance of
any attribute obejct.
Returns
Warning
This function is not exported, but is provided for reference when calling via jit_object_new.
Parameters
proc filter procedure
Returns
Warning
This function is not exported, but is provided for reference when calling via jit_object_new.
References t_jit_attr_filter_proc::proc.
Returns
Warning
This function is not exported, but is provided for reference when calling via jit_object_method on an intance of
any attribute obejct.
Returns
Warning
This function is not exported, but is provided for reference when calling via jit_object_method on an intance of
any attribute obejct.
Returns
Warning
This function is not exported, but is provided for reference when calling via jit_object_method on an intance of
any attribute obejct.
Returns
object_attr_get
jit_attr_getchar_array
object_attr_getchar
_array
Returns
object_attr_get
jit_attr_getdouble
_array
object_attr_getdouble
_array
Parameters
x object pointer
s attribute name
Returns
object_attr_get
jit_attr_getfloat
object_attr_getfloat
Returns
object_attr_get
jit_attr_getfloat_array
object_attr_getfloat
_array
Parameters
x object pointer
s attribute name
Returns
object_attr_get
jit_attr_getlong
object_attr_getlong
Returns
object_attr_get
jit_attr_getlong_array
object_attr_getlong
_array
Returns
Warning
This function is not exported, but is provided for reference when calling via jit_object_method on an intance of
any attribute obejct.
Returns
attribute name
Warning
This function is not exported, but is provided for reference when calling via jit_object_method on an intance of
any attribute obejct.
Returns
symbol value
object_attr_get
jit_attr_getsym
object_attr_getsym
Returns
object_attr_get
jit_attr_getsym_array
object_attr_getsym
_array
Returns
attribute type
Warning
This function is not exported, but is provided for reference when calling via jit_object_method on an intance of
any attribute obejct.
36.69.2.19 t_jit_object ∗ jit_attr_offset_array_new ( char ∗ name, t_symbol ∗ type, long size, long flags, method mget,
method mset, long offsetcount, long offset )
Returns
Warning
This function is not exported, but is provided for reference when calling via jit_object_new.
jit_attr_offset_array_new gensym
36.69.2.20 t_jit_object ∗ jit_attr_offset_new ( char ∗ name, t_symbol ∗ type, long flags, method mget, method mset,
long offset )
Returns
Warning
This function is not exported, but is provided for reference when calling via jit_object_new.
jit_attr_offset_new gensym
Returns
Warning
This function is not exported, but is provided for reference when calling via jit_object_method on an intance of
any attribute obejct.
Returns
jit_err_from_max_err
jit_attr_setchar_array object_attr_get
object_attr_setchar
_array
Returns
jit_err_from_max_err
jit_attr_setdouble object_attr_get
_array
object_attr_setdouble
_array
Returns
jit_err_from_max_err
jit_attr_setfloat object_attr_get
object_attr_setfloat
Returns
jit_err_from_max_err
jit_attr_setfloat_array object_attr_get
object_attr_setfloat
_array
Returns
Returns
jit_err_from_max_err
jit_attr_setlong_array object_attr_get
object_attr_setlong
_array
Returns
jit_err_from_max_err
jit_attr_setsym object_attr_get
object_attr_setsym
Returns
jit_err_from_max_err
jit_attr_setsym_array object_attr_get
object_attr_setsym
_array
Parameters
x attribute object pointer
name attribute name
Returns
jit_attr_symcompare object_method
Returns
Warning
This function is not exported, but is provided for reference when calling via jit_object_method on an intance of
any attribute obejct.
Returns
Warning
This function is not exported, but is provided for reference when calling via jit_object_method on an intance of
any attribute obejct.
36.69.2.33 t_jit_object ∗ jit_attribute_new ( char ∗ name, t_symbol ∗ type, long flags, method mget, method mset )
Returns
Warning
This function is not exported, but is provided for reference when calling via jit_object_new.
jit_attribute_new gensym
Functions
Returns
sysfile_read
jit_bin_read_chunk_info
sysfile_setpos
Returns
sysfile_read
jit_bin_read_header
sysfile_setpos
Parameters
fh t_filehandle file handle
matrix the matrix data
Returns
gensym
jit_bin_read_matrix
sysfile_read
Returns
sysfile_setpos
jit_bin_write_header
sysfile_write
Parameters
fh t_filehandle file handle
matrix the matrix data
Returns
gensym
jit_bin_write_matrix
sysfile_write
Functions
Duplicates a previously registered object class, and registers a copy of this class.
Parameters
src_name_←- The source class's name space.
space
src_classname The source class's class name.
dst_name_←- The copied class's name space.
space
dst_classname The copied class's class name.
Returns
This function returns the error code MAX_ERR_NONE if successful, or one of the other error codes defined in
"ext_obex.h" if unsuccessful.
Returns
References jit_err_from_max_err().
Here is the call graph for this function:
jit_class_addadornment jit_err_from_max_err
Parameters
c class pointer
attr attribute object
Returns
class_addattr
jit_class_addattr
jit_err_from_max_err
36.71.2.4 t_jit_err jit_class_addinterface ( void ∗ c, void ∗ interfaceclass, long byteoffset, long flags )
Returns
gensym
hashtab_funall
jit_class_addinterface
hashtab_new
hashtab_store
Returns
class_addmethod
jit_class_addmethod
jit_err_from_max_err
Returns
References jit_err_from_max_err().
Here is the call graph for this function:
jit_class_addtypedwrapper jit_err_from_max_err
Adornments provide additional state and behavior to a class. This is most commonly used for the jit_mop adorn-
ment.
Parameters
c class pointer
classname classname of adornment to retrieve
Returns
Returns
Returns
class pointer
References class_findbyname().
Here is the call graph for this function:
jit_class_findbyname class_findbyname
Frees a class.
Warning
Parameters
c class pointer
Returns
class_free
jit_class_free
jit_err_from_max_err
Returns
t_messlist pointer.
Returns
Warning
It is important that no argument settable method causes any output into the patcher, or else it could lead to a
crash, or other undesired behavior.
Parameters
c class pointer
argname name as used via argument
methodname name of method to map the argument name to
Returns
gensym
jit_class_method_addargsafe
jit_err_from_max_err
Returns
If successful, name of method to map the argument name to. Otherwise, NULL.
jit_class_method_argsafe_get gensym
Returns
References class_nameget().
Referenced by jit_class_symcompare().
Here is the call graph for this function:
jit_class_nameget class_nameget
36.71.2.16 void∗ jit_class_new ( C74_CONST char ∗ name, method mnew, method mfree, long size, ... )
Creates a new class with the name specified by the name argument.
Parameters
Warning
In order for the Jitter class to be exposed to JavaScript and Java, it is important that the constructor is typed,
even if no arguments are provided–i.e. do not use the older strategy of defining Jitter constructors as private
and untyped with A_CANT.
Returns
jit_linklist_chuck linklist_chuck
jit_linklist_getsize linklist_getsize
class_addmethod
jit_linklist_getindex linklist_getindex
class_new
jit_class_new object_attr_setvalueof
jit_object_importattrs
freebytes
object_free
jit_object_free
jit_err_from_max_err
gensym
jit_object_exportattrs
object_attr_get
jit_object_classname object_classname
jit_atom_setsym atom_setsym
symbolarray_sort
c class pointer
Returns
class_register
jit_class_register
jit_err_from_max_err
Returns
References jit_class_nameget().
Here is the call graph for this function:
Parameters
c class pointer
s name
Returns
t_messlist pointer
Functions
Returns
References object_attach().
Referenced by max_jit_mop_inputs(), max_jit_mop_notify(), max_jit_mop_outputs(), and max_jit_ob3d_attach().
Here is the call graph for this function:
jit_object_attach object_attach
Returns
References object_attr_get().
Here is the call graph for this function:
jit_object_attr_get object_attr_get
Returns
References object_attr_usercanget().
Here is the call graph for this function:
jit_object_attr_usercanget object_attr_usercanget
Returns
References object_attr_usercanset().
Referenced by max_jit_attr_args().
Here is the call graph for this function:
jit_object_attr_usercanset object_attr_usercanset
Returns
class pointer
References object_class().
Referenced by jit_object_method_argsafe_get(), and max_jit_mop_setup().
Here is the call graph for this function:
jit_object_class object_class
Returns
References object_classname().
Referenced by jit_gl_begincapture(), jit_ob3d_free(), jit_ob3d_new(), jit_object_classname_compare(), and jit_←-
object_exportattrs().
Here is the call graph for this function:
jit_object_classname object_classname
Returns
References jit_object_classname().
Referenced by max_jit_obex_adornment_get().
Here is the call graph for this function:
Returns
jit_err_from_max_err
jit_object_detach
object_detach
Returns
freebytes
gensym
jit_atom_setsym atom_setsym
jit_object_free object_free
object_attr_get jit_err_from_max_err
symbolarray_sort
Warning
Currently this function does nothing, but is reserved for future use.
Parameters
x object pointer
s ignored
argc argument count
argv argument vector
Returns
Referenced by max_jit_classex_standard_wrap().
Returns
Returns
References object_findregisteredbyptr().
Here is the call graph for this function:
jit_object_findregisteredbyptr object_findregisteredbyptr
Frees an object.
Parameters
x object pointer
Returns
jit_err_from_max_err
jit_object_free
object_free
Parameters
x object pointer
s method name
Returns
method
References object_getmethod().
Referenced by jit_attr_filterget(), jit_attr_filterset(), and jit_ob3d_new().
Here is the call graph for this function:
jit_object_getmethod object_getmethod
Returns
freebytes
gensym
jit_linklist_chuck linklist_chuck
jit_linklist_getsize linklist_getsize
jit_object_free jit_err_from_max_err
object_attr_setvalueof object_free
Returns
If successful, name of method to map the argument name to. Otherwise, NULL.
jit_class_method_argsafe_get gensym
jit_object_method_argsafe_get
jit_object_class object_class
36.72.2.17 void∗ jit_object_method_imp ( void ∗ x, void ∗ s, void ∗ p1, void ∗ p2, void ∗ p3, void ∗ p4, void ∗ p5, void ∗ p6,
void ∗ p7, void ∗ p8 )
Warning
It is important to know any necessary arguments for untyped constructors such as those used by jit_matrix or
jit_attr_offset.
Returns
36.72.2.18 void∗ jit_object_method_typed ( void ∗ x, t_symbol ∗ s, long ac, t_atom ∗ av, t_atom ∗ rv )
Returns
References object_method_typed().
Here is the call graph for this function:
jit_object_method_typed object_method_typed
36.72.2.19 void∗ jit_object_new_imp ( void ∗ cn, void ∗ p1, void ∗ p2, void ∗ p3, void ∗ p4, void ∗ p5, void ∗ p6, void ∗ p7,
void ∗ p8, void ∗ dummy )
Warning
It is important to know any necessary arguments for untyped constructors such as those used by jit_matrix or
jit_attr_offset.
Returns
Returns
References object_notify().
Referenced by jit_matrix_setinfo(), jit_matrix_setinfo_ex(), and jit_ob3d_draw_chunk().
Here is the call graph for this function:
jit_object_notify object_notify
Returns
object pointer
Warning
It is important to use the object pointer returned by jit_object_register, since if there is an existing object with
the same name and class, it could free the input object and pass back a reference to the previously defined
object.
References object_register().
Referenced by max_jit_mop_inputs(), max_jit_mop_notify(), and max_jit_mop_outputs().
Here is the call graph for this function:
jit_object_register object_register
Parameters
x object pointer
Returns
jit_err_from_max_err
jit_object_unregister
object_unregister
Miscellaneous Utility
Jitter
Module
Functions
Returns
Sends error code based error message to Max console (safe from all threads)
Parameters
x object pointer
v error code
References defer().
Referenced by max_jit_attr_getdump(), and max_jit_mop_jit_matrix().
Here is the call graph for this function:
jit_error_code defer
Sends symbol based error message to Max console (safe from all threads)
Parameters
x object pointer
s error message symbol
References defer().
Here is the call graph for this function:
jit_error_sym defer
jit_global_critical critical_enter
_enter
jit_global_critical_exit critical_exit
Sends symbol based message to Max console (safe from all threads)
Parameters
x object pointer
s message symbol
References defer().
Here is the call graph for this function:
jit_post_sym defer
Returns
random value
References systime_ticks().
Here is the call graph for this function:
jit_rand_setseed systime_ticks
f input float
Returns
Returns
Functions
Returns
Warning
While exported, it is recommend to use jit_object_method to call methods on an object when the object may
not be an instance of t_jit_linklist, but instead an object that supports some portion of the t_jit_linklist interface.
One instance where this is the case is inside of a MOP matrix_calc method, where the arguments can be
either an instance of t_jit_linklist, or t_jit_matrix which has a getindex method.
References linklist_append().
Referenced by jit_matrix_op(), max_jit_classex_addattr(), and max_jit_obex_proxy_new().
Here is the call graph for this function:
jit_linklist_append linklist_append
Removes all objects from the linked list, without freeing any objects in list.
To remove all objects from the linked list, freeing the objects, use the jit_linklist_clear method.
Parameters
x t_jit_linklist object pointer
Warning
While exported, it is recommend to use jit_object_method to call methods on an object when the object may
not be an instance of t_jit_linklist, but instead an object that supports some portion of the t_jit_linklist interface.
One instance where this is the case is inside of a MOP matrix_calc method, where the arguments can be
either an instance of t_jit_linklist, or t_jit_matrix which has a getindex method.
References linklist_chuck().
Referenced by jit_matrix_op(), and jit_object_importattrs().
Here is the call graph for this function:
jit_linklist_chuck linklist_chuck
Returns
Warning
While exported, it is recommend to use jit_object_method to call methods on an object when the object may
not be an instance of t_jit_linklist, but instead an object that supports some portion of the t_jit_linklist interface.
One instance where this is the case is inside of a MOP matrix_calc method, where the arguments can be
either an instance of t_jit_linklist, or t_jit_matrix which has a getindex method.
References linklist_chuckindex().
Here is the call graph for this function:
jit_linklist_chuckindex linklist_chuckindex
Warning
While exported, it is recommend to use jit_object_method to call methods on an object when the object may
not be an instance of t_jit_linklist, but instead an object that supports some portion of the t_jit_linklist interface.
One instance where this is the case is inside of a MOP matrix_calc method, where the arguments can be
either an instance of t_jit_linklist, or t_jit_matrix which has a getindex method.
References linklist_clear().
Here is the call graph for this function:
jit_linklist_clear linklist_clear
Parameters
x t_jit_linklist object pointer
index index to delete (zero based)
Returns
Warning
While exported, it is recommend to use jit_object_method to call methods on an object when the object may
not be an instance of t_jit_linklist, but instead an object that supports some portion of the t_jit_linklist interface.
One instance where this is the case is inside of a MOP matrix_calc method, where the arguments can be
either an instance of t_jit_linklist, or t_jit_matrix which has a getindex method.
References linklist_deleteindex().
Here is the call graph for this function:
jit_linklist_deleteindex linklist_deleteindex
36.74.2.6 void jit_linklist_findall ( t_jit_linklist ∗ x, t_jit_linklist ∗∗ out, long cmpfnvoid ∗, void ∗, void ∗ cmpdata )
Retrieves a linked list of all objects that satisfy the comparison function.
Parameters
x t_jit_linklist object pointer
out pointer to linked list containing all objects found found (set to NULL, if not found)
cmpfn comparison function pointer (should returns 1 if object matches data, otherwise 0)
cmpdata opaque data used in comparison function
Warning
While exported, it is recommend to use jit_object_method to call methods on an object when the object may
not be an instance of t_jit_linklist, but instead an object that supports some portion of the t_jit_linklist interface.
One instance where this is the case is inside of a MOP matrix_calc method, where the arguments can be
either an instance of t_jit_linklist, or t_jit_matrix which has a getindex method.
References linklist_findall().
Here is the call graph for this function:
jit_linklist_findall linklist_findall
Returns
Warning
While exported, it is recommend to use jit_object_method to call methods on an object when the object may
not be an instance of t_jit_linklist, but instead an object that supports some portion of the t_jit_linklist interface.
One instance where this is the case is inside of a MOP matrix_calc method, where the arguments can be
either an instance of t_jit_linklist, or t_jit_matrix which has a getindex method.
linklist_chuck
jit_linklist_findcount linklist_findall
linklist_getsize
36.74.2.8 void jit_linklist_findfirst ( t_jit_linklist ∗ x, void ∗∗ o, long cmpfnvoid ∗, void ∗, void ∗ cmpdata )
Warning
While exported, it is recommend to use jit_object_method to call methods on an object when the object may
not be an instance of t_jit_linklist, but instead an object that supports some portion of the t_jit_linklist interface.
One instance where this is the case is inside of a MOP matrix_calc method, where the arguments can be
either an instance of t_jit_linklist, or t_jit_matrix which has a getindex method.
References linklist_findfirst().
Referenced by max_jit_obex_attr_get(), and max_jit_obex_attr_set().
Here is the call graph for this function:
jit_linklist_findfirst linklist_findfirst
Returns
object pointer
Warning
While exported, it is recommend to use jit_object_method to call methods on an object when the object may
not be an instance of t_jit_linklist, but instead an object that supports some portion of the t_jit_linklist interface.
One instance where this is the case is inside of a MOP matrix_calc method, where the arguments can be
either an instance of t_jit_linklist, or t_jit_matrix which has a getindex method.
References linklist_getindex().
Referenced by jit_object_importattrs().
Here is the call graph for this function:
jit_linklist_getindex linklist_getindex
Returns
Warning
While exported, it is recommend to use jit_object_method to call methods on an object when the object may
not be an instance of t_jit_linklist, but instead an object that supports some portion of the t_jit_linklist interface.
One instance where this is the case is inside of a MOP matrix_calc method, where the arguments can be
either an instance of t_jit_linklist, or t_jit_matrix which has a getindex method.
References linklist_getsize().
Referenced by jit_object_importattrs().
jit_linklist_getsize linklist_getsize
Returns
Warning
While exported, it is recommend to use jit_object_method to call methods on an object when the object may
not be an instance of t_jit_linklist, but instead an object that supports some portion of the t_jit_linklist interface.
One instance where this is the case is inside of a MOP matrix_calc method, where the arguments can be
either an instance of t_jit_linklist, or t_jit_matrix which has a getindex method.
References linklist_insertindex().
Here is the call graph for this function:
jit_linklist_insertindex linklist_insertindex
Parameters
x t_jit_linklist object pointer
a array pointer
max maximum array size
Returns
Warning
While exported, it is recommend to use jit_object_method to call methods on an object when the object may
not be an instance of t_jit_linklist, but instead an object that supports some portion of the t_jit_linklist interface.
One instance where this is the case is inside of a MOP matrix_calc method, where the arguments can be
either an instance of t_jit_linklist, or t_jit_matrix which has a getindex method.
References linklist_makearray().
Here is the call graph for this function:
jit_linklist_makearray linklist_makearray
Warning
While exported, it is recommend to use jit_object_method to call methods on an object when the object may
not be an instance of t_jit_linklist, but instead an object that supports some portion of the t_jit_linklist interface.
One instance where this is the case is inside of a MOP matrix_calc method, where the arguments can be
either an instance of t_jit_linklist, or t_jit_matrix which has a getindex method.
References linklist_methodall().
Here is the call graph for this function:
jit_linklist_methodall linklist_methodall
Returns
Warning
While exported, it is recommend to use jit_object_method to call methods on an object when the object may
not be an instance of t_jit_linklist, but instead an object that supports some portion of the t_jit_linklist interface.
One instance where this is the case is inside of a MOP matrix_calc method, where the arguments can be
either an instance of t_jit_linklist, or t_jit_matrix which has a getindex method.
References linklist_methodindex().
Here is the call graph for this function:
jit_linklist_methodindex linklist_methodindex
Returns
Warning
References linklist_new().
Referenced by jit_matrix_op(), max_jit_classex_addattr(), and max_jit_obex_proxy_new().
Here is the call graph for this function:
jit_linklist_new linklist_new
Returns
Warning
While exported, it is recommend to use jit_object_method to call methods on an object when the object may
not be an instance of t_jit_linklist, but instead an object that supports some portion of the t_jit_linklist interface.
One instance where this is the case is inside of a MOP matrix_calc method, where the arguments can be
either an instance of t_jit_linklist, or t_jit_matrix which has a getindex method.
References linklist_objptr2index().
Here is the call graph for this function:
jit_linklist_objptr2index linklist_objptr2index
Warning
While exported, it is recommend to use jit_object_method to call methods on an object when the object may
not be an instance of t_jit_linklist, but instead an object that supports some portion of the t_jit_linklist interface.
One instance where this is the case is inside of a MOP matrix_calc method, where the arguments can be
either an instance of t_jit_linklist, or t_jit_matrix which has a getindex method.
References linklist_reverse().
Here is the call graph for this function:
jit_linklist_reverse linklist_reverse
Rotates the order of objects in the linked list, by the specified number of indeces.
Parameters
x t_jit_linklist object pointer
i rotation index count
Warning
While exported, it is recommend to use jit_object_method to call methods on an object when the object may
not be an instance of t_jit_linklist, but instead an object that supports some portion of the t_jit_linklist interface.
One instance where this is the case is inside of a MOP matrix_calc method, where the arguments can be
either an instance of t_jit_linklist, or t_jit_matrix which has a getindex method.
References linklist_rotate().
Here is the call graph for this function:
jit_linklist_rotate linklist_rotate
Parameters
x t_jit_linklist object pointer
Warning
While exported, it is recommend to use jit_object_method to call methods on an object when the object may
not be an instance of t_jit_linklist, but instead an object that supports some portion of the t_jit_linklist interface.
One instance where this is the case is inside of a MOP matrix_calc method, where the arguments can be
either an instance of t_jit_linklist, or t_jit_matrix which has a getindex method.
References linklist_shuffle().
Here is the call graph for this function:
jit_linklist_shuffle linklist_shuffle
Warning
While exported, it is recommend to use jit_object_method to call methods on an object when the object may
not be an instance of t_jit_linklist, but instead an object that supports some portion of the t_jit_linklist interface.
One instance where this is the case is inside of a MOP matrix_calc method, where the arguments can be
either an instance of t_jit_linklist, or t_jit_matrix which has a getindex method.
References linklist_sort().
Here is the call graph for this function:
jit_linklist_sort linklist_sort
Parameters
x t_jit_linklist object pointer
a index a
b index b
Warning
While exported, it is recommend to use jit_object_method to call methods on an object when the object may
not be an instance of t_jit_linklist, but instead an object that supports some portion of the t_jit_linklist interface.
One instance where this is the case is inside of a MOP matrix_calc method, where the arguments can be
either an instance of t_jit_linklist, or t_jit_matrix which has a getindex method.
References linklist_swap().
Here is the call graph for this function:
jit_linklist_swap linklist_swap
Functions
Returns
output
Returns
output
Returns
output
Parameters
x input
Returns
output
Returns
output
Returns
output
Returns
output
Returns
output
Parameters
x input
Returns
output
Referenced by jit_math_j1().
Returns
output
Returns
output
Returns
output
x input
Returns
output
Returns
output
References jit_math_sqrt().
Here is the call graph for this function:
jit_math_fast_acos jit_math_sqrt
Returns
output
References jit_math_sqrt().
Here is the call graph for this function:
jit_math_fast_asin jit_math_sqrt
Returns
output
Returns
output
Returns
output
Returns
output
Returns
output
Returns
output
Returns
output
Parameters
x input
y input
Returns
output
Returns
output
Returns
output
Returns
1 if finite. Otherwise, 0.
Referenced by jit_math_is_valid().
Parameters
v input
Returns
Referenced by jit_math_is_valid().
Returns
1 if finite. Otherwise, 0.
Returns
1 if vaild. Otherwise, 0.
jit_math_is_finite
jit_math_is_valid
jit_math_is_nan
Parameters
x input
Returns
output
jit_math_cos
jit_math_j1_0
jit_math_j1 jit_math_p1
jit_math_q1
jit_math_sin
Returns
output
Referenced by jit_math_j1().
Parameters
x input
Returns
output
Returns
output
Returns
output
Returns
output
Referenced by jit_math_j1().
Returns
output
Parameters
x input
Returns
output
Referenced by jit_math_j1().
Returns
output
Returns
output
Returns
output
Referenced by jit_math_j1().
Parameters
x input
Returns
output
Returns
output
Returns
output
Returns
output
x input
Returns
output
Returns
output
Functions
Returns
Warning
References linklist_clear().
Here is the call graph for this function:
jit_linklist_free linklist_clear
Parameters
x t_jit_matrix object pointer
Returns
Warning
This function is not exported, but is provided for reference when calling via jit_object_method on an intance of
t_jit_matrix.
Returns
Warning
This function is not exported, but is provided for reference when calling via jit_object_method on an intance of
t_jit_matrix.
Returns
Warning
This function is not exported, but is provided for reference when calling via jit_object_method on an intance of
t_jit_matrix.
jit_atom_getlong
jit_atom_getsym
jit_attr_setsym object_attr_get
jit_matrix_exprfill jit_err_from_max_err
jit_matrix_getinfo object_attr_setsym
jit_matrix_new jit_matrix_info_default
jit_object_free object_free
Returns
Warning
This function is not exported, but is provided for reference when calling via jit_object_method on an intance of
t_jit_matrix.
jit_atom_getcharfix atom_getcharfix
jit_atom_getlong
Parameters
x t_jit_matrix object pointer
Returns
Warning
jit_handle_free sysmem_freehandle
jit_matrix_free
jit_matrix_freedata jit_freebytes sysmem_freeptr
Frees matrix's internal data pointer if an internal reference and sets to NULL.
Parameters
x t_jit_matrix object pointer
Returns
Warning
This function is not exported, but is provided for reference when calling via jit_object_method on an intance of
t_jit_matrix.
Parameters
dst_matrix destination t_jit_matrix object pointer
src_matrix destination t_jit_matrix object pointer
mcinfo conversion information pointer
Returns
Warning
This function is not exported, but is provided for reference when calling via jit_object_method on an intance of
t_jit_matrix.
36.76.2.9 t_jit_err jit_matrix_getcell ( t_jit_matrix ∗ x, t_symbol ∗ s, long argc, t_atom ∗ argv, long ∗ rac, t_atom ∗∗ rav )
Returns
Warning
This function is not exported, but is provided for reference when calling via jit_object_method on an intance of
t_jit_matrix.
jit_atom_getlong
jit_atom_setfloat atom_setfloat
jit_atom_setlong
jit_matrix_getcell
jit_atom_setobj atom_setobj
jit_atom_setsym atom_setsym
jit_getbytes sysmem_newptr
Returns
Warning
This function is not exported, but is provided for reference when calling via jit_object_method on an intance of
t_jit_matrix.
Parameters
x t_jit_matrix object pointer
info t_jit_matrix_info pointer
Returns
Warning
This function is not exported, but is provided for reference when calling via jit_object_method on an intance of
t_jit_matrix.
Returns
Warning
This function is not exported, but is provided for reference when calling via jit_object_method on an intance of
t_jit_matrix.
Returns
Warning
This function is not exported, but is provided for reference when calling via jit_object_method on an intance of
t_jit_matrix.
jit_atom_getsym
jit_object_findregistered
Returns
Warning
This function is not exported, but is provided for reference when calling via jit_object_new.
jit_matrix_info_default
jit_matrix_new jit_err_from_max_err
jit_object_free
object_free
Parameters
copyme t_jit_matrix object pointer
Returns
Warning
This function is not exported, but is provided for reference when calling via jit_object_method on an intance of
t_jit_matrix.
jit_err_from_max_err
jit_matrix_newcopy jit_object_free
object_free
Applies unary or binary operator to matrix See Jitter user documentation for more information.
Parameters
x t_jit_matrix object pointer
s message symbol pointer
argc argument count
argv argument vector
Returns
Warning
This function is not exported, but is provided for reference when calling via jit_object_method on an intance of
t_jit_matrix.
jit_atom_getsym object_attr_get
jit_attr_setsym object_attr_setsym
jit_linklist_chuck linklist_chuck
jit_linklist_new linklist_new
jit_matrix_op
jit_matrix_getinfo jit_matrix_info_default
jit_atom_getcharfix atom_getcharfix
jit_matrix_setall jit_atom_getlong
Returns
Warning
This function is not exported, but is provided for reference when calling via jit_object_method on an intance of
t_jit_matrix.
jit_atom_getcharfix atom_getcharfix
jit_atom_getlong
Returns
Warning
This function is not exported, but is provided for reference when calling via jit_object_method on an intance of
t_jit_matrix.
jit_atom_getcharfix atom_getcharfix
jit_atom_getfloat atom_getfloat
jit_matrix_setcell jit_atom_getlong
jit_atom_getobj atom_getobj
jit_atom_getsym
Returns
Warning
This function is not exported, but is provided for reference when calling via jit_object_method on an intance of
t_jit_matrix.
jit_atom_setsym atom_setsym
jit_atom_setlong
jit_matrix_setcell1d
jit_atom_getlong
jit_atom_getobj atom_getobj
jit_matrix_setcell
jit_atom_getsym
jit_atom_getcharfix atom_getcharfix
jit_atom_getfloat atom_getfloat
Returns
Warning
This function is not exported, but is provided for reference when calling via jit_object_method on an intance of
t_jit_matrix.
jit_atom_setsym atom_setsym
jit_atom_setlong
jit_matrix_setcell2d
jit_atom_getlong
jit_atom_getobj atom_getobj
jit_matrix_setcell
jit_atom_getsym
jit_atom_getcharfix atom_getcharfix
jit_atom_getfloat atom_getfloat
Returns
Warning
This function is not exported, but is provided for reference when calling via jit_object_method on an intance of
t_jit_matrix.
jit_atom_setsym atom_setsym
jit_atom_setlong
jit_matrix_setcell3d
jit_atom_getlong
jit_atom_getobj atom_getobj
jit_matrix_setcell
jit_atom_getsym
jit_atom_getcharfix atom_getcharfix
jit_atom_getfloat atom_getfloat
Returns
Warning
This function is not exported, but is provided for reference when calling via jit_object_method on an intance of
t_jit_matrix.
Sets all attributes according to the t_jit_matrix_info struct provided (including data flags).
Parameters
x t_jit_matrix object pointer
info t_jit_matrix_info pointer
Returns
Warning
This function is not exported, but is provided for reference when calling via jit_object_method on an intance of
t_jit_matrix.
jit_matrix_setinfo
jit_matrix_setinfo_ex jit_object_notify object_notify
Returns
Warning
This function is not exported, but is provided for reference when calling via jit_object_method on an intance of
t_jit_matrix.
jit_atom_setsym atom_setsym
jit_atom_setlong
jit_matrix_setplane1d
jit_atom_getlong
jit_atom_getobj atom_getobj
jit_matrix_setcell
jit_atom_getsym
jit_atom_getcharfix atom_getcharfix
jit_atom_getfloat atom_getfloat
Returns
Warning
This function is not exported, but is provided for reference when calling via jit_object_method on an intance of
t_jit_matrix.
jit_atom_setsym atom_setsym
jit_atom_setlong
jit_matrix_setplane2d
jit_atom_getlong
jit_atom_getobj atom_getobj
jit_matrix_setcell
jit_atom_getsym
jit_atom_getcharfix atom_getcharfix
jit_atom_getfloat atom_getfloat
Returns
Warning
This function is not exported, but is provided for reference when calling via jit_object_method on an intance of
t_jit_matrix.
jit_atom_setsym atom_setsym
jit_atom_setlong
jit_matrix_setplane3d
jit_atom_getlong
jit_atom_getobj atom_getobj
jit_matrix_setcell
jit_atom_getsym
jit_atom_getcharfix atom_getcharfix
jit_atom_getfloat atom_getfloat
Functions
• void max_jit_attr_set (void ∗x, t_symbol ∗s, short ac, t_atom ∗av)
Sets attribute value.
• t_jit_err max_jit_attr_get (void ∗x, t_symbol ∗s, long ∗ac, t_atom ∗∗av)
Retrieves attribute value.
• void max_jit_attr_getdump (void ∗x, t_symbol ∗s, short argc, t_atom ∗argv)
Retrieves attribute value and sends out dump outlet.
• long max_jit_attr_args_offset (short ac, t_atom ∗av)
Determines argument offset to first attribute argument.
• void max_jit_attr_args (void ∗x, short ac, t_atom ∗av)
Processes attribute arguments.
• void max_jit_classex_standard_wrap (void ∗mclass, void ∗jclass, long flags)
Adds standard Jitter methods, as well as public methods and attributes of the specified Jitter class.
• void max_addmethod_defer (method m, char ∗s)
Adds method to Max class that calls defer rather than the method directly.
• void max_addmethod_defer_low (method m, char ∗s)
Adds method to Max class that calls defer_low rather than the method directly.
• void max_addmethod_usurp (method m, char ∗s)
Adds method to Max class that uses the usurp mechanism to execute method at low priority without backlog.
• void max_addmethod_usurp_low (method m, char ∗s)
Adds method to Max class that uses the usurp mechanism to execute method at low priority without backlog.
• void ∗ max_jit_classex_setup (long oboffset)
Allocates and initializes special t_max_jit_classex data, used by the Max wrapper class.
• t_jit_err max_jit_classex_addattr (void ∗x, void ∗attr)
Adds an attribute to the Max wrapper class.
• void ∗ max_jit_obex_new (void ∗mc, t_symbol ∗classname)
Allocates an initializes a new Max wrapper object instance.
• void max_jit_obex_free (void ∗x)
Frees additional resources for the Max wrapper object instance.
• t_jit_err max_jit_obex_attr_set (void ∗x, t_symbol ∗s, long ac, t_atom ∗av)
Sets an attribute of the Max wrapper or the wrapped Jitter object.
• t_jit_err max_jit_obex_attr_get (void ∗x, t_symbol ∗s, long ∗ac, t_atom ∗∗av)
Retrienves an attribute of the Max wrapper or the wrapped Jitter object.
• void ∗ max_jit_obex_jitob_get (void ∗x)
Retrieves the wrapped Jitter object from a Max wrapper object.
• void max_jit_obex_jitob_set (void ∗x, void ∗jitob)
Adds method to Max class that calls defer rather than the method directly.
To prevent sequencing problems which arize through the use of defer, rather than defer_low, you should instead use
the max_addmethod_defer_low function.
Parameters
m method (function pointer)
s method name
max_addmethod_defer addmess
Adds method to Max class that calls defer_low rather than the method directly.
Parameters
m method (function pointer)
s method name
max_addmethod_defer_low addmess
Adds method to Max class that uses the usurp mechanism to execute method at low priority without backlog.
Equivalent to max_addmethod_usurp_low function.
Parameters
m method (function pointer)
s method name
max_addmethod_usurp addmess
Adds method to Max class that uses the usurp mechanism to execute method at low priority without backlog.
Parameters
m method (function pointer)
s method name
max_addmethod_usurp_low addmess
gensym
jit_object_attr_usercanset jit_class_method_argsafe_get
max_jit_obex_jitob_get
object_method_typed
Returns
argument offset
References attr_args_offset().
Referenced by max_jit_mop_matrix_args().
Here is the call graph for this function:
max_jit_attr_args_offset attr_args_offset
Returns
gensym
max_jit_attr_get
max_jit_obex_jitob_get
Parameters
x Max wrapper object pointer
s attribute name
argc argument count (ignored)
argv argument vector (ignored)
freebytes
jit_error_code defer
max_jit_attr_getdump gensym
max_jit_attr_get max_jit_obex_jitob_get
zgetfn
max_jit_obex_jitob_get
max_jit_attr_set object_attr_get
object_notify
Returns
Referenced by max_jit_classex_mop_wrap().
Allocates and initializes special t_max_jit_classex data, used by the Max wrapper class.
Parameters
oboffset object struct byte offset to obex pointer
Returns
Adds standard Jitter methods, as well as public methods and attributes of the specified Jitter class.
This includes the following public methods: getattributes, getstate, summary, importattrs, exportattrs; and the fol-
lowing private methods: dumpout, quickref, attr_getnames, attr_get, attr_gettarget, and attrindex.
Parameters
mclass Max wrapper class pointer
jclass jitter class pointer
flags reserved for future use (currently ignored)
Returns
adornment pointer
Returns
jit_attr_symcompare object_method
max_jit_obex_attr_get
jit_linklist_findfirst linklist_findfirst
ac atom count
av atom vector
Returns
jit_attr_symcompare object_method
object_notify
References outlet_anything().
Referenced by max_jit_classex_standard_wrap(), and max_jit_obex_gimmeback_dumpout().
Here is the call graph for this function:
max_jit_obex_dumpout outlet_anything
Parameters
x Max wrapper object pointer
Returns
freebytes
freeobject
max_jit_obex_gimmeback
max_jit_obex_jitob_get
object_method_typed
Calls gimmeback methods and outputs any return value through the Max wrapper class' dump outlet.
Parameters
x Max wrapper object pointer
s method name
ac argument count
av argument vector
freebytes
freeobject
gensym
max_jit_obex_gimmeback
max_jit_obex_dumpout outlet_anything
_dumpout
max_jit_obex_jitob_get
object_getvalueof
object_method_typed
Returns
References proxy_getinlet().
Referenced by max_jit_mop_jit_matrix().
Here is the call graph for this function:
max_jit_obex_inletnumber_get proxy_getinlet
Warning
Parameters
x Max wrapper object pointer
inletnumber inlet index
Referenced by max_jit_obex_new().
Returns
Parameters
x Max wrapper object pointer
jitob Jitter object pointer
max_jit_obex_jitob_set gensym
Returns
Returns
jit_linklist_append linklist_append
proxy_new
Functions
36.78.2.1 void jit_copy_bytes ( void ∗ dest, const void ∗ src, long bytes )
References sysmem_copyptr().
Here is the call graph for this function:
jit_copy_bytes sysmem_copyptr
Warning
It is important to avoid mixing memory pools, and therefore to match calls to jit_newptr and jit_disposeptr.
Parameters
ptr pointer to memory
References sysmem_freeptr().
Here is the call graph for this function:
jit_disposeptr sysmem_freeptr
Warning
It is important to avoid mixing memory pools, and therefore to match calls to jit_getbytes and jit_freebytes.
Parameters
ptr pointer to memory
size size in bytes allocated
References sysmem_freeptr().
Referenced by jit_glchunk_delete(), jit_matrix_freedata(), jit_ob3d_free(), and max_jit_obex_free().
Here is the call graph for this function:
jit_freebytes sysmem_freeptr
Warning
Obsolete. OS 9 only.
Returns
free bytes
Warning
It is important to avoid mixing memory pools, and therefore to match calls to jit_getbytes and jit_freebytes.
Parameters
size size in bytes to allocate
Returns
pointer to memory
References sysmem_newptr().
Referenced by jit_glchunk_copy(), jit_glchunk_grid_new(), jit_glchunk_new(), jit_matrix_getcell(), jit_ob3d_new(),
jit_ob3d_setup(), max_jit_classex_setup(), and max_jit_obex_new().
jit_getbytes sysmem_newptr
Warning
It is important to avoid mixing memory pools, and therefore to match calls to jit_handle_new and jit_handle←-
_free.
Parameters
handle memory handle
References sysmem_freehandle().
Referenced by jit_matrix_free().
Here is the call graph for this function:
jit_handle_free sysmem_freehandle
Returns
lock state.
References sysmem_lockhandle().
jit_handle_lock sysmem_lockhandle
Warning
It is important to avoid mixing memory pools, and therefore to match calls to jit_handle_new and jit_handle←-
_free.
Parameters
size size in bytes to allocate
Returns
memory handle
References sysmem_newhandle().
Here is the call graph for this function:
jit_handle_new sysmem_newhandle
Returns
size in bytes
References sysmem_handlesize().
Here is the call graph for this function:
jit_handle_size_get sysmem_handlesize
Returns
References sysmem_resizehandle().
Here is the call graph for this function:
jit_handle_size_set sysmem_resizehandle
Warning
It is important to avoid mixing memory pools, and therefore to match calls to jit_newptr and jit_disposeptr.
Parameters
size size in bytes to allocate
Returns
pointer to memory
References sysmem_newptr().
Here is the call graph for this function:
jit_newptr sysmem_newptr
Data Structures
• struct t_jit_mop_io
t_jit_mop_io object struct.
• struct t_jit_mop
t_jit_mop object struct.
Functions
Returns
Warning
jit_err_from_max_err
jit_mop_free jit_object_free
object_free
Returns
Warning
This function is not exported, but is provided for reference when calling via jit_object_method on an intance of
t_jit_mop.
Returns
Warning
This function is not exported, but is provided for reference when calling via jit_object_method on an intance of
t_jit_mop.
References t_jit_mop::inputlist.
Parameters
x t_jit_mop object pointer
i index
Returns
Warning
This function is not exported, but is provided for reference when calling via jit_object_method on an intance of
t_jit_mop.
Returns
Warning
This function is not exported, but is provided for reference when calling via jit_object_method on an intance of
t_jit_mop.
References t_jit_mop::outputlist.
Returns
gensym
jit_mop_input_nolink
jit_attr_setlong
Returns
Warning
Returns
I/O procedure
Warning
This function is not exported, but is provided for reference when calling via jit_object_method on an intance of
t_jit_mop_io.
References t_jit_mop_io::ioproc.
Parameters
x t_jit_mop_io object pointer
Returns
Warning
This function is not exported, but is provided for reference when calling via jit_object_method on an intance of
t_jit_mop_io.
References t_jit_mop_io::matrix.
Returns
Warning
This function is not exported, but is provided for reference when calling via jit_object_method on an intance of
t_jit_mop_io.
References t_jit_mop_io::ioproc.
Returns
Warning
This function is not exported, but is provided for reference when calling via jit_object_method on an intance of
t_jit_mop_io.
References t_jit_mop_io::matrix.
Returns
Warning
This function is not exported, but is provided for reference when calling via jit_object_new.
jit_mop_io_new gensym
Returns
Warning
This function is not exported, but is provided for reference when calling via jit_object_method on an intance of
t_jit_mop_io.
Restricts the dimension sizes specified in t_jit_matrix_info struct to those permitted by t_jit_mop_io instance, over-
writing value in t_jit_matrix_info struct.
Parameters
x t_jit_mop_io object pointer
info t_jit_matrix_info pointer
Returns
Warning
This function is not exported, but is provided for reference when calling via jit_object_method on an intance of
t_jit_mop_io.
Restricts the planecount specified in t_jit_matrix_info struct to those permitted by t_jit_mop_io instance, overwriting
value in t_jit_matrix_info struct.
Parameters
x t_jit_mop_io object pointer
info t_jit_matrix_info pointer
Returns
Warning
This function is not exported, but is provided for reference when calling via jit_object_method on an intance of
t_jit_mop_io.
Restricts the type specified in t_jit_matrix_info struct to those permitted by t_jit_mop_io instance, overwriting value
in t_jit_matrix_info struct.
Parameters
x t_jit_mop_io object pointer
info t_jit_matrix_info pointer
Returns
Warning
This function is not exported, but is provided for reference when calling via jit_object_method on an intance of
t_jit_mop_io.
object_attr_get
jit_mop_io_restrict_type jit_attr_getsym
object_attr_getsym
Returns
1 void *m;
2 t_jit_matrix_info info;
3
4 if (matrix&&(m=jit_object_method(mop_io,_jit_sym_getmatrix))) {
5 jit_object_method(matrix,_jit_sym_getinfo,&info);
6 jit_object_method(mop_io,_jit_sym_restrict_type,&info);
7 jit_object_method(mop_io,_jit_sym_restrict_dim,&info);
8 jit_object_method(mop_io,_jit_sym_restrict_planecount,&info);
9 jit_object_method(m,_jit_sym_setinfo,&info);
10 jit_object_method(m,_jit_sym_frommatrix,matrix,NULL);
11 }
12
13 return JIT_ERR_NONE;
Parameters
mop t_jit_mop object pointer
mop_io t_jit_mop_io object pointer
matrix t_jit_matrix object pointer
Returns
1 void *m;
2 t_jit_matrix_info info;
3
4 if (matrix&&(m=jit_object_method(mop_io,_jit_sym_getmatrix))) {
5 jit_object_method(m,_jit_sym_frommatrix_trunc,matrix);
6 }
7
8 return JIT_ERR_NONE;
Returns
1 void *m;
2 t_jit_matrix_info info;
3
4 if (matrix&&(m=jit_object_method(mop_io,_jit_sym_getmatrix))) {
5 jit_object_method(m,_jit_sym_clear);
6 jit_object_method(m,_jit_sym_frommatrix_trunc,matrix);
7 }
8
9 return JIT_ERR_NONE;
Returns
t_symbol pointer
1 if (ioproc==NULL) {
2 return ps_resamp;
3 } else if (ioproc==jit_mop_ioproc_copy_adapt) {
4 return ps_adapt;
5 } else if (ioproc==jit_mop_ioproc_copy_trunc) {
6 return ps_trunc;
7 } else if (ioproc==jit_mop_ioproc_copy_trunc_zero) {
8 return ps_trunc_zero;
9 } else {
10 return ps_custom;
11 }
12 return ps_resamp;
jit_mop_ioproc_copy
_adapt
jit_mop_ioproc_tosym jit_mop_ioproc_copy
_trunc
jit_mop_ioproc_copy
_trunc_zero
Utility function to send the same method to all MOP inputs and outputs.
Parameters
mop t_jit_mop object pointer
s method symbol
... untyped arguments
Returns
Returns
Warning
This function is not exported, but is provided for reference when calling via jit_object_new.
gensym object_attr_get
jit_object_free jit_err_from_max_err
object_free
Returns
Warning
This function is not exported, but is provided for reference when calling via jit_object_method on an intance of
t_jit_mop.
gensym
jit_mop_newcopy jit_err_from_max_err
jit_object_free
object_free
Returns
gensym
jit_mop_output_nolink
jit_attr_setlong
Utility function to set the planecount attribute for all MOP inputs and outputs.
Parameters
mop t_jit_mop object pointer
c planecount
Returns
gensym
jit_mop_single_planecount
jit_attr_setlong
Utility function to set the type attribute for all MOP inputs and outputs.
Parameters
mop t_jit_mop object pointer
s type symbol
Returns
gensym
jit_mop_single_type
jit_atom_setsym atom_setsym
Functions
• the size of the matrix data is larger then the parallel threshold
Parameters
p parallel ndim calc data
36.80.2.2 void jit_parallel_ndim_simplecalc1 ( method fn, void ∗ data, long dimcount, long ∗ dim, long planecount,
t_jit_matrix_info ∗ minfo1, char ∗ bp1, long flags1 )
References jit_parallel_ndim_calc().
Here is the call graph for this function:
jit_parallel_ndim_simplecalc1 jit_parallel_ndim_calc
36.80.2.3 void jit_parallel_ndim_simplecalc2 ( method fn, void ∗ data, long dimcount, long ∗ dim, long planecount,
t_jit_matrix_info ∗ minfo1, char ∗ bp1, t_jit_matrix_info ∗ minfo2, char ∗ bp2, long flags1, long flags2 )
jit_parallel_ndim_simplecalc2 jit_parallel_ndim_calc
36.80.2.4 void jit_parallel_ndim_simplecalc3 ( method fn, void ∗ data, long dimcount, long ∗ dim, long planecount,
t_jit_matrix_info ∗ minfo1, char ∗ bp1, t_jit_matrix_info ∗ minfo2, char ∗ bp2, t_jit_matrix_info ∗ minfo3,
char ∗ bp3, long flags1, long flags2, long flags3 )
jit_parallel_ndim_simplecalc3 jit_parallel_ndim_calc
36.80.2.5 void jit_parallel_ndim_simplecalc4 ( method fn, void ∗ data, long dimcount, long ∗ dim, long planecount,
t_jit_matrix_info ∗ minfo1, char ∗ bp1, t_jit_matrix_info ∗ minfo2, char ∗ bp2, t_jit_matrix_info ∗ minfo3,
char ∗ bp3, t_jit_matrix_info ∗ minfo4, char ∗ bp4, long flags1, long flags2, long flags3, long flags4 )
jit_parallel_ndim_simplecalc4 jit_parallel_ndim_calc
Functions
Sets a custom matrix procedure for the MOP Max wrapper class.
Parameters
mclass max jit classex pointer returned from max_jit_classex_setup
jclass t_jit_class pointer, typcially returned from jit_class_findbyname
mproc matrix procedure
Returns
max_jit_classex_mop
_mproc jit_class_adornment_get
Adds default methods and attributes to the MOP Max wrapper class.
Parameters
mclass max jit classex pointer returned from max_jit_classex_setup
jclass t_jit_class pointer, typcially returned from jit_class_findbyname
Returns
addmess
addbang typedmess
jit_error_code defer
max_addmethod_usurp_low max_jit_obex_jitob_get
jit_class_adornment_get jit_atom_getsym
max_jit_mop_bang
jit_object_free object_free
max_jit_classex_mop_wrap max_jit_mop_jit_matrix
outlet_anything
max_jit_classex_addattr max_jit_mop_adapt_matrix_all jit_object_classname
_compare jit_object_classname object_classname
max_jit_obex_adornment_get
max_jit_mop_outputmatrix
atom_setsym
jit_atom_setsym
jit_err_from_max_err
max_jit_mop_clear jit_attr_getlong
object_attr_getlong
jit_object_findregistered
object_attr_setsym
jit_attr_setsym object_attr_get
jit_attr_getsym object_attr_getsym
max_jit_mop_notify
jit_object_attach object_attach
jit_object_register object_register
Returns
Referenced by max_jit_mop_jit_matrix().
Here is the call graph for this function:
object_attr_get
jit_attr_getlong object_attr_getlong
jit_err_from_max_err
max_jit_mop_adapt_matrix_all jit_object_free
object_free
max_jit_obex_adornment_get
jit_object_classname jit_object_classname object_classname
_compare
Returns
object_attr_get
jit_attr_getsym object_attr_getsym
max_jit_mop_assist
max_jit_obex_adornment_get jit_object_classname jit_object_classname object_classname
_compare
Returns
max_jit_mop_bang typedmess
Returns
object_attr_get
jit_attr_getlong object_attr_getlong
max_jit_mop_clear
max_jit_obex_adornment_get jit_object_classname
jit_object_classname object_classname
_compare
Parameters
x Max object pointer
object_attr_getsym
jit_attr_getsym object_attr_get
jit_attr_getlong object_attr_getlong
jit_attr_setsym object_attr_setsym
max_jit_mop_free
jit_object_detach jit_err_from_max_err
jit_object_free object_detach
object_free
max_jit_obex_adornment_get
jit_object_classname jit_object_classname object_classname
_compare
Returns
max_jit_mop_get_io jit_object_classname
_by_name max_jit_obex_adornment_get _compare jit_object_classname object_classname
Parameters
x Max object pointer
c input index
Returns
Returns
Returns
object_attr_get
jit_attr_getlong object_attr_getlong
max_jit_mop_getoutputmode
max_jit_obex_adornment_get jit_object_classname
_compare jit_object_classname object_classname
Returns
object_attr_getlong
jit_attr_getlong object_attr_get
jit_attr_setsym jit_err_from_max_err
jit_matrix_info_default object_attr_setsym
jit_object_register object_register
max_jit_obex_adornment_get jit_object_classname
jit_object_classname object_classname
_compare
jit_linklist_append linklist_append
max_jit_obex_proxy_new
jit_linklist_new linklist_new
proxy_new
Parameters
x Max object pointer
s message symbol ("jit_matrix")
argc argument count
argv argument vector
Returns
object_attr_setsym
jit_atom_getsym
jit_attr_setsym jit_err_from_max_err
jit_object_free object_free
object_attr_get
max_jit_mop_adapt_matrix_all jit_attr_getlong
object_attr_getlong
max_jit_obex_adornment_get
jit_object_classname
_compare jit_object_classname object_classname
max_jit_mop_jit_matrix max_jit_mop_outputmatrix jit_attr_getsym
object_attr_getsym
jit_atom_setsym
atom_setsym
jit_error_code outlet_anything
jit_object_findregistered defer
max_jit_obex_inletnumber_get proxy_getinlet
max_jit_obex_jitob_get
Returns
jit_atom_arg_getlong atom_arg_getlong
jit_atom_arg_getsym atom_arg_getsym
jit_attr_getlong object_attr_get
jit_matrix_info_default
max_jit_attr_args_offset attr_args_offset
max_jit_obex_adornment_get jit_object_classname
_compare jit_object_classname object_classname
Returns
jit_object_classname
max_jit_obex_adornment_get jit_object_classname object_classname
_compare
max_jit_mop_matrixout_new
outlet_new
Returns
object_attr_getsym
jit_attr_getsym object_attr_get
jit_attr_getlong object_attr_getlong
jit_attr_setsym jit_err_from_max_err
jit_object_findregistered object_attach
jit_object_register object_register
Returns
atom_setsym
jit_atom_setsym
object_attr_getlong
jit_attr_getlong
object_attr_get
max_jit_mop_outputmatrix jit_attr_getsym
object_attr_getsym
max_jit_obex_adornment_get
jit_object_classname
_compare jit_object_classname object_classname
outlet_anything
Returns
object_attr_getlong
jit_attr_getlong object_attr_get
jit_attr_setsym jit_err_from_max_err
jit_matrix_info_default object_attr_setsym
jit_object_register object_register
max_jit_mop_matrixout_new outlet_new
Parameters
x Max object pointer
Returns
jit_class_adornment_get
max_jit_obex_jitob_get
Initializes default state and resources for MOP Max wrapper class.
Parameters
x Max object pointer
o Jitter object pointer
argc argument count
argv argument vector
Returns
1 max_jit_obex_jitob_set(x,o);
2 max_jit_obex_dumpout_set(x,outlet_new(x,NULL));
3 max_jit_mop_setup(x);
4 max_jit_mop_inputs(x);
5 max_jit_mop_outputs(x);
6 max_jit_mop_matrix_args(x,argc,argv);
7
8 return JIT_ERR_NONE;
jit_linklist_append linklist_append
jit_linklist_new linklist_new
max_jit_obex_proxy_new
proxy_new
object_attach
jit_object_attach
object_register
jit_object_register
jit_err_from_max_err
jit_attr_setsym
max_jit_mop_inputs object_attr_setsym
jit_attr_getlong
object_attr_get
max_jit_mop_outputs
object_attr_getlong
max_jit_mop_matrixout_new
jit_attr_setlong
max_jit_mop_matrix_args
jit_atom_arg_getlong atom_arg_getlong
jit_atom_arg_getsym atom_arg_getsym
max_jit_attr_args_offset attr_args_offset
max_jit_mop_setup_simple outlet_new
max_jit_mop_setup jit_class_adornment_get
max_jit_obex_jitob_get
max_jit_obex_jitob_set
gensym
Sets the number of inputs for a variable input MOP Max wrapper object.
Parameters
x Max object pointer
c inlet count
Returns
gensym
max_jit_mop_variable
_addinputs
max_jit_obex_adornment_get jit_object_classname jit_object_classname object_classname
_compare
Sets the number of outputs for a variable input MOP Max wrapper object.
Parameters
x Max object pointer
c inlet count
Returns
gensym
max_jit_mop_variable
_addoutputs
jit_object_classname
max_jit_obex_adornment_get _compare jit_object_classname object_classname
Functions
error
jit_gl_report_error post
jit_atom_setobj atom_setobj
jit_object_findregistered
sysmem_freeptr
sysmem_newptr
Parameters
drawinfo t_jit_gl_drawinfo pointer
s texture name
i texture unit
References t_jit_gl_drawinfo::ob3d.
Returns
Returns
References t_jit_gl_drawinfo::ob3d.
Returns
Returns
Returns
Returns
Returns
Returns
Referenced by jit_gl_is_min_version().
Parameters
ctx t_jit_gl_context pointer
ext extension string
Returns
1 if true, 0 if false.
Tests current OpenGL version to be greater than or equal to the version provided.
Assumes a valid context has been set.
Parameters
major major version number
minor minor version number
release release version number
Returns
1 if true, 0 if false.
References jit_gl_get_version().
Here is the call graph for this function:
jit_gl_is_min_version jit_gl_get_version
Returns
error
jit_gl_report_error
post
Parameters
drawinfo t_jit_gl_drawinfo pointer
v texture coordinate vector
References t_jit_gl_drawinfo::ob3d.
Returns
jit_getbytes sysmem_newptr
jit_err_from_max_err
jit_glchunk_copy
jit_object_free object_free
jit_glchunk_delete
jit_freebytes sysmem_freeptr
jit_freebytes sysmem_freeptr
jit_glchunk_delete
jit_object_free jit_err_from_max_err
object_free
36.82.2.24 t_jit_glchunk∗ jit_glchunk_grid_new ( t_symbol ∗ prim, int planes, int width, int height )
Parameters
prim drawing primitive name
planes number of planes to allocate in vertex matrix
width width of vertex matrix to allocate
height height of vertex matrix to allocate
Returns
t_jit_glchunk pointer
jit_getbytes sysmem_newptr
jit_freebytes sysmem_freeptr
jit_glchunk_grid_new jit_glchunk_delete
jit_object_free jit_err_from_max_err
jit_matrix_info_default
object_free
36.82.2.25 t_jit_glchunk∗ jit_glchunk_new ( t_symbol ∗ prim, int planes, int vertices, int indices )
Returns
t_jit_glchunk pointer
jit_getbytes sysmem_newptr
jit_freebytes sysmem_freeptr
jit_glchunk_new jit_glchunk_delete
jit_object_free jit_err_from_max_err
jit_matrix_info_default
object_free
Draws one t_jit_glchunk If the OB3D is not in matrixoutput mode, the drawing call is made directly to the renderer.
Otherwise, the chunk is sent out the OB3D's outlet as a message compatible with jit.gl.render.
Parameters
v t_jit_ob3d pointer
chunk t_jit_glchunk pointer
Returns
jit_atom_setlong
jit_getbytes sysmem_newptr
jit_glchunk_copy
jit_ob3d_draw_chunk
jit_freebytes sysmem_freeptr
jit_glchunk_delete
jit_object_free jit_err_from_max_err
jit_object_notify object_notify
object_free
Parameters
jit_ob Jitter object pointer
gensym
jit_attr_setsym object_attr_setsym
jit_err_from_max_err
jit_attr_getsym object_attr_get
jit_ob3d_free object_attr_getsym
jit_object_free object_free
jit_glchunk_delete
jit_freebytes sysmem_freeptr
jit_object_classname object_classname
Returns
gensym atom_setsym
jit_atom_setsym object_attr_getsym
jit_attr_getsym object_attr_get
jit_getbytes object_attr_setsym
sysmem_newptr
jit_object_classname
object_classname
jit_object_getmethod
object_getmethod
Sets the current Open GL context to the context referenced by the OB3D drawto attribute.
Warning
Not recommended for use within the draw method, as it can have adverse effects when rendering to alternate
contexts as is the case when capturing to a texture.
Parameters
jit_ob Jitter object pointer
Returns
Returns
gensym class_addattr
jit_class_addattr jit_err_from_max_err
jit_ob3d_setup
jit_class_addmethod class_addmethod
jit_getbytes sysmem_newptr
Returns
Parameters
x Max wrapper object pointer
jit_ob Jitter object pointer
outlet matrix outlet pointer
object_attr_get
jit_attr_getsym object_attr_getsym
max_jit_ob3d_attach
jit_object_attach object_attach
object_attr_get
jit_attr_getsym object_attr_getsym
max_jit_obex_jitob_get object_detach
Parameters
x Max object pointer
References typedmess().
Referenced by max_jit_class_ob3d_wrap(), and max_ob3d_setup().
Here is the call graph for this function:
max_ob3d_bang typedmess
36.82.2.35 void max_ob3d_notify ( t_max_object ∗ x, t_symbol ∗ sender_name, t_symbol ∗ msg, void ∗ p_sender )
Returns
automatic flag
Parameters
v t_jit_ob3d pointer
width destination dimensions width
height destination dimensions height
Returns
dirty flag
Returns
enable flag
Returns
Parameters
v t_jit_ob3d pointer
Returns
matrix outlet
Returns
Returns
renderer pointer
Returns
UI flag
Functions
• void jit_op_vector_pass_char (long n, void ∗vecdata, t_jit_op_info ∗in0, t_jit_op_info ∗in1, t_jit_op_info ∗out)
Unary operator: pass (char)
• void jit_op_vector_mult_char (long n, void ∗vecdata, t_jit_op_info ∗in0, t_jit_op_info ∗in1, t_jit_op_info ∗out)
Binary operator: multiplication (char)
• void jit_op_vector_div_char (long n, void ∗vecdata, t_jit_op_info ∗in0, t_jit_op_info ∗in1, t_jit_op_info ∗out)
Binary operator: division (char)
• void jit_op_vector_mod_char (long n, void ∗vecdata, t_jit_op_info ∗in0, t_jit_op_info ∗in1, t_jit_op_info ∗out)
Binary operator: modulo (char)
• void jit_op_vector_add_char (long n, void ∗vecdata, t_jit_op_info ∗in0, t_jit_op_info ∗in1, t_jit_op_info ∗out)
Binary operator: addition (char)
• void jit_op_vector_adds_char (long n, void ∗vecdata, t_jit_op_info ∗in0, t_jit_op_info ∗in1, t_jit_op_info ∗out)
Binary operator: saturated addition (char)
• void jit_op_vector_sub_char (long n, void ∗vecdata, t_jit_op_info ∗in0, t_jit_op_info ∗in1, t_jit_op_info ∗out)
Binary operator: subtraction (char)
• void jit_op_vector_subs_char (long n, void ∗vecdata, t_jit_op_info ∗in0, t_jit_op_info ∗in1, t_jit_op_info ∗out)
Binary operator: saturated subtraction (char)
• void jit_op_vector_min_char (long n, void ∗vecdata, t_jit_op_info ∗in0, t_jit_op_info ∗in1, t_jit_op_info ∗out)
Binary operator: minimum (char)
• void jit_op_vector_max_char (long n, void ∗vecdata, t_jit_op_info ∗in0, t_jit_op_info ∗in1, t_jit_op_info ∗out)
Binary operator: maximum (char)
• void jit_op_vector_avg_char (long n, void ∗vecdata, t_jit_op_info ∗in0, t_jit_op_info ∗in1, t_jit_op_info ∗out)
Binary operator: average (char)
• void jit_op_vector_absdiff_char (long n, void ∗vecdata, t_jit_op_info ∗in0, t_jit_op_info ∗in1, t_jit_op_info ∗out)
Binary operator: absolute difference (char)
• void jit_op_vector_pass_float32 (long n, void ∗vecdata, t_jit_op_info ∗in0, t_jit_op_info ∗in1, t_jit_op_info
∗out)
Unary operator: pass (float32)
• void jit_op_vector_mult_float32 (long n, void ∗vecdata, t_jit_op_info ∗in0, t_jit_op_info ∗in1, t_jit_op_info ∗out)
Binary operator: multiplication (float32)
• void jit_op_vector_div_float32 (long n, void ∗vecdata, t_jit_op_info ∗in0, t_jit_op_info ∗in1, t_jit_op_info ∗out)
Binary operator: division (float32)
• void jit_op_vector_add_float32 (long n, void ∗vecdata, t_jit_op_info ∗in0, t_jit_op_info ∗in1, t_jit_op_info ∗out)
Binary operator: addition (float32)
• void jit_op_vector_sub_float32 (long n, void ∗vecdata, t_jit_op_info ∗in0, t_jit_op_info ∗in1, t_jit_op_info ∗out)
Binary operator: subtraction (float32)
• void jit_op_vector_min_float32 (long n, void ∗vecdata, t_jit_op_info ∗in0, t_jit_op_info ∗in1, t_jit_op_info ∗out)
• void jit_op_vector_flippass_float32 (long n, void ∗vecdata, t_jit_op_info ∗in0, t_jit_op_info ∗in1, t_jit_op_info
∗out)
Unary operator: flipped pass (float32)
• void jit_op_vector_flipdiv_float32 (long n, void ∗vecdata, t_jit_op_info ∗in0, t_jit_op_info ∗in1, t_jit_op_info
∗out)
Binary operator: flipped division (float32)
• void jit_op_vector_flipmod_float32 (long n, void ∗vecdata, t_jit_op_info ∗in0, t_jit_op_info ∗in1, t_jit_op_info
∗out)
Binary operator: flipped modulo (float32)
• void jit_op_vector_flipsub_float32 (long n, void ∗vecdata, t_jit_op_info ∗in0, t_jit_op_info ∗in1, t_jit_op_info
∗out)
Binary operator: flipped subtraction (float32)
• void jit_op_vector_flippass_float64 (long n, void ∗vecdata, t_jit_op_info ∗in0, t_jit_op_info ∗in1, t_jit_op_info
∗out)
Unary operator: flipped pass (float64)
• void jit_op_vector_flipdiv_float64 (long n, void ∗vecdata, t_jit_op_info ∗in0, t_jit_op_info ∗in1, t_jit_op_info
∗out)
Binary operator: flipped division (float64)
• void jit_op_vector_flipmod_float64 (long n, void ∗vecdata, t_jit_op_info ∗in0, t_jit_op_info ∗in1, t_jit_op_info
∗out)
Binary operator: flipped modulo (float64)
• void jit_op_vector_flippass_long (long n, void ∗vecdata, t_jit_op_info ∗in0, t_jit_op_info ∗in1, t_jit_op_info
∗out)
Unary operator: flipped pass (long)
• void jit_op_vector_flipdiv_long (long n, void ∗vecdata, t_jit_op_info ∗in0, t_jit_op_info ∗in1, t_jit_op_info ∗out)
Binary operator: flipped division (long)
• void jit_op_vector_flipmod_long (long n, void ∗vecdata, t_jit_op_info ∗in0, t_jit_op_info ∗in1, t_jit_op_info
∗out)
Binary operator: flipped modulo (long)
• void jit_op_vector_flipsub_long (long n, void ∗vecdata, t_jit_op_info ∗in0, t_jit_op_info ∗in1, t_jit_op_info ∗out)
Binary operator: flipped subtraction (long)
• void jit_op_vector_and_char (long n, void ∗vecdata, t_jit_op_info ∗in0, t_jit_op_info ∗in1, t_jit_op_info ∗out)
Binary operator: logical and (char)
• void jit_op_vector_or_char (long n, void ∗vecdata, t_jit_op_info ∗in0, t_jit_op_info ∗in1, t_jit_op_info ∗out)
Binary operator: logical or (char)
• void jit_op_vector_not_char (long n, void ∗vecdata, t_jit_op_info ∗in0, t_jit_op_info ∗in1, t_jit_op_info ∗out)
Unary operator: logical not (char)
• void jit_op_vector_gt_char (long n, void ∗vecdata, t_jit_op_info ∗in0, t_jit_op_info ∗in1, t_jit_op_info ∗out)
Binary operator: greater than (char)
• void jit_op_vector_gte_char (long n, void ∗vecdata, t_jit_op_info ∗in0, t_jit_op_info ∗in1, t_jit_op_info ∗out)
Binary operator: greater than or equals (char)
• void jit_op_vector_lt_char (long n, void ∗vecdata, t_jit_op_info ∗in0, t_jit_op_info ∗in1, t_jit_op_info ∗out)
Binary operator: less than (char)
• void jit_op_vector_lte_char (long n, void ∗vecdata, t_jit_op_info ∗in0, t_jit_op_info ∗in1, t_jit_op_info ∗out)
Binary operator: less than or equals (char)
• void jit_op_vector_eq_char (long n, void ∗vecdata, t_jit_op_info ∗in0, t_jit_op_info ∗in1, t_jit_op_info ∗out)
Binary operator: equals (char)
• void jit_op_vector_neq_char (long n, void ∗vecdata, t_jit_op_info ∗in0, t_jit_op_info ∗in1, t_jit_op_info ∗out)
Binary operator: not equals (char)
• void jit_op_vector_and_float32 (long n, void ∗vecdata, t_jit_op_info ∗in0, t_jit_op_info ∗in1, t_jit_op_info ∗out)
Binary operator: logical and (float32)
• void jit_op_vector_or_float32 (long n, void ∗vecdata, t_jit_op_info ∗in0, t_jit_op_info ∗in1, t_jit_op_info ∗out)
• void jit_op_vector_gtp_char (long n, void ∗vecdata, t_jit_op_info ∗in0, t_jit_op_info ∗in1, t_jit_op_info ∗out)
Binary operator: greater than pass (char)
• void jit_op_vector_gtep_char (long n, void ∗vecdata, t_jit_op_info ∗in0, t_jit_op_info ∗in1, t_jit_op_info ∗out)
Binary operator: greater than or equals pass (char)
• void jit_op_vector_ltp_char (long n, void ∗vecdata, t_jit_op_info ∗in0, t_jit_op_info ∗in1, t_jit_op_info ∗out)
Binary operator: less than pass (char)
• void jit_op_vector_ltep_char (long n, void ∗vecdata, t_jit_op_info ∗in0, t_jit_op_info ∗in1, t_jit_op_info ∗out)
Binary operator: less than or equals pass (char)
• void jit_op_vector_eqp_char (long n, void ∗vecdata, t_jit_op_info ∗in0, t_jit_op_info ∗in1, t_jit_op_info ∗out)
Binary operator: equals pass (char)
• void jit_op_vector_neqp_char (long n, void ∗vecdata, t_jit_op_info ∗in0, t_jit_op_info ∗in1, t_jit_op_info ∗out)
Binary operator: not equals pass (char)
• void jit_op_vector_gtp_float32 (long n, void ∗vecdata, t_jit_op_info ∗in0, t_jit_op_info ∗in1, t_jit_op_info ∗out)
Binary operator: greater than pass (float32)
• void jit_op_vector_gtep_float32 (long n, void ∗vecdata, t_jit_op_info ∗in0, t_jit_op_info ∗in1, t_jit_op_info ∗out)
Binary operator: greater than or equals pass (float32)
• void jit_op_vector_ltp_float32 (long n, void ∗vecdata, t_jit_op_info ∗in0, t_jit_op_info ∗in1, t_jit_op_info ∗out)
Binary operator: less than pass (float32)
• void jit_op_vector_ltep_float32 (long n, void ∗vecdata, t_jit_op_info ∗in0, t_jit_op_info ∗in1, t_jit_op_info ∗out)
Binary operator: less than or equals pass (float32)
• void jit_op_vector_eqp_float32 (long n, void ∗vecdata, t_jit_op_info ∗in0, t_jit_op_info ∗in1, t_jit_op_info ∗out)
Binary operator: equals pass (float32)
• void jit_op_vector_neqp_float32 (long n, void ∗vecdata, t_jit_op_info ∗in0, t_jit_op_info ∗in1, t_jit_op_info
∗out)
Binary operator: not equals pass (float32)
• void jit_op_vector_gtp_float64 (long n, void ∗vecdata, t_jit_op_info ∗in0, t_jit_op_info ∗in1, t_jit_op_info ∗out)
Binary operator: greater than pass (float64)
• void jit_op_vector_gtep_float64 (long n, void ∗vecdata, t_jit_op_info ∗in0, t_jit_op_info ∗in1, t_jit_op_info ∗out)
Binary operator: greater than or equals pass (float64)
• void jit_op_vector_ltp_float64 (long n, void ∗vecdata, t_jit_op_info ∗in0, t_jit_op_info ∗in1, t_jit_op_info ∗out)
Binary operator: less than pass (float64)
• void jit_op_vector_ltep_float64 (long n, void ∗vecdata, t_jit_op_info ∗in0, t_jit_op_info ∗in1, t_jit_op_info ∗out)
Binary operator: less than or equals pass (float64)
• void jit_op_vector_eqp_float64 (long n, void ∗vecdata, t_jit_op_info ∗in0, t_jit_op_info ∗in1, t_jit_op_info ∗out)
Binary operator: equals pass (float64)
• void jit_op_vector_neqp_float64 (long n, void ∗vecdata, t_jit_op_info ∗in0, t_jit_op_info ∗in1, t_jit_op_info
∗out)
Binary operator: not equals pass (float64)
• void jit_op_vector_gtp_long (long n, void ∗vecdata, t_jit_op_info ∗in0, t_jit_op_info ∗in1, t_jit_op_info ∗out)
Binary operator: greater than pass (long)
• void jit_op_vector_gtep_long (long n, void ∗vecdata, t_jit_op_info ∗in0, t_jit_op_info ∗in1, t_jit_op_info ∗out)
Binary operator: greater than or equals pass (long)
• void jit_op_vector_ltp_long (long n, void ∗vecdata, t_jit_op_info ∗in0, t_jit_op_info ∗in1, t_jit_op_info ∗out)
Binary operator: less than pass (long)
• void jit_op_vector_ltep_long (long n, void ∗vecdata, t_jit_op_info ∗in0, t_jit_op_info ∗in1, t_jit_op_info ∗out)
Binary operator: less than or equals pass (long)
• void jit_op_vector_eqp_long (long n, void ∗vecdata, t_jit_op_info ∗in0, t_jit_op_info ∗in1, t_jit_op_info ∗out)
Binary operator: equals pass (long)
• void jit_op_vector_neqp_long (long n, void ∗vecdata, t_jit_op_info ∗in0, t_jit_op_info ∗in1, t_jit_op_info ∗out)
Binary operator: not equals pass (long)
• void jit_op_vector_sin_float32 (long n, void ∗vecdata, t_jit_op_info ∗in0, t_jit_op_info ∗in1, t_jit_op_info ∗out)
• void jit_op_vector_floor_float32 (long n, void ∗vecdata, t_jit_op_info ∗in0, t_jit_op_info ∗in1, t_jit_op_info ∗out)
Unary operator: floor (float32)
• void jit_op_vector_round_float32 (long n, void ∗vecdata, t_jit_op_info ∗in0, t_jit_op_info ∗in1, t_jit_op_info
∗out)
Unary operator: round (float32)
• void jit_op_vector_trunc_float32 (long n, void ∗vecdata, t_jit_op_info ∗in0, t_jit_op_info ∗in1, t_jit_op_info
∗out)
Unary operator: truncate (float32)
• void jit_op_vector_sin_float64 (long n, void ∗vecdata, t_jit_op_info ∗in0, t_jit_op_info ∗in1, t_jit_op_info ∗out)
Unary operator: sine (float64)
• void jit_op_vector_cos_float64 (long n, void ∗vecdata, t_jit_op_info ∗in0, t_jit_op_info ∗in1, t_jit_op_info ∗out)
Unary operator: cosine (float64)
• void jit_op_vector_tan_float64 (long n, void ∗vecdata, t_jit_op_info ∗in0, t_jit_op_info ∗in1, t_jit_op_info ∗out)
Unary operator: tangent (float64)
• void jit_op_vector_asin_float64 (long n, void ∗vecdata, t_jit_op_info ∗in0, t_jit_op_info ∗in1, t_jit_op_info ∗out)
Unary operator: arcsine (float64)
• void jit_op_vector_acos_float64 (long n, void ∗vecdata, t_jit_op_info ∗in0, t_jit_op_info ∗in1, t_jit_op_info
∗out)
Unary operator: arccosine (float64)
• void jit_op_vector_atan_float64 (long n, void ∗vecdata, t_jit_op_info ∗in0, t_jit_op_info ∗in1, t_jit_op_info ∗out)
Unary operator: arctangetn (float64)
• void jit_op_vector_atan2_float64 (long n, void ∗vecdata, t_jit_op_info ∗in0, t_jit_op_info ∗in1, t_jit_op_info
∗out)
Binary operator: arctangent (float64)
• void jit_op_vector_sinh_float64 (long n, void ∗vecdata, t_jit_op_info ∗in0, t_jit_op_info ∗in1, t_jit_op_info ∗out)
Unary operator: hyperbolic sine (float64)
• void jit_op_vector_cosh_float64 (long n, void ∗vecdata, t_jit_op_info ∗in0, t_jit_op_info ∗in1, t_jit_op_info
∗out)
Unary operator: hyperbolic cosine (float64)
• void jit_op_vector_tanh_float64 (long n, void ∗vecdata, t_jit_op_info ∗in0, t_jit_op_info ∗in1, t_jit_op_info ∗out)
Unary operator: hyperbolic tangent (float64)
• void jit_op_vector_asinh_float64 (long n, void ∗vecdata, t_jit_op_info ∗in0, t_jit_op_info ∗in1, t_jit_op_info
∗out)
Unary operator: hyperbolic arcsine (float64)
• void jit_op_vector_acosh_float64 (long n, void ∗vecdata, t_jit_op_info ∗in0, t_jit_op_info ∗in1, t_jit_op_info
∗out)
Unary operator: hyperbolic arccosine (float64)
• void jit_op_vector_atanh_float64 (long n, void ∗vecdata, t_jit_op_info ∗in0, t_jit_op_info ∗in1, t_jit_op_info
∗out)
Unary operator: hyperbolic arctangent (float64)
• void jit_op_vector_exp_float64 (long n, void ∗vecdata, t_jit_op_info ∗in0, t_jit_op_info ∗in1, t_jit_op_info ∗out)
Unary operator: exponent (float64)
• void jit_op_vector_exp2_float64 (long n, void ∗vecdata, t_jit_op_info ∗in0, t_jit_op_info ∗in1, t_jit_op_info
∗out)
Unary operator: exponent base 2(float64)
• void jit_op_vector_log_float64 (long n, void ∗vecdata, t_jit_op_info ∗in0, t_jit_op_info ∗in1, t_jit_op_info ∗out)
Unary operator: logarithm (float64)
• void jit_op_vector_log2_float64 (long n, void ∗vecdata, t_jit_op_info ∗in0, t_jit_op_info ∗in1, t_jit_op_info ∗out)
Unary operator: logarithm base 2 (float64)
• void jit_op_vector_log10_float64 (long n, void ∗vecdata, t_jit_op_info ∗in0, t_jit_op_info ∗in1, t_jit_op_info
∗out)
Unary operator: logarithm base 10 (float64)
• void jit_op_vector_hypot_float64 (long n, void ∗vecdata, t_jit_op_info ∗in0, t_jit_op_info ∗in1, t_jit_op_info
∗out)
Binary operator: hypotenuse (float64)
• void jit_op_vector_pow_float64 (long n, void ∗vecdata, t_jit_op_info ∗in0, t_jit_op_info ∗in1, t_jit_op_info ∗out)
Binary operator: power (float64)
• void jit_op_vector_sqrt_float64 (long n, void ∗vecdata, t_jit_op_info ∗in0, t_jit_op_info ∗in1, t_jit_op_info ∗out)
Unary operator: square root (float64)
• void jit_op_vector_ceil_float64 (long n, void ∗vecdata, t_jit_op_info ∗in0, t_jit_op_info ∗in1, t_jit_op_info ∗out)
Unary operator: ceiling (float64)
• void jit_op_vector_floor_float64 (long n, void ∗vecdata, t_jit_op_info ∗in0, t_jit_op_info ∗in1, t_jit_op_info ∗out)
Unary operator: floor (float64)
• void jit_op_vector_round_float64 (long n, void ∗vecdata, t_jit_op_info ∗in0, t_jit_op_info ∗in1, t_jit_op_info
∗out)
Unary operator: round (float64)
• void jit_op_vector_trunc_float64 (long n, void ∗vecdata, t_jit_op_info ∗in0, t_jit_op_info ∗in1, t_jit_op_info
∗out)
Unary operator: truncate (float64)
36.83.2.1 void jit_op_vector_abs_float32 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1, t_jit_op_info
∗ out )
36.83.2.2 void jit_op_vector_abs_float64 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1, t_jit_op_info
∗ out )
36.83.2.3 void jit_op_vector_abs_long ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1, t_jit_op_info ∗
out )
Parameters
n length of vectors
vecdata ignored
in0 left input pointer and stride
in1 right input pointer and stride
out output pointer and stride
36.83.2.4 void jit_op_vector_absdiff_char ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1, t_jit_op_info
∗ out )
36.83.2.5 void jit_op_vector_absdiff_float32 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
36.83.2.6 void jit_op_vector_absdiff_float64 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
36.83.2.7 void jit_op_vector_absdiff_long ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1, t_jit_op_info
∗ out )
Parameters
n length of vectors
vecdata ignored
in0 left input pointer and stride
in1 right input pointer and stride
out output pointer and stride
36.83.2.8 void jit_op_vector_acos_float32 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1, t_jit_op_info
∗ out )
36.83.2.9 void jit_op_vector_acos_float64 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1, t_jit_op_info
∗ out )
36.83.2.10 void jit_op_vector_acosh_float32 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
36.83.2.11 void jit_op_vector_acosh_float64 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
Parameters
n length of vectors
vecdata ignored
in0 left input pointer and stride
in1 right input pointer and stride
out output pointer and stride
36.83.2.12 void jit_op_vector_add_char ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1, t_jit_op_info
∗ out )
36.83.2.13 void jit_op_vector_add_float32 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
36.83.2.14 void jit_op_vector_add_float64 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
36.83.2.15 void jit_op_vector_add_long ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1, t_jit_op_info
∗ out )
Parameters
n length of vectors
vecdata ignored
in0 left input pointer and stride
in1 right input pointer and stride
out output pointer and stride
36.83.2.16 void jit_op_vector_adds_char ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1, t_jit_op_info
∗ out )
36.83.2.17 void jit_op_vector_and_char ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1, t_jit_op_info
∗ out )
36.83.2.18 void jit_op_vector_and_float32 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
36.83.2.19 void jit_op_vector_and_float64 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
Parameters
n length of vectors
vecdata ignored
in0 left input pointer and stride
in1 right input pointer and stride
out output pointer and stride
36.83.2.20 void jit_op_vector_and_long ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1, t_jit_op_info
∗ out )
36.83.2.21 void jit_op_vector_asin_float32 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
36.83.2.22 void jit_op_vector_asin_float64 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
36.83.2.23 void jit_op_vector_asinh_float32 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
Parameters
n length of vectors
vecdata ignored
in0 left input pointer and stride
in1 right input pointer and stride
out output pointer and stride
36.83.2.24 void jit_op_vector_asinh_float64 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
36.83.2.25 void jit_op_vector_atan2_float32 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
36.83.2.26 void jit_op_vector_atan2_float64 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
36.83.2.27 void jit_op_vector_atan_float32 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
Parameters
n length of vectors
vecdata ignored
in0 left input pointer and stride
in1 right input pointer and stride
out output pointer and stride
36.83.2.28 void jit_op_vector_atan_float64 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
36.83.2.29 void jit_op_vector_atanh_float32 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
36.83.2.30 void jit_op_vector_atanh_float64 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
36.83.2.31 void jit_op_vector_avg_char ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1, t_jit_op_info ∗
out )
Parameters
n length of vectors
vecdata ignored
in0 left input pointer and stride
in1 right input pointer and stride
out output pointer and stride
36.83.2.32 void jit_op_vector_avg_float32 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1, t_jit_op_info
∗ out )
36.83.2.33 void jit_op_vector_avg_float64 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1, t_jit_op_info
∗ out )
36.83.2.34 void jit_op_vector_avg_long ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1, t_jit_op_info ∗
out )
36.83.2.35 void jit_op_vector_bitand_char ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
Parameters
n length of vectors
vecdata ignored
in0 left input pointer and stride
in1 right input pointer and stride
out output pointer and stride
36.83.2.36 void jit_op_vector_bitand_long ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
36.83.2.37 void jit_op_vector_bitnot_char ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1, t_jit_op_info
∗ out )
36.83.2.38 void jit_op_vector_bitnot_long ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1, t_jit_op_info
∗ out )
36.83.2.39 void jit_op_vector_bitor_char ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1, t_jit_op_info
∗ out )
Parameters
n length of vectors
vecdata ignored
in0 left input pointer and stride
in1 right input pointer and stride
out output pointer and stride
36.83.2.40 void jit_op_vector_bitor_long ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1, t_jit_op_info
∗ out )
36.83.2.41 void jit_op_vector_bitxor_char ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1, t_jit_op_info
∗ out )
36.83.2.42 void jit_op_vector_bitxor_long ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1, t_jit_op_info
∗ out )
36.83.2.43 void jit_op_vector_ceil_float32 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1, t_jit_op_info
∗ out )
Parameters
n length of vectors
vecdata ignored
in0 left input pointer and stride
in1 right input pointer and stride
out output pointer and stride
36.83.2.44 void jit_op_vector_ceil_float64 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1, t_jit_op_info
∗ out )
36.83.2.45 void jit_op_vector_cos_float32 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1, t_jit_op_info
∗ out )
36.83.2.46 void jit_op_vector_cos_float64 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1, t_jit_op_info
∗ out )
36.83.2.47 void jit_op_vector_cosh_float32 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
Parameters
n length of vectors
vecdata ignored
in0 left input pointer and stride
in1 right input pointer and stride
out output pointer and stride
36.83.2.48 void jit_op_vector_cosh_float64 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
36.83.2.49 void jit_op_vector_div_char ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1, t_jit_op_info ∗
out )
Referenced by jit_op_vector_flipdiv_char().
36.83.2.50 void jit_op_vector_div_float32 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1, t_jit_op_info
∗ out )
Referenced by jit_op_vector_flipdiv_float32().
36.83.2.51 void jit_op_vector_div_float64 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1, t_jit_op_info
∗ out )
Parameters
n length of vectors
vecdata ignored
in0 left input pointer and stride
in1 right input pointer and stride
out output pointer and stride
Referenced by jit_op_vector_flipdiv_float64().
36.83.2.52 void jit_op_vector_div_long ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1, t_jit_op_info ∗
out )
Referenced by jit_op_vector_flipdiv_long().
36.83.2.53 void jit_op_vector_eq_char ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1, t_jit_op_info ∗
out )
36.83.2.54 void jit_op_vector_eq_float32 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1, t_jit_op_info
∗ out )
36.83.2.55 void jit_op_vector_eq_float64 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1, t_jit_op_info
∗ out )
Parameters
n length of vectors
vecdata ignored
in0 left input pointer and stride
in1 right input pointer and stride
out output pointer and stride
36.83.2.56 void jit_op_vector_eq_long ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1, t_jit_op_info ∗
out )
36.83.2.57 void jit_op_vector_eqp_char ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1, t_jit_op_info
∗ out )
36.83.2.58 void jit_op_vector_eqp_float32 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
36.83.2.59 void jit_op_vector_eqp_float64 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
Parameters
n length of vectors
vecdata ignored
in0 left input pointer and stride
in1 right input pointer and stride
out output pointer and stride
36.83.2.60 void jit_op_vector_eqp_long ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1, t_jit_op_info
∗ out )
36.83.2.61 void jit_op_vector_exp2_float32 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
36.83.2.62 void jit_op_vector_exp2_float64 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
36.83.2.63 void jit_op_vector_exp_float32 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1, t_jit_op_info
∗ out )
Parameters
n length of vectors
vecdata ignored
in0 left input pointer and stride
in1 right input pointer and stride
out output pointer and stride
36.83.2.64 void jit_op_vector_exp_float64 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1, t_jit_op_info
∗ out )
36.83.2.65 void jit_op_vector_flipdiv_char ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
References jit_op_vector_div_char().
Here is the call graph for this function:
jit_op_vector_flipdiv_char jit_op_vector_div_char
36.83.2.66 void jit_op_vector_flipdiv_float32 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
Parameters
n length of vectors
vecdata ignored
in0 left input pointer and stride
in1 right input pointer and stride
out output pointer and stride
References jit_op_vector_div_float32().
Here is the call graph for this function:
jit_op_vector_flipdiv
_float32 jit_op_vector_div_float32
36.83.2.67 void jit_op_vector_flipdiv_float64 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
References jit_op_vector_div_float64().
Here is the call graph for this function:
jit_op_vector_flipdiv jit_op_vector_div_float64
_float64
36.83.2.68 void jit_op_vector_flipdiv_long ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
Parameters
n length of vectors
vecdata ignored
in0 left input pointer and stride
in1 right input pointer and stride
out output pointer and stride
References jit_op_vector_div_long().
Here is the call graph for this function:
jit_op_vector_flipdiv_long jit_op_vector_div_long
36.83.2.69 void jit_op_vector_flipmod_char ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
References jit_op_vector_mod_char().
Here is the call graph for this function:
jit_op_vector_flipmod_char jit_op_vector_mod_char
36.83.2.70 void jit_op_vector_flipmod_float32 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
Parameters
n length of vectors
vecdata ignored
in0 left input pointer and stride
in1 right input pointer and stride
out output pointer and stride
References jit_op_vector_mod_float32().
Here is the call graph for this function:
jit_op_vector_flipmod
_float32 jit_op_vector_mod_float32
36.83.2.71 void jit_op_vector_flipmod_float64 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
References jit_op_vector_mod_float64().
Here is the call graph for this function:
jit_op_vector_flipmod jit_op_vector_mod_float64
_float64
36.83.2.72 void jit_op_vector_flipmod_long ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
Parameters
n length of vectors
vecdata ignored
in0 left input pointer and stride
in1 right input pointer and stride
out output pointer and stride
References jit_op_vector_mod_long().
Here is the call graph for this function:
jit_op_vector_flipmod_long jit_op_vector_mod_long
36.83.2.73 void jit_op_vector_flippass_char ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
References jit_op_vector_pass_char().
Here is the call graph for this function:
jit_op_vector_flippass_char jit_op_vector_pass_char
36.83.2.74 void jit_op_vector_flippass_float32 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
Parameters
n length of vectors
vecdata ignored
in0 left input pointer and stride
in1 right input pointer and stride
out output pointer and stride
References jit_op_vector_pass_float32().
Here is the call graph for this function:
jit_op_vector_flippass jit_op_vector_pass
_float32 _float32
36.83.2.75 void jit_op_vector_flippass_float64 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
References jit_op_vector_pass_float64().
Here is the call graph for this function:
jit_op_vector_flippass jit_op_vector_pass
_float64 _float64
36.83.2.76 void jit_op_vector_flippass_long ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
Parameters
n length of vectors
vecdata ignored
in0 left input pointer and stride
in1 right input pointer and stride
out output pointer and stride
References jit_op_vector_pass_long().
Here is the call graph for this function:
jit_op_vector_flippass_long jit_op_vector_pass_long
36.83.2.77 void jit_op_vector_flipsub_char ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
References jit_op_vector_subs_char().
Here is the call graph for this function:
jit_op_vector_flipsub_char jit_op_vector_subs_char
36.83.2.78 void jit_op_vector_flipsub_float32 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
Parameters
n length of vectors
vecdata ignored
in0 left input pointer and stride
in1 right input pointer and stride
out output pointer and stride
References jit_op_vector_sub_float32().
Here is the call graph for this function:
jit_op_vector_flipsub jit_op_vector_sub_float32
_float32
36.83.2.79 void jit_op_vector_flipsub_long ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
References jit_op_vector_sub_long().
Here is the call graph for this function:
jit_op_vector_flipsub_long jit_op_vector_sub_long
36.83.2.80 void jit_op_vector_floor_float32 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
Parameters
n length of vectors
vecdata ignored
in0 left input pointer and stride
in1 right input pointer and stride
out output pointer and stride
36.83.2.81 void jit_op_vector_floor_float64 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
36.83.2.82 void jit_op_vector_fold_float32 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
36.83.2.83 void jit_op_vector_fold_float64 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
36.83.2.84 void jit_op_vector_gt_char ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1, t_jit_op_info ∗
out )
Parameters
n length of vectors
vecdata ignored
in0 left input pointer and stride
in1 right input pointer and stride
out output pointer and stride
36.83.2.85 void jit_op_vector_gt_float32 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1, t_jit_op_info
∗ out )
36.83.2.86 void jit_op_vector_gt_float64 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1, t_jit_op_info
∗ out )
36.83.2.87 void jit_op_vector_gt_long ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1, t_jit_op_info ∗
out )
36.83.2.88 void jit_op_vector_gte_char ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1, t_jit_op_info ∗
out )
Parameters
n length of vectors
vecdata ignored
in0 left input pointer and stride
in1 right input pointer and stride
out output pointer and stride
36.83.2.89 void jit_op_vector_gte_float32 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1, t_jit_op_info
∗ out )
36.83.2.90 void jit_op_vector_gte_float64 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1, t_jit_op_info
∗ out )
36.83.2.91 void jit_op_vector_gte_long ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1, t_jit_op_info ∗
out )
36.83.2.92 void jit_op_vector_gtep_char ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1, t_jit_op_info
∗ out )
Parameters
n length of vectors
vecdata ignored
in0 left input pointer and stride
in1 right input pointer and stride
out output pointer and stride
36.83.2.93 void jit_op_vector_gtep_float32 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
36.83.2.94 void jit_op_vector_gtep_float64 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
36.83.2.95 void jit_op_vector_gtep_long ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1, t_jit_op_info
∗ out )
36.83.2.96 void jit_op_vector_gtp_char ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1, t_jit_op_info ∗
out )
Parameters
n length of vectors
vecdata ignored
in0 left input pointer and stride
in1 right input pointer and stride
out output pointer and stride
36.83.2.97 void jit_op_vector_gtp_float32 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1, t_jit_op_info
∗ out )
36.83.2.98 void jit_op_vector_gtp_float64 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1, t_jit_op_info
∗ out )
36.83.2.99 void jit_op_vector_gtp_long ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1, t_jit_op_info ∗
out )
36.83.2.100 void jit_op_vector_hypot_float32 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
Parameters
n length of vectors
vecdata ignored
in0 left input pointer and stride
in1 right input pointer and stride
out output pointer and stride
36.83.2.101 void jit_op_vector_hypot_float64 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
36.83.2.102 void jit_op_vector_log10_float32 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
36.83.2.103 void jit_op_vector_log10_float64 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
36.83.2.104 void jit_op_vector_log2_float32 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
Parameters
n length of vectors
vecdata ignored
in0 left input pointer and stride
in1 right input pointer and stride
out output pointer and stride
36.83.2.105 void jit_op_vector_log2_float64 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
36.83.2.106 void jit_op_vector_log_float32 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
36.83.2.107 void jit_op_vector_log_float64 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
36.83.2.108 void jit_op_vector_lshift_char ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
Parameters
n length of vectors
vecdata ignored
in0 left input pointer and stride
in1 right input pointer and stride
out output pointer and stride
36.83.2.109 void jit_op_vector_lshift_long ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
36.83.2.110 void jit_op_vector_lt_char ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1, t_jit_op_info ∗
out )
36.83.2.111 void jit_op_vector_lt_float32 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1, t_jit_op_info
∗ out )
36.83.2.112 void jit_op_vector_lt_float64 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1, t_jit_op_info
∗ out )
Parameters
n length of vectors
vecdata ignored
in0 left input pointer and stride
in1 right input pointer and stride
out output pointer and stride
36.83.2.113 void jit_op_vector_lt_long ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1, t_jit_op_info ∗
out )
36.83.2.114 void jit_op_vector_lte_char ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1, t_jit_op_info ∗
out )
36.83.2.115 void jit_op_vector_lte_float32 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1, t_jit_op_info
∗ out )
36.83.2.116 void jit_op_vector_lte_float64 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1, t_jit_op_info
∗ out )
Parameters
n length of vectors
vecdata ignored
in0 left input pointer and stride
in1 right input pointer and stride
out output pointer and stride
36.83.2.117 void jit_op_vector_lte_long ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1, t_jit_op_info
∗ out )
36.83.2.118 void jit_op_vector_ltep_char ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1, t_jit_op_info
∗ out )
36.83.2.119 void jit_op_vector_ltep_float32 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
36.83.2.120 void jit_op_vector_ltep_float64 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
Parameters
n length of vectors
vecdata ignored
in0 left input pointer and stride
in1 right input pointer and stride
out output pointer and stride
36.83.2.121 void jit_op_vector_ltep_long ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1, t_jit_op_info
∗ out )
36.83.2.122 void jit_op_vector_ltp_char ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1, t_jit_op_info
∗ out )
36.83.2.123 void jit_op_vector_ltp_float32 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
36.83.2.124 void jit_op_vector_ltp_float64 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
Parameters
n length of vectors
vecdata ignored
in0 left input pointer and stride
in1 right input pointer and stride
out output pointer and stride
36.83.2.125 void jit_op_vector_ltp_long ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1, t_jit_op_info
∗ out )
36.83.2.126 void jit_op_vector_max_char ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1, t_jit_op_info
∗ out )
36.83.2.127 void jit_op_vector_max_float32 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
36.83.2.128 void jit_op_vector_max_float64 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
Parameters
n length of vectors
vecdata ignored
in0 left input pointer and stride
in1 right input pointer and stride
out output pointer and stride
36.83.2.129 void jit_op_vector_max_long ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1, t_jit_op_info
∗ out )
36.83.2.130 void jit_op_vector_min_char ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1, t_jit_op_info
∗ out )
36.83.2.131 void jit_op_vector_min_float32 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
36.83.2.132 void jit_op_vector_min_float64 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
Parameters
n length of vectors
vecdata ignored
in0 left input pointer and stride
in1 right input pointer and stride
out output pointer and stride
36.83.2.133 void jit_op_vector_min_long ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1, t_jit_op_info
∗ out )
36.83.2.134 void jit_op_vector_mod_char ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1, t_jit_op_info
∗ out )
Referenced by jit_op_vector_flipmod_char().
36.83.2.135 void jit_op_vector_mod_float32 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
Referenced by jit_op_vector_flipmod_float32().
36.83.2.136 void jit_op_vector_mod_float64 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
Parameters
n length of vectors
vecdata ignored
in0 left input pointer and stride
in1 right input pointer and stride
out output pointer and stride
Referenced by jit_op_vector_flipmod_float64().
36.83.2.137 void jit_op_vector_mod_long ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1, t_jit_op_info
∗ out )
Referenced by jit_op_vector_flipmod_long().
36.83.2.138 void jit_op_vector_mult_char ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1, t_jit_op_info
∗ out )
36.83.2.139 void jit_op_vector_mult_float32 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
36.83.2.140 void jit_op_vector_mult_float64 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
Parameters
n length of vectors
vecdata ignored
in0 left input pointer and stride
in1 right input pointer and stride
out output pointer and stride
36.83.2.141 void jit_op_vector_mult_long ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1, t_jit_op_info
∗ out )
36.83.2.142 void jit_op_vector_neq_char ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1, t_jit_op_info
∗ out )
36.83.2.143 void jit_op_vector_neq_float32 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
36.83.2.144 void jit_op_vector_neq_float64 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
Parameters
n length of vectors
vecdata ignored
in0 left input pointer and stride
in1 right input pointer and stride
out output pointer and stride
36.83.2.145 void jit_op_vector_neq_long ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1, t_jit_op_info
∗ out )
36.83.2.146 void jit_op_vector_neqp_char ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
36.83.2.147 void jit_op_vector_neqp_float32 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
36.83.2.148 void jit_op_vector_neqp_float64 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
Parameters
n length of vectors
vecdata ignored
in0 left input pointer and stride
in1 right input pointer and stride
out output pointer and stride
36.83.2.149 void jit_op_vector_neqp_long ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
36.83.2.150 void jit_op_vector_not_char ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1, t_jit_op_info
∗ out )
36.83.2.151 void jit_op_vector_not_float32 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
36.83.2.152 void jit_op_vector_not_float64 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
Parameters
n length of vectors
vecdata ignored
in0 left input pointer and stride
in1 right input pointer and stride
out output pointer and stride
36.83.2.153 void jit_op_vector_not_long ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1, t_jit_op_info
∗ out )
36.83.2.154 void jit_op_vector_or_char ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1, t_jit_op_info ∗
out )
36.83.2.155 void jit_op_vector_or_float32 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1, t_jit_op_info
∗ out )
36.83.2.156 void jit_op_vector_or_float64 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1, t_jit_op_info
∗ out )
Parameters
n length of vectors
vecdata ignored
in0 left input pointer and stride
in1 right input pointer and stride
out output pointer and stride
36.83.2.157 void jit_op_vector_or_long ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1, t_jit_op_info ∗
out )
36.83.2.158 void jit_op_vector_pass_char ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1, t_jit_op_info
∗ out )
Referenced by jit_op_vector_flippass_char().
36.83.2.159 void jit_op_vector_pass_float32 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
Referenced by jit_op_vector_flippass_float32().
36.83.2.160 void jit_op_vector_pass_float64 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
Parameters
n length of vectors
vecdata ignored
in0 left input pointer and stride
in1 right input pointer and stride
out output pointer and stride
36.83.2.161 void jit_op_vector_pass_long ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1, t_jit_op_info
∗ out )
Referenced by jit_op_vector_flippass_long().
36.83.2.162 void jit_op_vector_pow_float32 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
36.83.2.163 void jit_op_vector_pow_float64 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
36.83.2.164 void jit_op_vector_round_float32 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
Parameters
n length of vectors
vecdata ignored
in0 left input pointer and stride
in1 right input pointer and stride
out output pointer and stride
36.83.2.165 void jit_op_vector_round_float64 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
36.83.2.166 void jit_op_vector_rshift_char ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
36.83.2.167 void jit_op_vector_rshift_long ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
36.83.2.168 void jit_op_vector_sin_float32 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
Parameters
n length of vectors
vecdata ignored
in0 left input pointer and stride
in1 right input pointer and stride
out output pointer and stride
36.83.2.169 void jit_op_vector_sin_float64 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
36.83.2.170 void jit_op_vector_sinh_float32 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
36.83.2.171 void jit_op_vector_sinh_float64 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
36.83.2.172 void jit_op_vector_sqrt_float32 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
Parameters
n length of vectors
vecdata ignored
in0 left input pointer and stride
in1 right input pointer and stride
out output pointer and stride
36.83.2.173 void jit_op_vector_sqrt_float64 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
36.83.2.174 void jit_op_vector_sub_char ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1, t_jit_op_info
∗ out )
36.83.2.175 void jit_op_vector_sub_float32 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
Referenced by jit_op_vector_flipsub_float32().
36.83.2.176 void jit_op_vector_sub_float64 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
Parameters
n length of vectors
vecdata ignored
in0 left input pointer and stride
in1 right input pointer and stride
out output pointer and stride
36.83.2.177 void jit_op_vector_sub_long ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1, t_jit_op_info
∗ out )
Referenced by jit_op_vector_flipsub_long().
36.83.2.178 void jit_op_vector_subs_char ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
Referenced by jit_op_vector_flipsub_char().
36.83.2.179 void jit_op_vector_tan_float32 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
36.83.2.180 void jit_op_vector_tan_float64 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
Parameters
n length of vectors
vecdata ignored
in0 left input pointer and stride
in1 right input pointer and stride
out output pointer and stride
36.83.2.181 void jit_op_vector_tanh_float32 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
36.83.2.182 void jit_op_vector_tanh_float64 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
36.83.2.183 void jit_op_vector_trunc_float32 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
36.83.2.184 void jit_op_vector_trunc_float64 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
Parameters
n length of vectors
vecdata ignored
in0 left input pointer and stride
in1 right input pointer and stride
out output pointer and stride
36.83.2.185 void jit_op_vector_wrap_float32 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
36.83.2.186 void jit_op_vector_wrap_float64 ( long n, void ∗ vecdata, t_jit_op_info ∗ in0, t_jit_op_info ∗ in1,
t_jit_op_info ∗ out )
word
a_w
t_atom
word
a_w
t_object t_atom
ob av
t_atomarray
word
a_w
t_atom
a_argv
t_atombuf
Data Fields
• long a_argc
t_object
s_thing
ob t_symbol
type
name
t_attr
t_object
s_thing
b_obj
b_custom_error
_handler t_symbol
b_jsoundfile
b_dirty_clock
b_name
b_filename
t_buffer b_peer
Data Fields
• t_object b_obj
doesn't have any signals so it doesn't need to be pxobject
• long b_valid
flag is off during read replacement or editing operation
• float ∗ b_samples
stored with interleaved channels if multi-channel
• long b_frames
number of sample frames (each one is sizeof(float) ∗ b_nchans bytes)
• long b_nchans
number of channels
• long b_size
size of buffer in floats
• float b_sr
sampling rate of the buffer
• float b_1oversr
1 / sr
• float b_msr
sr ∗ .001
• float ∗ b_memory
pointer to where memory starts (initial padding for interp)
• t_symbol ∗ b_name
name of the buffer
• long b_susloopstart
looping info (from AIFF file) in samples
• long b_susloopend
used to return error numbers to a caller if this object is embedded inside of another object (e.g. playlist∼)
used to move buffer dirty notifications to the main thread
t_object
s_thing
t_symbol
b_name
t_buffer_info
Data Fields
• t_symbol ∗ b_name
name of the buffer
• float ∗ b_samples
stored with interleaved channels if multi-channel
• long b_frames
number of sample frames (each one is sizeof(float) ∗ b_nchans bytes)
• long b_nchans
number of channels
• long b_size
size of buffer in floats
• float b_sr
sampling rate of the buffer
• long b_modtime
last modified time ("dirty" method)
• long b_rfu [57]
reserved for future use (total struct size is 64x4 = 256 bytes)
t_object
ob
t_charset_converter
t_messlist
c_messlist
c_newmess
t_class
Data Fields
Data Fields
• t_uint32 year
year
• t_uint32 month
month
• t_uint32 day
day
• t_uint32 hour
hour
• t_uint32 minute
minute
• t_uint32 second
second
• t_uint32 millisecond
(reserved for future use)
t_object
thing
ob t_llelem
head
tail
ob
pending
cache
d_obj t_linklist
slots
t_hashtab d_linklist
d_hashtab
t_dictionary
See also
t_dictionary
A dictionary entry.
#include <ext_dictionary.h>
Collaboration diagram for t_dictionary_entry:
t_object word
s_thing a_w
e_key e_value
t_dictionary_entry
A dictionary entry.
This struct is provided for debugging convenience, but should be considered opaque and is subject to change
without notice.
See also
t_dictionary
ex_ex.
#include <ext_expr.h>
Data Fields
• union {
} ex_cont
content
• long ex_type
type of the node
ex_ex.
t_ex_ex t_object
exp_var
exp_stack exp_ob
exp_res
t_expr
Data Fields
• t_ex_ex exp_res
the result of last evaluation
Data Fields
• t_fourcc type
type (four-char-code)
• t_fourcc creator
t_object
s_thing
f_foot
f_sym
f_head
t_funbuff
Data Fields
• t_zll f_head
head of double linked list of function elements
• t_zll ∗ f_foot
foot in the door pointer for list
• long f_gotoDelta
used by goto and next
• long f_selectX
selected region start
• long f_selectW
selected region width
• t_symbol ∗ f_sym
filename
• long f_y
y-value from inlet
• char f_yvalid
flag that y has been set since x has
• char f_embed
flag for embedding funbuff values in patcher
t_object
thing
ob t_llelem
head
tail
ob pending
cache
t_linklist
slots
t_hashtab
See also
t_hashtab
A hashtab entry.
#include <ext_hashtab.h>
Collaboration diagram for t_hashtab_entry:
t_object
s_thing
ob
t_symbol
value
key
t_hashtab_entry
A hashtab entry.
This struct is provided for debugging convenience, but should be considered opaque and is subject to change
without notice.
See also
t_hashtab
An indexmap object.
#include <indexmap.h>
Collaboration diagram for t_indexmap:
t_object
thing
ob t_llelem
head
tail
ob pending
cache
m_ob t_linklist
slots
t_hashtab t_indexmap_entry
m_data2index m_index2data
t_indexmap
An indexmap object.
This struct is provided for debugging convenience, but should be considered opaque and is subject to change
without notice.
See also
t_indexmap_entry
An indexmap element.
#include <indexmap.h>
An indexmap element.
This struct is provided for debugging convenience, but should be considered opaque and is subject to change
without notice.
See also
t_indexmap
The t_jbox struct provides the header for a Max user-interface object.
#include <jpatcher_api.h>
Collaboration diagram for t_jbox:
t_object
s_thing
b_ob
b_textfield
t_rect t_symbol t_jrgba
b_patcher
b_firstin
b_id
b_patching_rect b_name
b_color
b_presentation_rect b_fontname
b_prototypename
t_jbox
The t_jbox struct provides the header for a Max user-interface object.
This struct should be considered opaque and is subject to change without notice. Do not access it's members
directly any code.
t_jrgba
d_bordercolor
d_boxfillcolor
t_jboxdrawparams
A dataview column.
#include <jdataview.h>
t_object
s_thing
c_obj
c_dv t_symbol
c_custommenuresult
c_cellmovedmsg
c_beginmsg
c_valuemsg
c_cellclickmsg
c_buttonlabel
c_insertbefore
c_label
c_celltextcolormsg
c_cellcluemsg
...
t_jcolumn
Data Fields
• t_symbol ∗ c_name
column name (hash)
• t_object ∗ c_dv
parent dataview
• int c_id
id in DataViewComponent
• long c_width
column width in pixels
• long c_maxwidth
max column width
• long c_minwidth
min column width
• char c_autosize
determine width of text column automatically (true/false)
• char c_alignment
display of text, left, right, center
• t_symbol ∗ c_font
name of font
• long c_fontsize
font size (points?)
• t_symbol ∗ c_label
heading of column
• char c_separator
separator mode
• char c_button
column has a button (true/false)
• t_symbol ∗ c_buttonlabel
text in a button
• t_symbol ∗ c_customsort
message sent to sort this column – if none, default sorting is used based on value c_numeric
• char c_overridesort
if true only the sortdata method is called, not the sort method (true/false)
• t_symbol ∗ c_custompaint
send this msg name to client to paint this column
• t_symbol ∗ c_valuemsg
message sent when a component mode cell's value changes
• t_symbol ∗ c_beginmsg
message sent when a component mode cell's value is about to start changing
• t_symbol ∗ c_endmsg
message sent when a component mode cell's value is finished changing
• t_symbol ∗ c_rowcomponentmsg
message sent to determine what kind of component should be created for each cell in a column
• t_symbol ∗ c_custommenuset
message to set a menu (for a readonly or custompaint column)
• t_symbol ∗ c_custommenuresult
message sent when an item is chosen from a custom menu
• char c_editable
can you edit the data in a cell in this column
• char c_selectable
can select the data in a cell in this column (possibly without being able to edit)
• char c_multiselectable
can you select more than one cell in this column
• char c_sortable
can you click on a column heading to sort the data
• long c_initiallysorted
if this is set to JCOLUMN_INITIALLYSORTED_FORWARDS the column is displayed with the sort triangle
• long c_maxtextlen
maximum text length: this is used to allocate a buffer to pass to gettext (but there is also a constant)
• long c_sortdirection
0 for ascending, 1 for descending
• long c_component
enum of components (check box etc.)
• char c_canselect
can select entire column
• char c_cancut
can cut/clear entire column
• char c_cancopy
can copy entire column
• char c_cancutcells
can cut a single cell (assumes "editable" or "selectable") (probably won't be implemented)
• char c_cancopycells
can copy a single cell
• char c_canpastecells
can paste into a single cell
• char c_hideable
can the column be hidden
• char c_hidden
is the column hidden (set/get)
• char c_numeric
is the data numeric (i.e., is getcellvalue implemented)
• char c_draggable
can drag the column to rearrange it
• char c_casesensitive
use case sensitive sorting (applies only to default text sorting)
• char c_showinfo
show info button for cell clue on mouse over
• void ∗ c_reference
reference for the use of the client
• double c_indentspacing
amount of space (in pixels) for one indent level
• t_symbol ∗ c_insertbefore
name of column before which this one should have been inserted (used only once)
• t_symbol ∗ c_cellcluemsg
message to send requesting clue text for a cell
• t_symbol ∗ c_celltextcolormsg
message to get the cell's text color
• t_symbol ∗ c_celltextstylemsg
message to get the cell's style and alignment
• t_symbol ∗ c_cellentermsg
message for cell enter
• t_symbol ∗ c_cellexitmsg
message for cell exit
• t_symbol ∗ c_cellmovedmsg
message for cell mouse move
• t_symbol ∗ c_cellclickmsg
message for custom cell click action
A dataview column.
Columns for a given dataview are stored in a t_hashtab and accessed by name.
t_object
s_thing thing
ob t_llelem
head
t_symbol ob tail
pending
cache
d_client
d_returnkeycolumn
d_obj t_linklist
d_sortset
d_searchcolumn
d_fontname
d_colheadercluemsg slots
d_sections
t_hashtab d_components t_jrgba
d_colorder
d_headerbgcolor
d_rowcolor1
d_columns d_selectcolor
d_id2columns d_rowcolor2
d_bordercolor
d_headertextcolor
t_jdataview
Data Fields
• t_linklist ∗ d_components
list of DataViewComponents showing this dataview
• t_object ∗ d_client
object that will be sent messages to get data to display
• t_hashtab ∗ d_columns
columns – point to t_jcolumn objects
• t_hashtab ∗ d_id2columns
columns from column IDs
• t_linklist ∗ d_colorder
current order of columns
• void ∗ d_rowmap_obsolete
no longer used
• long d_numcols
number of columns
• double d_rowheight
fixed height of a row in pixels
• char d_autoheight
height determined by font
• char d_hierarchical
does it allow hierarchical disclosure (true / false) – not implemented yet
• t_jrgba d_rowcolor1
• char d_enabledeletekey
delete key will delete selected rows
• char d_usegradient
color rows with gradient between rowcolor1 (top) and rowcolor2 (bottom)
• char d_inchange
in change flag for inspector end-change protection system
• char d_horizscrollvisible
is horizontal scroll bar visible
• char d_vertscrollvisible
is vertical scroll bar visible
• char d_scrollvisset
has the scroll visibility ever been changed since the dv was created?
• char d_overridefocus
override default focus behavior where ListBox is focused when assigning focus to the dataview
• char d_usesystemfont
use system font (true by default)
• t_object ∗ d_searchcolumn
column we ask for celltext in order to navigate the selection via the keyboard
• t_object ∗ d_returnkeycolumn
column that is sent the return key when a given row is selected
• void ∗ d_navcache
sorted list of column strings for key navigation
• char d_usecharheight
use font specified in points rather than pixels (default is pixels)
• t_linklist ∗ d_sections
list of sections
• char d_paintcellseparator
should paint a line below a cell (grayish)
• t_object ∗ d_sortset
sort col saved when dv is invisible
A structure for holding information related to how much space the rendering of a given font will use.
#include <jgraphics.h>
Data Fields
• double ascent
The ascent.
• double descent
The descent.
• double height
The hieght.
• double max_x_advance
A structure for holding information related to how much space the rendering of a given font will use.
The units for these measurements is in pixels.
t_object
s_thing
ob t_symbol
type
name
t_jit_attr
Data Fields
• t_jit_object ob
common object header
• t_symbol ∗ name
attribute name
• t_symbol ∗ type
attribute type (char, long, float32, float64, symbol, atom, or obj)
• long flags
flags for public/private get/set methods
• method get
override default get method
• method set
override default set method
• void ∗ filterget
filterobject for get method
• void ∗ filterset
filterobject for set method
• void ∗ reserved
for future use
t_object
s_thing
ob t_symbol
type
t_jit_attr_filter_clip
Data Fields
• t_jit_object ob
common object header
• t_symbol ∗ type
"type" attribute
• double scale
scaling factor; "scale" attribute
• double min
minimum vlaue; "min" attribute
• double max
maximum value; "max" attribute
• char usescale
Warning
This struct should not be accessed directly, but is provided for reference when calling Jitter attribute functions.
t_object
ob
t_jit_attr_filter_proc
Data Fields
• t_jit_object ob
common object header
• method proc
filter procedure
Warning
This struct should not be accessed directly, but is provided for reference when calling Jitter attribute functions.
t_object
s_thing
ob t_symbol
type
name
t_jit_attr_offset
Data Fields
• t_jit_object ob
common object header
• t_symbol ∗ name
attribute name
• t_symbol ∗ type
attribute type (char, long, float32, float64, symbol, atom, or obj)
• long flags
flags for public/private get/set methods
• method get
override default get method
• method set
override default set method
• void ∗ filterget
filterobject for get method
• void ∗ filterset
filterobject for set method
• void ∗ reserved
for future use
• long offset
byte offset to the attribute data
Warning
This struct should not be accessed directly, but is provided for reference. Attribute objects do not typically use
attributes themselves to access members, but rather accessor methods–i.e. use jit_object_method in place of
the jit_attr_∗ functions to access attribute state.
t_object
s_thing
ob t_symbol
type
name
t_jit_attr_offset_array
Data Fields
• t_jit_object ob
common object header
• t_symbol ∗ name
attribute name
• t_symbol ∗ type
attribute type (char, long, float32, float64, symbol, atom, or obj)
• long flags
flags for public/private get/set methods
• method get
override default get method
• method set
override default set method
• void ∗ filterget
filterobject for get method
• void ∗ filterset
filterobject for set method
• void ∗ reserved
for future use
• long offset
byte offset to the attribute data
• long size
maximum size
• long offsetcount
byte offset to the attribute count
Warning
This struct should not be accessed directly, but is provided for reference. Attribute objects do not typically use
attributes themselves to access members, but rather accessor methods–i.e. use jit_object_method in place of
the jit_attr_∗ functions to access attribute state.
t_object
s_thing
ob t_symbol
type
name
t_jit_attribute
Data Fields
• t_jit_object ob
common object header
• t_symbol ∗ name
attribute name
• t_symbol ∗ type
• long flags
• method get
• method set
• void ∗ filterget
• void ∗ filterset
• void ∗ reserved
• void ∗ data
• long size
data size
Warning
This struct should not be accessed directly, but is provided for reference. Attribute objects do not typically use
attributes themselves to access members, but rather accessor methods–i.e. use jit_object_method in place of
the jit_attr_∗ functions to access attribute state.
t_object
thing
head
tail
a_w ob
pending
cache
patcher
t_atom t_symbol t_linklist
ob
shared_context
t_wind_mouse_info t_hashtab
name
mouse_info shared_contexts
t_jit_gl_context_view
Data Fields
• t_object ob
jitter object
• long rebuild
rebuild flag
• t_jit_gl_context context
OpenGL context.
• t_symbol ∗ shared_context
shared context name
• t_wind_mouse_info mouse_info
data for mouse events
• t_wind_mousewheel_info mousewheel_info
data for mouse wheel events
• t_wind_key_info key_info
data for key events
• long canrebuild
flag for whether the context can rebuild or not
• long doublebuffer
double buffer flag
• long depthbuffer
depth buffer flag
• long stereo
active stereo flag
• t_jit_rect frame
frame of context
• long fsaa
FSAA flag.
• long sync
V-sync flag.
• long shared
Shader context flag.
• t_hashtab ∗ shared_contexts
Hashtab of shared context names.
• long idlemouse
Idlemouse flag (events on mouse move)
• long mousewheel
mosuewheel flag (events on mouse wheel)
• void ∗ target
target object we're controlled by
• long targettype
target type we're controlled by
• t_symbol ∗ name
name of the view
• long reshaping
flag for breaking cycles on reshape notification
• long ownerreshape
flag for if the owner handles reshaping the context
• t_object ∗ patcher
patcher the context view is in (if there is one)
• long freeing
in the process of freeing flag
• long creating
in the process of creating flag
• float scalefactor
scaling factor when drawing to retina display
• long allow_hi_res
allows for high resolution drawing when available
t_jit_gl_drawinfo struct used for tasks such as multi texture unit binding.
#include <jit.gl.drawinfo.h>
Data Fields
• t_jit_gl_context ctx
current t_jit_gl_context
• void ∗ ob3d
object's t_jit_ob3d pointer
• void ∗ rfu [6]
reserved for future use
t_jit_gl_drawinfo struct used for tasks such as multi texture unit binding.
t_jit_glchunk is a public structure to store one gl-command's-worth of data, in a format which can be passed easily
to glDrawRangeElements, and matrixoutput.
#include <jit.gl.chunk.h>
Collaboration diagram for t_jit_glchunk:
t_object
s_thing
m_index
m_vertex t_symbol
prim
m_vertex_name
m_index_name
t_jit_glchunk
Data Fields
• t_symbol ∗ prim
t_jit_glchunk is a public structure to store one gl-command's-worth of data, in a format which can be passed easily
to glDrawRangeElements, and matrixoutput.
t_object
s_thing
t_symbol
type
t_jit_matrix_info
Data Fields
• long size
in bytes (0xFFFFFFFF=UNKNOWN)
• t_symbol ∗ type
t_object
thing
ob t_llelem
head
ob tail
pending
cache
t_linklist
outputlist
inputlist
t_jit_mop
Data Fields
• t_jit_object ob
• void ∗ special
special data pointer for use by wrappers of various kinds (e.g. max wrapper)
• long inputcount
"inputcount" attribute
• long outputcount
"inputcount" attribute
• t_jit_linklist ∗ inputlist
• t_jit_linklist ∗ outputlist
• char caninplace
deprecated
• char adapt
"adapt" attribute
• char outputmode
"outputmode" attribute
Warning
This struct should not be accessed directly, but is provided for reference when calling Jitter attribute functions.
t_object
s_thing
ob t_symbol
types
ioname
matrixname
t_jit_mop_io
Data Fields
• t_jit_object ob
standard object header
• void ∗ special
special data pointer for use by wrappers of various kinds (e.g. max wrapper)
• t_symbol ∗ ioname
"ioname" attribute
• t_symbol ∗ matrixname
"matrixname" attribute
• void ∗ matrix
internal matrix, accessed via methods (unused in class template MOP)
• t_symbol ∗ types [JIT_MATRIX_MAX_TYPES]
"types" attribute
• long mindim [JIT_MATRIX_MAX_DIMCOUNT]
"mindim" attribute
• long maxdim [JIT_MATRIX_MAX_DIMCOUNT]
"maxdim" attribute
• long typescount
relevant to "types" attribute
• long mindimcount
"mindimcount" attribute
• long maxdimcount
"maxdimcount" attribute
• long minplanecount
"minplanecount" attribute
• long maxplanecount
"maxplanecount" attribute
• char typelink
"typelink" attribute
• char dimlink
"dimlink" attribute
• char planelink
"planelink" attribute
• method ioproc
I/O procedure, accessed via methods.
Warning
This struct should not be accessed directly, but is provided for reference when calling Jitter attribute functions.
Data Fields
• void ∗ p
base pointer (coerced to appropriate type)
• long stride
stride between elements (in type, not bytes)
Data Fields
• double xx
xx component
• double yx
yx component
• double xy
xy component
• double yy
yy component
• double x0
x translation
• double y0
y translation
Data Fields
• double red
Red component in the range [0.0, 1.0].
• double green
Green component in the range [0.0, 1.0].
• double blue
Blue component in the range [0.0, 1.0].
See also
t_jrgba
Data Fields
• double red
• double green
• double alpha
Data Fields
• GLfloat u [3]
starting point
• GLfloat v [3]
ending point
t_object
thing
ob t_llelem
head
tail
pending
cache
t_linklist
See also
t_llelem
A linklist element.
#include <ext_linklist.h>
t_object
thing
t_llelem
A linklist element.
This struct is provided for debugging convenience, but should be considered opaque and is subject to change
without notice.
See also
t_linklist
Data Fields
• long flags
flags for whether or not to use interpolation, or source/destination dimensions
• long planemap [JIT_MATRIX_MAX_PLANECOUNT]
plane mapping
• long srcdimstart [JIT_MATRIX_MAX_DIMCOUNT]
source dimension start
• long srcdimend [JIT_MATRIX_MAX_DIMCOUNT]
source dimension end
• long dstdimstart [JIT_MATRIX_MAX_DIMCOUNT]
destination dimension start
• long dstdimend [JIT_MATRIX_MAX_DIMCOUNT]
destination dimension end
A list of symbols and their corresponding methods, complete with typechecking information.
#include <ext_mess.h>
Data Fields
A list of symbols and their corresponding methods, complete with typechecking information.
The structure for the head of any object which wants to have inlets or outlets, or support attributes.
#include <ext_mess.h>
Data Fields
The structure for the head of any object which wants to have inlets or outlets, or support attributes.
A container for a path/filename pair, together with additional meta fields for special cases.
#include <ext_packages.h>
t_object
s_thing
t_symbol
name
filename
t_package_file
A container for a path/filename pair, together with additional meta fields for special cases.
t_pxobject t_object
x_obj x_patcher
x_parent
t_pfftpub
Data Fields
• t_object ∗ x_parent
parent patcher
• t_object ∗ x_patcher
patcher loaded
• struct _dspchain ∗ x_chain
dsp chain within pfft
• long x_fftsize
fft frame size
• long x_ffthop
hop between fft frames
• long x_fftoffset
n samples offset before fft is started
• long x_fftindex
current index into fft frame
• short x_fullspect
process half-spectrum (0) or full mirrored spectrum (1)?
t_object
s_thing thing
c_obj
c_dv t_symbol t_llelem ob
c_custommenuresult
c_cellmovedmsg
c_beginmsg
c_valuemsg
c_cellclickmsg head
tail
c_buttonlabel ob
pending
c_insertbefore
cache
c_label
c_celltextcolormsg
c_cellcluemsg
...
d_client
d_returnkeycolumn
t_jcolumn d_obj t_linklist
d_sortset
d_searchcolumn
d_sections
t_jrgba d_components t_hashtab
d_colorder
d_headerbgcolor
d_rowcolor1
d_selectcolor d_columns
p_col d_rowcolor2 d_id2columns
d_bordercolor
d_headertextcolor
t_jdataview
p_dv
t_privatesortrec
Data Fields
• t_jcolumn ∗ p_col
column object to sort
• char p_fwd
1 if sorting "forwards"
• t_object ∗ p_client
pointer to the client object
• t_jdataview ∗ p_dv
pointer to the dataview
Data Fields
• double x
The horizontal coordinate.
• double y
The vertical coordinate.
See also
t_rect
t_size
Data Fields
• long z_disabled
set to non-zero if this object is muted (using the pcontrol or mute∼ objects)
• short z_count
an array that indicates what inlets/outlets are connected with signals
• short z_misc
flags (bitmask) determining object behaviour, such as Z_NO_INPLACE, Z_PUT_FIRST, or Z_PUT_LAST
t_object
s_thing
b_ob
b_textfield
t_rect b_patcher t_symbol t_jrgba
b_firstin
b_id
b_patching_rect b_name
b_presentation_rect b_fontname b_color
b_prototypename
t_jbox
z_box
t_pxjbox
Data Fields
• t_jbox z_box
The box struct used by all ui objects.
• long z_disabled
set to non-zero if this object is muted (using the pcontrol or mute∼ objects)
• short z_count
an array that indicates what inlets/outlets are connected with signals
• short z_misc
flags (bitmask) determining object behaviour, such as Z_NO_INPLACE, Z_PUT_FIRST, or Z_PUT_LAST
Data Fields
• long z_disabled
set to non-zero if this object is muted (using the pcontrol or mute∼ objects)
• short z_count
• short z_misc
t_object
thing
ob t_llelem
head
ob tail
pending
cache
m_obj t_linklist
slots
t_hashtab
m_p2key
m_p1key
t_quickmap
Data Fields
• double x
The horizontal origin.
• double y
See also
t_pt
t_size
Data Fields
• long s_n
The vector size of the signal.
• t_sample ∗ s_vec
An array of buffers holding the vectors of audio.
• float s_sr
The sample rate of the signal.
Data Fields
• double width
The width.
• double height
The height.
See also
t_rect
t_pt
t_object
s_obj
t_string
The symbol.
#include <ext_mess.h>
t_object
s_thing
t_symbol
Data Fields
• char ∗ s_name
name: a c-string
The symbol.
Note: You should never manipulate the s_name field of the t_symbol directly! Doing so will corrupt Max's symbol
table. Instead, always use gensym() to get a symbol with the desired string contents for the s_name field.
t_object
s_thing
obj t_symbol
sym
t_symobject
Data Fields
• t_object obj
Max object header.
• t_symbol ∗ sym
The symbol contained by the object.
• long flags
Any user-flags you wish to set or get.
• void ∗ thing
A generic pointer for attaching additional data to the symobject.
The tiny object structure sits at the head of any object to which you may pass messages (and which you may feed
to freeobject()).
#include <ext_mess.h>
Data Fields
The tiny object structure sits at the head of any object to which you may pass messages (and which you may feed
to freeobject()).
In general, you should use t_object instead.
t_object word
s_thing a_w
t_symbol t_atom
mousesymbol mouseatoms
t_wind_mouse_info
Data Fields
Data Fields
• t_atom_long w_long
long integer
• t_atom_float w_float
32-bit float
• struct symbol ∗ w_sym
pointer to a symbol in the Max symbol table
• struct object ∗ w_obj
pointer to a t_object or other generic pointer
binbuf_getatom buffer_view
Binbufs, 344 Buffers, 446
binbuf_insert Buffers, 441
Binbufs, 344 buffer_getchannelcount, 442
binbuf_new buffer_getfilename, 443
Binbufs, 345 buffer_getframecount, 443
binbuf_set buffer_getmillisamplerate, 443
Binbufs, 345 buffer_getsamplerate, 443
binbuf_text buffer_locksamples, 444
Binbufs, 345 buffer_ref_exists, 444
binbuf_totext buffer_ref_getobject, 444
Binbufs, 346 buffer_ref_new, 444
binbuf_vinsert buffer_ref_notify, 445
Binbufs, 346 buffer_ref_set, 445
Binbufs, 343 buffer_setdirty, 445
binbuf_append, 343 buffer_setpadding, 445
binbuf_eval, 344 buffer_unlocksamples, 446
binbuf_getatom, 344 buffer_view, 446
binbuf_insert, 344 t_buffer_obj, 442
binbuf_new, 345 t_buffer_ref, 442
binbuf_set, 345 Byte Ordering, 412
binbuf_text, 345 BYTEORDER_SWAPF32, 412
binbuf_totext, 346 BYTEORDER_SWAPF64, 412
binbuf_vinsert, 346 BYTEORDER_SWAPW16, 414
readatom, 347 BYTEORDER_SWAPW32, 414
Box Layer, 646 BYTEORDER_SWAPW64, 414
jbox_end_layer, 646
CLAMP
jbox_invalidate_layer, 647
Miscellaneous, 398
jbox_paint_layer, 647 CLASS_ATTR_ACCESSORS
jbox_start_layer, 647 Attributes, 153
buffer_getchannelcount CLASS_ATTR_ADD_FLAGS
Buffers, 442 Attributes, 153
buffer_getfilename CLASS_ATTR_ALIAS
Buffers, 443 Attributes, 154
buffer_getframecount CLASS_ATTR_ATOM
Buffers, 443 Attributes, 154
buffer_getmillisamplerate CLASS_ATTR_ATOM_ARRAY
Buffers, 443 Attributes, 154
buffer_getsamplerate CLASS_ATTR_ATOM_LONG
Buffers, 443 Attributes, 154
buffer_locksamples CLASS_ATTR_ATOM_LONG_ARRAY
Buffers, 444 Attributes, 155
buffer_ref_exists CLASS_ATTR_ATOM_VARSIZE
Buffers, 444 Attributes, 155
buffer_ref_getobject CLASS_ATTR_BASIC
Buffers, 444 Attributes, 155
buffer_ref_new CLASS_ATTR_CATEGORY
Buffers, 444 Attributes, 155
buffer_ref_notify CLASS_ATTR_CHAR
Buffers, 445 Attributes, 156
buffer_ref_set CLASS_ATTR_CHAR_ARRAY
Buffers, 445 Attributes, 156
buffer_setdirty CLASS_ATTR_CHAR_VARSIZE
Buffers, 445 Attributes, 156
buffer_setpadding CLASS_ATTR_DEFAULT
Buffers, 445 Attributes, 156
buffer_unlocksamples CLASS_ATTR_DEFAULT_PAINT
Buffers, 446 Attributes, 157
CLASS_ATTR_DEFAULT_SAVE CLASS_ATTR_OBJ_VARSIZE
Attributes, 157 Attributes, 165
CLASS_ATTR_DEFAULT_SAVE_PAINT CLASS_ATTR_OBSOLETE
Attributes, 157 Attributes, 166
CLASS_ATTR_DEFAULTNAME CLASS_ATTR_ORDER
Attributes, 157 Attributes, 166
CLASS_ATTR_DEFAULTNAME_PAINT CLASS_ATTR_PAINT
Attributes, 158 Attributes, 166
CLASS_ATTR_DEFAULTNAME_SAVE CLASS_ATTR_REMOVE_FLAGS
Attributes, 158 Attributes, 166
CLASS_ATTR_DEFAULTNAME_SAVE_PAINT CLASS_ATTR_RENAMED
Attributes, 158 Attributes, 167
CLASS_ATTR_DOUBLE CLASS_ATTR_RGBA
Attributes, 159 Attributes, 167
CLASS_ATTR_DOUBLE_ARRAY CLASS_ATTR_SAVE
Attributes, 159 Attributes, 167
CLASS_ATTR_DOUBLE_VARSIZE CLASS_ATTR_SELFSAVE
Attributes, 159 Attributes, 167
CLASS_ATTR_ENUM CLASS_ATTR_STYLE
Attributes, 160 Attributes, 167
CLASS_ATTR_ENUMINDEX CLASS_ATTR_STYLE_ALIAS_COMPATIBILITY
Attributes, 160 Styles, 621
CLASS_ATTR_FILTER_CLIP CLASS_ATTR_STYLE_ALIAS_NOSAVE
Attributes, 160 Styles, 621
CLASS_ATTR_FILTER_MAX CLASS_ATTR_STYLE_ALIAS_RGBA_LEGACY
Attributes, 161 Styles, 621
CLASS_ATTR_FILTER_MIN CLASS_ATTR_STYLE_LABEL
Attributes, 161 Attributes, 168
CLASS_ATTR_FLOAT CLASS_ATTR_STYLE_RGBA
Attributes, 161 Styles, 621
CLASS_ATTR_FLOAT_ARRAY CLASS_ATTR_STYLE_RGBA_NOSAVE
Attributes, 162 Styles, 622
CLASS_ATTR_FLOAT_VARSIZE CLASS_ATTR_STYLE_RGBA_PREVIEW
Attributes, 162 Styles, 622
CLASS_ATTR_INT32 CLASS_ATTR_SYM
Attributes, 162 Attributes, 168
CLASS_ATTR_INTRODUCED CLASS_ATTR_SYM_ARRAY
Attributes, 162 Attributes, 169
CLASS_ATTR_INVISIBLE CLASS_ATTR_SYM_VARSIZE
Attributes, 163 Attributes, 169
CLASS_ATTR_LABEL CLASS_BOX
Attributes, 163 Classes, 207
CLASS_ATTR_LEGACYDEFAULT CLASS_FLAG_ALIAS
Attributes, 163 Classes, 207
CLASS_ATTR_LONG CLASS_FLAG_BOX
Attributes, 163 Classes, 207
CLASS_ATTR_LONG_ARRAY CLASS_FLAG_DO_NOT_PARSE_ATTR_ARGS
Attributes, 164 Classes, 207
CLASS_ATTR_LONG_VARSIZE CLASS_FLAG_DO_NOT_ZERO
Attributes, 164 Classes, 207
CLASS_ATTR_MAX CLASS_FLAG_NEWDICTIONARY
Attributes, 164 Classes, 207
CLASS_ATTR_MIN CLASS_FLAG_NOATTRIBUTES
Attributes, 164 Classes, 207
CLASS_ATTR_OBJ CLASS_FLAG_OBJECT_METHOD
Attributes, 165 Classes, 207
CLASS_ATTR_OBJ_ARRAY CLASS_FLAG_OWNATTRIBUTES
Attributes, 165 Classes, 207
CLASS_FLAG_PARAMETER class_addattr
Classes, 207 Classes, 207
CLASS_FLAG_POLYGLOT class_addmethod
Classes, 207 Classes, 207
CLASS_FLAG_REGISTERED class_alias
Classes, 207 Classes, 208
CLASS_FLAG_RETYPEABLE class_attr_setfill
Classes, 207 Styles, 623
CLASS_FLAG_UIOBJECT class_attr_setstyle
Classes, 207 Styles, 623
CLASS_METHOD_ATTR_PARSE class_attr_style_alias
Attributes, 169 Styles, 623
CLASS_METHOD_INTRODUCED class_attr_stylemap
Attributes, 169 Styles, 623
CLASS_METHOD_OBSOLETE class_copy
Attributes, 171 Class Module, 692
CLASS_METHOD_RENAMED class_dspinit
Attributes, 171 MSP, 438
CLASS_STICKY_ATTR class_dspinitjbox
Attributes, 171 MSP, 438
CLASS_STICKY_ATTR_CLEAR class_dumpout_wrap
Attributes, 171 Classes, 208
CLASS_STICKY_METHOD class_findbyname
Attributes, 172 Classes, 208
CLASS_STICKY_METHOD_CLEAR class_findbyname_casefree
Attributes, 172 Classes, 209
calcoffset class_free
Miscellaneous, 397 Classes, 209
charset_convert class_is_ui
Unicode, 652 Classes, 209
charset_unicodetoutf8 class_nameget
Unicode, 652 Classes, 209
charset_utf8_count class_new
Unicode, 652 Classes, 211
charset_utf8_offset class_obexoffset_get
Unicode, 653 Classes, 211
charset_utf8tounicode class_obexoffset_set
Unicode, 653 Classes, 211
Class Module, 691 class_register
class_copy, 692 Classes, 212
jit_class_addadornment, 692 class_setname
jit_class_addattr, 692 Old-Style Classes, 217
jit_class_addinterface, 694 class_subclass
jit_class_addmethod, 695 Classes, 212
jit_class_addtypedwrapper, 696 class_super_construct
jit_class_adornment_get, 696 Classes, 212
jit_class_attr_get, 697 class_time_addattr
jit_class_findbyname, 697 ITM Time Objects, 548
jit_class_free, 697 Classes, 205
jit_class_mess, 698 CLASS_BOX, 207
jit_class_method, 698 CLASS_FLAG_ALIAS, 207
jit_class_method_addargsafe, 698 CLASS_FLAG_BOX, 207
jit_class_method_argsafe_get, 699 CLASS_FLAG_DO_NOT_PARSE_ATTR_ARGS,
jit_class_nameget, 700 207
jit_class_new, 700 CLASS_FLAG_DO_NOT_ZERO, 207
jit_class_register, 701 CLASS_FLAG_NEWDICTIONARY, 207
jit_class_symcompare, 702 CLASS_FLAG_NOATTRIBUTES, 207
jit_class_typedwrapper_get, 702 CLASS_FLAG_OBJECT_METHOD, 207
jbox_get_nextobject jbox_set_hint
jbox, 503 jbox, 512
jbox_get_nogrow jbox_set_hintstring
jbox, 503 jbox, 512
jbox_get_object jbox_set_ignoreclick
jbox, 503 jbox, 512
jbox_get_outline jbox_set_outline
jbox, 503 jbox, 513
jbox_get_patcher jbox_set_patching_position
jbox, 505 jbox, 513
jbox_get_patching_position jbox_set_patching_rect
jbox, 505 jbox, 513
jbox_get_patching_rect jbox_set_patching_size
jbox, 505 jbox, 513
jbox_get_patching_size jbox_set_position
jbox, 505 jbox, 514
jbox_get_presentation jbox_set_presentation
jbox, 505 jbox, 514
jbox_get_presentation_position jbox_set_presentation_position
jbox, 507 jbox, 514
jbox_get_presentation_rect jbox_set_presentation_rect
jbox, 507 jbox, 514
jbox_get_presentation_size jbox_set_presentation_size
jbox, 507 jbox, 515
jbox_get_prevobject jbox_set_rect
jbox, 507 jbox, 515
jbox_get_rect_for_sym jbox_set_rect_for_sym
jbox, 508 jbox, 515
jbox_get_rect_for_view jbox_set_rect_for_view
jbox, 508 jbox, 515
jbox_get_textfield jbox_set_size
jbox, 508 jbox, 516
jbox_get_varname jbox_set_varname
jbox, 508 jbox, 516
jbox_invalidate_layer jbox_start_layer
Box Layer, 647 Box Layer, 647
jbox_new jdataview_getclient
jbox, 509 DataView, 649
jbox_notify jdataview_new
jbox, 509 DataView, 650
jbox_paint_layer jdataview_setclient
Box Layer, 647 DataView, 650
jbox_ready jfont_create
jbox, 509 JFont, 606
jbox_redraw jfont_destroy
jbox, 509 JFont, 606
jbox_set_annotation jfont_extents
jbox, 510 JFont, 606
jbox_set_background jfont_get_em_dimensions
jbox, 510 JFont, 607
jbox_set_color jfont_get_family
jbox, 510 JFont, 607
jbox_set_fontname jfont_get_font_size
jbox, 510 JFont, 607
jbox_set_fontsize jfont_get_slant
jbox, 510 JFont, 607
jbox_set_hidden jfont_get_underline
jbox, 512 JFont, 607
jfont_get_weight jgraphics_image_surface_clear
JFont, 608 JSurface, 596
jfont_getfontlist jgraphics_image_surface_create
JFont, 608 JSurface, 596
jfont_isequalto jgraphics_image_surface_create_for_data
JFont, 608 JSurface, 596
jfont_reference jgraphics_image_surface_create_from_file
JFont, 608 JSurface, 597
jfont_set_family jgraphics_image_surface_create_from_filedata
JFont, 609 JSurface, 597
jfont_set_font_size jgraphics_image_surface_create_from_resource
JFont, 609 JSurface, 597
jfont_set_slant jgraphics_image_surface_create_referenced
JFont, 609 JSurface, 598
jfont_set_underline jgraphics_image_surface_draw
JFont, 609 JSurface, 598
jfont_set_weight jgraphics_image_surface_draw_fast
JFont, 609 JSurface, 598
jfont_text_measure jgraphics_image_surface_get_height
JFont, 610 JSurface, 599
jfont_text_measuretext_wrapped jgraphics_image_surface_get_pixel
JFont, 610 JSurface, 599
jgraphics_append_path jgraphics_image_surface_get_width
JGraphics, 581 JSurface, 599
jgraphics_arc jgraphics_image_surface_scroll
JGraphics, 581 JSurface, 599
jgraphics_arc_negative jgraphics_image_surface_set_pixel
JGraphics, 582 JSurface, 600
jgraphics_attr_fillrect jgraphics_image_surface_writejpeg
Styles, 625 JSurface, 600
jgraphics_attr_setfill jgraphics_image_surface_writepng
Styles, 625 JSurface, 600
jgraphics_bubble jgraphics_line_to
JGraphics, 582 JGraphics, 585
jgraphics_clip jgraphics_matrix_init
JGraphics, 582 JGraphics Matrix Transformations, 613
jgraphics_close_path jgraphics_matrix_init_identity
JGraphics, 582 JGraphics Matrix Transformations, 613
jgraphics_copy_path jgraphics_matrix_init_rotate
JGraphics, 583 JGraphics Matrix Transformations, 613
jgraphics_create jgraphics_matrix_init_scale
JSurface, 595 JGraphics Matrix Transformations, 613
jgraphics_curve_to jgraphics_matrix_init_translate
JGraphics, 583 JGraphics Matrix Transformations, 613
jgraphics_destroy jgraphics_matrix_invert
JGraphics, 583 JGraphics Matrix Transformations, 614
jgraphics_device_to_user jgraphics_matrix_multiply
JGraphics, 583 JGraphics Matrix Transformations, 614
jgraphics_ellipse jgraphics_matrix_rotate
JGraphics, 583 JGraphics Matrix Transformations, 614
jgraphics_font_extents jgraphics_matrix_scale
JGraphics, 584 JGraphics Matrix Transformations, 614
jgraphics_get_current_point jgraphics_matrix_transform_point
JGraphics, 584 JGraphics Matrix Transformations, 614
jgraphics_get_resource_data jgraphics_matrix_translate
JSurface, 595 JGraphics Matrix Transformations, 615
jgraphics_getfiletypes jgraphics_move_to
JGraphics, 584 JGraphics, 585
jpatcher_get_bgcolor jpatcher_is_patcher
jpatcher, 482 jpatcher, 490
jpatcher_get_bghidden jpatcher_set_bgcolor
jpatcher, 482 jpatcher, 490
jpatcher_get_bglocked jpatcher_set_bghidden
jpatcher, 482 jpatcher, 490
jpatcher_get_box jpatcher_set_bglocked
jpatcher, 483 jpatcher, 490
jpatcher_get_count jpatcher_set_defrect
jpatcher, 483 jpatcher, 491
jpatcher_get_currentfileversion jpatcher_set_dirty
jpatcher, 483 jpatcher, 491
jpatcher_get_default_fontface jpatcher_set_editing_bgcolor
jpatcher, 483 jpatcher, 491
jpatcher_get_default_fontname jpatcher_set_fghidden
jpatcher, 483 jpatcher, 491
jpatcher_get_default_fontsize jpatcher_set_gridsize
jpatcher, 484 jpatcher, 492
jpatcher_get_defrect jpatcher_set_locked
jpatcher, 484 jpatcher, 492
jpatcher_get_dirty jpatcher_set_locked_bgcolor
jpatcher, 484 jpatcher, 492
jpatcher_get_editing_bgcolor jpatcher_set_presentation
jpatcher, 484 jpatcher, 492
jpatcher_get_fghidden jpatcher_set_rect
jpatcher, 485 jpatcher, 493
jpatcher_get_filename jpatcher_set_title
jpatcher, 485 jpatcher, 493
jpatcher_get_filepath jpatcher_uniqueboxname
jpatcher, 485 jpatcher, 493
jpatcher_get_fileversion jpatcherview, 522
jpatcher, 485 patcherview_canvas_to_screen, 523
jpatcher_get_firstline patcherview_findpatcherview, 523
jpatcher, 485 patcherview_get_jgraphics, 523
jpatcher_get_firstobject patcherview_get_locked, 523
jpatcher, 487 patcherview_get_nextview, 523
jpatcher_get_firstview patcherview_get_patcher, 524
jpatcher, 487 patcherview_get_presentation, 524
jpatcher_get_gridsize patcherview_get_rect, 524
jpatcher, 487 patcherview_get_topview, 524
jpatcher_get_hubholder patcherview_get_visible, 525
jpatcher, 487 patcherview_get_zoomfactor, 525
jpatcher_get_lastobject patcherview_screen_to_canvas, 525
jpatcher, 488 patcherview_set_locked, 525
jpatcher_get_locked_bgcolor patcherview_set_presentation, 525
jpatcher, 488 patcherview_set_rect, 527
jpatcher_get_name patcherview_set_visible, 527
jpatcher, 488 patcherview_set_zoomfactor, 527
jpatcher_get_parentpatcher jpatchline, 517
jpatcher, 488 jpatchline_get_box1, 517
jpatcher_get_presentation jpatchline_get_box2, 518
jpatcher, 489 jpatchline_get_color, 518
jpatcher_get_rect jpatchline_get_endpoint, 518
jpatcher, 489 jpatchline_get_hidden, 518
jpatcher_get_title jpatchline_get_inletnum, 519
jpatcher, 489 jpatchline_get_nextline, 519
jpatcher_get_toppatcher jpatchline_get_nummidpoints, 519
jpatcher, 489 jpatchline_get_outletnum, 519
max_jit_attr_get max_jit_ob3d_attach
Max Wrapper Module, 786 OB3D Module, 852
max_jit_attr_getdump max_jit_ob3d_detach
Max Wrapper Module, 786 OB3D Module, 853
max_jit_attr_set max_jit_obex_adornment_get
Max Wrapper Module, 787 Max Wrapper Module, 788
max_jit_classex_addattr max_jit_obex_attr_get
Max Wrapper Module, 787 Max Wrapper Module, 789
max_jit_classex_mop_mproc max_jit_obex_attr_set
MOP Max Wrapper Module, 824 Max Wrapper Module, 789
max_jit_classex_mop_wrap max_jit_obex_dumpout
MOP Max Wrapper Module, 824 Max Wrapper Module, 790
max_jit_classex_setup max_jit_obex_dumpout_get
Max Wrapper Module, 788 Max Wrapper Module, 790
max_jit_classex_standard_wrap max_jit_obex_dumpout_set
Max Wrapper Module, 788 Max Wrapper Module, 791
max_jit_mop_adapt_matrix_all max_jit_obex_free
MOP Max Wrapper Module, 825 Max Wrapper Module, 791
max_jit_mop_assist max_jit_obex_gimmeback
MOP Max Wrapper Module, 826 Max Wrapper Module, 791
max_jit_mop_bang max_jit_obex_gimmeback_dumpout
MOP Max Wrapper Module, 826 Max Wrapper Module, 792
max_jit_mop_clear max_jit_obex_inletnumber_get
MOP Max Wrapper Module, 827 Max Wrapper Module, 792
max_jit_mop_free max_jit_obex_inletnumber_set
MOP Max Wrapper Module, 827 Max Wrapper Module, 793
max_jit_mop_get_io_by_name max_jit_obex_jitob_get
MOP Max Wrapper Module, 828 Max Wrapper Module, 793
max_jit_mop_getinput max_jit_obex_jitob_set
MOP Max Wrapper Module, 828 Max Wrapper Module, 793
max_jit_mop_getoutput max_jit_obex_new
MOP Max Wrapper Module, 829 Max Wrapper Module, 795
max_jit_mop_getoutputmode max_jit_obex_proxy_new
MOP Max Wrapper Module, 829 Max Wrapper Module, 795
max_jit_mop_inputs max_ob3d_bang
MOP Max Wrapper Module, 830 OB3D Module, 853
max_jit_mop_jit_matrix max_ob3d_notify
MOP Max Wrapper Module, 830 OB3D Module, 854
max_jit_mop_matrix_args maxversion
MOP Max Wrapper Module, 831 Miscellaneous, 402
max_jit_mop_matrixout_new Memory Management, 383
MOP Max Wrapper Module, 832 disposhandle, 384
max_jit_mop_notify freebytes, 384
MOP Max Wrapper Module, 832 freebytes16, 386
max_jit_mop_outputmatrix getbytes, 386
MOP Max Wrapper Module, 833 getbytes16, 386
max_jit_mop_outputs growhandle, 386
MOP Max Wrapper Module, 834 MM_UNIFIED, 384
max_jit_mop_setup newhandle, 387
MOP Max Wrapper Module, 834 sysmem_copyptr, 387
max_jit_mop_setup_simple sysmem_freehandle, 387
MOP Max Wrapper Module, 835 sysmem_freeptr, 387
max_jit_mop_variable_addinputs sysmem_handlesize, 388
MOP Max Wrapper Module, 836 sysmem_lockhandle, 388
max_jit_mop_variable_addoutputs sysmem_newhandle, 388
MOP Max Wrapper Module, 836 sysmem_newhandleclear, 388
max_jit_ob3d_assist sysmem_newptr, 389
OB3D Module, 852 sysmem_newptrclear, 389
object_attr_set_xywh object_findregistered
Attributes, 198 Objects, 459
object_attr_setchar_array object_findregisteredbyptr
Attributes, 198 Objects, 459
object_attr_setcolor object_free
Attributes, 199 Objects, 461
object_attr_setdouble_array object_getmethod
Attributes, 199 Objects, 461
object_attr_setfloat object_getvalueof
Attributes, 199 Objects, 461
object_attr_setfloat_array object_method
Attributes, 200 Objects, 462
object_attr_setjrgba object_method_char
Attributes, 200 Objects, 462
object_attr_setlong object_method_char_array
Attributes, 200 Objects, 463
object_attr_setlong_array object_method_direct
Attributes, 201 Objects, 452
object_attr_setparse object_method_double
Attributes, 201 Objects, 463
object_attr_setpt object_method_double_array
Attributes, 201 Objects, 463
object_attr_setsize object_method_float
Attributes, 202 Objects, 464
object_attr_setsym object_method_float_array
Attributes, 202 Objects, 464
object_attr_setsym_array object_method_format
Attributes, 202 Objects, 464
object_attr_setvalueof object_method_long
Attributes, 203 Objects, 465
object_attr_touch object_method_long_array
Objects, 456 Objects, 465
object_attr_touch_parse object_method_obj
Objects, 456 Objects, 465
object_attr_usercanget object_method_obj_array
Attributes, 203 Objects, 467
object_attr_usercanset object_method_parse
Attributes, 203 Objects, 467
object_chuckattr object_method_sym
Attributes, 203 Objects, 467
object_class object_method_sym_array
Objects, 456 Objects, 468
object_classname object_method_typed
Objects, 458 Objects, 468
object_classname_compare object_method_typedfun
Objects, 458 Objects, 468
object_deleteattr object_new
Attributes, 204 Objects, 470
object_detach object_new_parse
Objects, 458 Attributes, 204
object_detach_byptr object_new_typed
Objects, 459 Objects, 470
object_dictionaryarg object_notify
Objects, 459 Objects, 470
object_error object_obex_dumpout
Console, 408 Objects, 472
object_error_obtrusive object_obex_lookup
Console, 409 Objects, 472
Unicode, 651
charset_convert, 652
charset_unicodetoutf8, 652
charset_utf8_count, 652
charset_utf8_offset, 653
charset_utf8tounicode, 653
User Interface, 575
vptr
MSP, 437
wind_advise
Miscellaneous, 405
wind_setcursor
Miscellaneous, 405
Windows, 430
jwind_getactive, 430
jwind_getat, 430
jwind_getcount, 430
word, 973
z_dsp_free
MSP, 440
z_dsp_setup
MSP, 440
zgetfn
Old-Style Classes, 220