OpenMusic [Agon and Assayag, 2002,Assayag and Agon, 2000,Déchelle, 2003] is an object-oriented visual environment for musical composition based on Common Lisp. It represents a completely different approach from other applications in this category as it is restricted only to the symbolic manipulation of musical material and problems such as performance and real-time processing are outside of its scope. OpenMusic deals with models and proposes a composition based on structures and relations. OpenMusic is available for most operating systems [Sarria and Diago, 2003].
OpenMusic is a continuation of Patchwork. This environment was used and valued by many composers but several limitations evidenced that it needed a major rework. First, Patchwork was the result of numerous incremental improvements and it was difficult to maintain. Also, Patchwork was centered around the patch editor window where functional modules could be connected to perform any calculation. These functions were made available as standard kernel boxes, as standard Common Lisp functions, as parts of user-libraries, or could be directly programmed by the user in Common Lisp. But the main problem was that it was extremely difficult to collect information from one patch to use in another.
OpenMusic aims at improving the patches relationships, to dynamically create object definitions, to facilitate communication between different forms of the same musical structure and to place all this into an easy editable temporal context. The other problem of relations between patches is solved with the Maquette Editor (see below).
A program (patch) is a graphical layout on the screen. This layout is made of simple frames or composed frames, which contain simple frames or are empty. All the computing objects in OpenMusic are represented as simple or composed frames and several different frames can be produced for the same object. A simple frame representing an object is called object view and generally appear as icons. Composed frames representing an object are called object containers and generally provide a graphical editor for the object. The container for a class is an ordered collection of simple frames representing slots. Slots have information about their name, type, a default value, and a flag that indicates if the slot is public or private.
Users can create instances of a class with the aid of a particular box called a factory. They can also create new methods or modify existing ones. In the same way users can create and redefine their own classes.
Instead of a simple graphical interface to CLOS, OpenMusic is regarded as an extension of CLOS with metaprogramming techniques. A protocol of generic functions applicable to all OM objects has been defined, some of them to relate classes and their graphical representation. By using metaprogramming the user can also make extensions to the OpenMusic language. The following tools are available: subclassing inside the static class definition and redefining functions in the dynamic protocol.
Open Music contains a simple musical class hierarchy. Note, Rest, Sound and Midifile derive from Simple-score-element. Voice, Measure and Group derive from Sequence. And Chord and Poly derive from Superposition.
A set of musical operators are also defined. They work on musical structures such as voices. For instance the operator fusion merges two different voices and the result is a voice that contains simultaneously the notes in both initial structures. The masking operator also operates on two voices and performs a masking effect on one of them (data voice) using the other (masking voice) as the mask.
The Maquette is an interface that allows the creation of blocks placed in spatial and/or temporal relationships. These blocks are linked to patches. The Maquette is an original concept in OM used for combining the design of high-level musical structures, arrange musical material in time, and specify musical algorithms. A Maquette editor is an editor with 2D surface with time on the x-axis on which temporal boxes are laid. Temporal boxes can reference a temporal object (object with start time and duration such as chord or voice), patches (which are not temporal objects but can deliver one as result), and another Maquette (a Maquette can be embedded in another Maquette). The user can choose to see the Maquette as a score (in traditional or graphical notation) or a set of interconnected processes.
It is also interesting to note that OpenMusic has been used as a control language for sound synthesis [Agon et al., 2000]. In this case the basic idea was not to implement synthesis engines but to handle musical structures visually and then generate low-level parameters to send to whatever engine is available.