Most systems in the domain use a fairly uniform data model. The main differences are in levels of support, so not all systems support, for example, nested objects, or tracks independent of channel paths. Most mainstream uses can be accomodated by supporting a subset of the features described here.
The mains constituents of the model are:
Song - This encompasses all the other objects. Despite the name, there is nothing to exclude non-musical projects such as audio mixing, soundtrack work, sound design, etc. Applications with difference terminology sometimes refer to this as a Session, Project, or Composition.
Channels - Paths. Need associations with Routing and I/O.
Tracks (non-timeline related object groupings)
Parts (timeline objects, preferably supporting recursive composition. Sometimes referred to as Regions)
Events (the basic constituents contained within a Part)
The exact API is implementation specific, but the system supports a set of object types, object properties, and method types:
OBJECT_TRACK, OBJECT_AUDIO_TRACK, OBJECT_MIDI_TRACK, OBJECT_CHAN, OBJECT_PART, OBJECT_AUDIO_PART, OBJECT_MIDI_PART, OBJECT_EVENT, OBJECT_MIDI_EVENT, OBJECT_RAW, OBJECT_STRING, OBJECT_ROUTE, OBJECT_FILE, OBJECT_LIST, OBJECT_SONG, OBJECT_TRANSPORT, OBJECT_AUTOMATION
NAME STIME LENGTH HEIGHT INSET END MUTE ARM SOLO SDEF PLAYBACK_LEVEL, PLAYBACK_PAN, PLAYBACK_DELAY_MU, PLUGIN_SELECT, PLUGIN_BYPASS, CHAN_LEVEL, CHAN_PAN, TRANSPORT_PLAY, TRANSPORT_STOP, TRANSPORT_REW, TRANSPORT_FF, TRANSPORT_REC, TRANSPORT_LOCATE, TRANSPORT_CYCLE TRANSPORT_LOCATOR AUTOMATION_PT TEMPO HISTORY
AYYI_NEW AYYI_DEL AYYI_GET AYYI_SET AYYI_LOAD AYYI_SAVE AYYI_SPLITmedia types:
AUDIO MIDI
The system is deliberately flexible and allows for the addition of new types. The implementation decides what combination of types are valid for each class, eg supporting the Tempo property for a Part isn’t normally allowed, but could conceivably be useful. Responsibility for compatibility is left to the ‘edges’.
So objects do not publish their interface at runtime. Runtime introspection is only available by trying an operation and seeing if it fails.
In addition, some other formats are standardised, such as time positions, gain formats etc.
Time format used is currently either uint32_t samples, or struct {beats, sub-beats, ticks}
It is not envisaged that application code will want to directly use the above low-level type enumerations. Library code should abstract this to conform to the normal conventions of the chosen platform.