Jamoma API  0.6.0.a19
Introduction to the Jamoma Platform
Timothy Place, Trond Lossius, Nils Peters, Nathan Wolek

The Jamoma Platform is composed of a layered framework architecture that creates an object model and then specializes that object model for advanced purposes such as audio and matrix processing.

  • Foundation : Runtime and API implementing a light-weight, dynamically bound, reflective object-oriented architecture layer on top of C++.
  • DSP : A C++ framework for audio processing objects. Jamoma DSP is further documented in [Place2010:DSP] .
  • Graph : A coding layer for the creation of dynamic asynchronous graph topographies.
  • Audio Graph : A coding layer for the creation of dynamic audio graph topographies. AudioGraph is further documented in [Place2010:AudioGraph] .
  • Modular : A framework for assembling high-level interactive modular systems.

Jamoma makes use of polymorphic typing, dynamic binding, and introspection to create a cross-platform API pulling ideas from languages such as Smalltalk and Objective-C while remaining within the bounds of the portable and cross-platform C++ context.


For the purpose of this documentation various computer science jargon and terminology needs to be defined.

In object-oriented programming functionality related to a set of data is treated as a unit. These units, or objects, are created and then often passed using a reference or pointer to the memory in which the object's contents are stored. These objects comprise methods (or functions) and attributes (properties or data which represent part of an object's state).

Polymorphism is a means by which a programming language generalizes different types of functions or data using a common API (Application Programming Interface). An example of a polymorphic data-type of the variety in which we are interested is a `var' in the Javascript language ([Flanagan:2002]). That is to say that a variable may contain any data-type internally (including an object or array), the details of which are not necessary in order to use or pass the data type amongst functions.

Introspection refers to the ability to determine the characteristics of an object at runtime. This means that when handed a pointer in C++, we can take the pointer and query for an object's name, its type or class, the messages that it understands, the attributes it possesses, etc. By extension, reflection refers to the ability to then modify the behavior of an object at runtime ([Malenfant:1996]). In practical terms this means adding messages, changing attributes, over-riding audio processing methods, and extending existing instances of objects as the software is executing and without stopping the software to re-compile the code.

Introspection and reflection are often implemented by making use of a dynamic binding model. Programming languages such as C++ and Java link function and method calls when a program is compiled, which is known as static binding. A dynamically bound model does not link these functions at compile-time, but instead waits until a method is called at runtime to resolve its address. For this reason, we say we are `sending messages' to objects when using a dynamic binding model. Dynamic binding is the hallmark of Smalltalk ([Krasner:1988]), Objective-C ([Cox:1986]), and Ruby.