Interchange capability matrix¶
What each interchange format can carry, per concept. The tables below are generated from the same JSON the C++ capability tables are generated from, so a row here is the behavior, not a description of it.
The world is closed. A concept a format does not list is refused on import and reported as a loss on export -- support is something a format declares, never something it gets by default.
A row changes away from none only through a decision made on the
document model's own merits. Turning rows green to widen a format's reach
is not a reason to add a model feature.
Concepts¶
| Concept | Observable in a document | Meaning |
|---|---|---|
unknown |
format-only | A construct the reader could not classify. No format lists it, so it always refuses. |
track.flat |
yes | A track holding clips directly, with no children. |
track.group |
format-only | A track that contains other tracks (folder/group/nested scope). |
track.video |
format-only | A track whose content is picture rather than audio or notes. |
clip.musical |
yes | A clip anchored to musical time (canonical ticks). |
clip.absolute |
yes | A clip anchored to absolute time (samples at a rational rate). |
clip.note |
yes | Clip content that is a set of note events. |
clip.media |
yes | Clip content that references a media asset. |
clip.gain |
yes | Per-clip gain applied to the clip's content. |
clip.fades |
yes | Per-clip fade in and fade out durations. |
clip.crossfade |
format-only | An overlap between two adjacent clips authored as one transition item. |
clip.warp |
format-only | A time-warp map deforming clip content against timeline time. |
clip.launch |
yes | Non-arrangement clip playback (scenes, launcher grids). |
gap.explicit |
format-only | A gap between clips authored as a first-class item rather than absence. |
tempo.single |
yes | One tempo governing the whole document. |
tempo.map |
yes | Tempo changing over the document at more than one point. |
meter.single |
yes | One time signature governing the whole document. |
meter.map |
yes | Time signature changing over the document at more than one point. |
marker |
yes | A named point or range on the timeline. |
timecode.origin |
yes | The wall-clock timecode the document's zero position represents. |
media.provenance |
format-only | Where a media asset came from: source timecode, reel or tape name, original locator. |
mixer.track-gain |
yes | Static per-track gain. |
mixer.track-pan |
yes | Static per-track pan position. |
mixer.sends |
format-only | Track routing to busses and auxiliary sends. |
automation.device-param |
yes | An automation lane targeting a device parameter. |
automation.track-gain |
yes | An automation lane targeting a track's gain. |
automation.track-pan |
yes | An automation lane targeting a track's pan. |
device.placement |
yes | A device occupying a slot in a track's chain, by identity. |
device.payload |
format-only | A device's type and saved parameter state. |
effect.timewarp |
format-only | An effect that remaps time rather than processing content. |
take.lane |
yes | An alternate recording lane holding takes alongside the arrangement. |
take.comp |
yes | A composite assembled by selecting segments across takes. |
track.freeze |
yes | A sealed offline render standing in for a track's live output. |
asset.sealed-hash |
yes | Media identity derived from a content hash of the actual bytes. |
asset.embedded-media |
yes | Media bytes carried inside the document package. |
asset.referenced-media |
yes | Media referenced by locator, stored outside the document. |
sequence.multiple |
yes | More than one sequence in the document. |
sequence.nested |
yes | A clip whose content is another sequence. |
content.registered |
yes | Typed extension clip content serialized through the schema registry. |
content.opaque |
yes | Uninterpreted clip content carried in a validated envelope. |
edit-rate.non-audio |
format-only | Positions at a rate that does not convert exactly to the document's rate. |
context.chord-scale |
yes | A sequence-owned lane of chord and scale statements that other items read while compiling. |
context.groove |
yes | A sequence-owned groove: a swing setting and a repeating table of per-step timing and accent that other items read while compiling. |
clip.note-modifier |
yes | Per-note playback modifiers: probability, pass condition, and ratchet. |
DAWproject¶
Format id dawproject. Writer registered: yes.
Import¶
| Concept | Level | Detail |
|---|---|---|
unknown |
none | not declared |
track.flat |
full | |
track.group |
none | nested group tracks |
track.video |
none | not declared |
clip.musical |
full | |
clip.absolute |
none | seconds-timed lanes, clips, and notes |
clip.note |
full | |
clip.media |
full | |
clip.gain |
none | per-clip gain |
clip.fades |
none | per-clip fades |
clip.crossfade |
none | not declared |
clip.warp |
none | warped clip content |
clip.launch |
none | scenes and clip-launcher content |
gap.explicit |
none | not declared |
tempo.single |
full | |
tempo.map |
none | tempo changing after bar 1 |
meter.single |
full | |
meter.map |
none | time signature changing after bar 1 |
marker |
none | arrangement markers |
timecode.origin |
none | not declared |
media.provenance |
none | not declared |
mixer.track-gain |
none | channel volume |
mixer.track-pan |
none | channel pan |
mixer.sends |
none | not declared |
automation.device-param |
none | automation lanes |
automation.track-gain |
none | volume automation lanes |
automation.track-pan |
none | pan automation lanes |
device.placement |
none | device chains |
device.payload |
none | plugin state |
effect.timewarp |
none | not declared |
take.lane |
none | not declared |
take.comp |
none | not declared |
track.freeze |
none | not declared |
asset.sealed-hash |
full | |
asset.embedded-media |
none | not declared |
asset.referenced-media |
full | package-relative locator retained verbatim; identity sealed to the resolved bytes |
sequence.multiple |
none | not declared |
sequence.nested |
none | not declared |
content.registered |
none | not declared |
content.opaque |
none | not declared |
edit-rate.non-audio |
none | not declared |
context.chord-scale |
none | chord and scale context lanes |
context.groove |
none | groove templates and swing |
clip.note-modifier |
none | per-note probability, conditions, and ratchets |
Export¶
| Concept | Level | Becomes | Loss class | Detail |
|---|---|---|---|---|
unknown |
drop | dropped | not declared | |
track.flat |
full | |||
track.group |
drop | dropped | not declared | |
track.video |
drop | dropped | not declared | |
clip.musical |
full | |||
clip.absolute |
degrade | clip.musical |
approximated | sample-anchored clips are re-expressed in beats against the tempo map; positions that are not exact land on the nearest tick |
clip.note |
full | |||
clip.media |
full | |||
clip.gain |
drop | dropped | the writer does not emit a clip gain, so an authored clip gain is dropped and the clip exports at unity | |
clip.fades |
drop | dropped | the writer does not emit clip fades, so authored fade-in and fade-out shapes are dropped and the clip exports with hard edges | |
clip.crossfade |
drop | dropped | not declared | |
clip.warp |
drop | dropped | not declared | |
clip.launch |
drop | dropped | not declared | |
gap.explicit |
drop | dropped | not declared | |
tempo.single |
full | |||
tempo.map |
drop | dropped | not declared | |
meter.single |
full | |||
meter.map |
drop | dropped | not declared | |
marker |
drop | dropped | the writer does not emit markers or regions, so every named point and range on the timeline is dropped | |
timecode.origin |
drop | dropped | the writer does not emit a session timecode origin, so the exported document starts at zero and every timecode reference shifts | |
media.provenance |
drop | dropped | not declared | |
mixer.track-gain |
drop | dropped | the writer does not emit a channel volume, so an authored track gain is dropped and the track exports at unity | |
mixer.track-pan |
drop | dropped | the writer does not emit a channel pan, so an authored track pan is dropped and the track exports centred | |
mixer.sends |
drop | dropped | not declared | |
automation.device-param |
drop | dropped | device identity does not survive without a device payload, so its automation has no target | |
automation.track-gain |
drop | dropped | a volume automation lane has no export target while channel volume itself is dropped | |
automation.track-pan |
drop | dropped | a pan automation lane has no export target while channel pan itself is dropped | |
device.placement |
drop | dropped | devices are identity-only in the document; DAWproject requires a device type to place one | |
device.payload |
drop | dropped | not declared | |
effect.timewarp |
drop | dropped | not declared | |
take.lane |
degrade | clip.media |
flattened | the active comp is flattened into arrangement clips; alternate takes are dropped |
take.comp |
degrade | clip.media |
flattened | comp segment boundaries become clip boundaries; the selection is no longer editable |
track.freeze |
drop | dropped | DAWproject has no freeze concept; the authored track is exported and the sealed render is dropped | |
asset.sealed-hash |
full | |||
asset.embedded-media |
drop | dropped | the writer references media by package-relative path and does not embed bytes, so an embedded asset is exported as a reference the receiving DAW must resolve | |
asset.referenced-media |
full | |||
sequence.multiple |
degrade | track.flat |
flattened | only the root sequence is written; other sequences are dropped |
sequence.nested |
drop | dropped | not declared | |
content.registered |
roundtrip-only | |||
content.opaque |
roundtrip-only | |||
edit-rate.non-audio |
drop | dropped | not declared | |
context.chord-scale |
drop | dropped | not declared | |
context.groove |
drop | dropped | not declared | |
clip.note-modifier |
drop | dropped | DAWproject notes carry no probability, pass condition, or ratchet; the notes are written and play unconditionally once |
Adding a format¶
- Write
core/interchange/capabilities/<format>.jsondeclaring anenumerator, adisplay_name, awriterflag, and theimportandexportrows the format supports. - Regenerate:
capability_emit.py --emit concepts|tables|docs, or let the drift gate print the diff. - Write the reader and writer in their own target, deriving every
refusal from
import_supportsand every loss from the export rows.
Nothing in core/interchange changes.