Containers and simple containers

In OM, every musical object is an instance of some subclass of either simple-container (atomic objects) or container (compound object).

This is the (partial) inheritance tree starting at simple-container:

.. and this is the class definitions:

  (defclas simple-container ()
    ((parent :initform nil)
     (Qvalue :initform 1)
     (QTempo :initform 60)
     (offset :initform 0)
     (extent :initform 1)))
  (defclas container (simple-container)
    ((inside :initform nil)))

The slot inside in a container stores a list of sub-containers that are either instances of container (nodes of the container tree) or simple-container (leaves of the container tree).

These sub-containers are positioned and dimensioned in time.

All the slots that give the time specification (QValue, Qtempo, offset, extent) are defined in the class simple-container (remember that a container is also a simple-container).

Subcontainers are really sub-trees of the container tree. They define a local time scale, in the following way:

  • qvalue is an integer, such that 1 / qvalue defines a rational fraction of the quarter note.
    This is the abstract time unit in which the extent is expressed
  • qtempo is an integer. Defines a tempo expressed as a frequency of the quarter note per minute (e.g. q.n. = 60).
    Gives an interpretation of Qvalue in the physical time.
  • offset is an integer.
    Time offset of the container from the beginning of its super-container. offset is expressed in the time scale defined by the qvalue slot of the super-container.
  • extent is an integer. Expresses the duration of the container, in the time scale defined by the qvalue.

The following pictures show the container tree-structure. The slots offset, qvalue and extent are drawn inside or outside the container rectangle, depending on the time scale in which they are expressed.

Using the qvalue mechanism, a local time scale can be defined at each level of the container tree. This helps maintaining complex container structures where some parts could belong to score level time scales while other could belong to audio level time scales, while still restraining to integer computation. Restraining to integer computation is very important for rhythm quantization issues.

Here is an example where we use some musical subclasses of container and simple-container:

Voice is a subclass of container. It defines a musical voice in a score. Its inside slot is a list of measure, another container. The inside slot of measures are either single notes (simple-container), chords or groups (container). Groups are groups of chords or notes that belong to a beat (e.g. three chords making a triplet).

The next picture shows the instantiation tree starting from voice. The arrows express the inside slot of the object they start from.

Here is an example of a measure:

and the instantiation tree showing the values for qvalue, offset and extent slots

Here is another example where we superpose the previous voice and an audio file which lasts 1230 ms.


openmusic/dev-resources/containers.txt · Dernière modification: 2011/01/28 18:50 par jean-admin