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 |
yes | 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. |
clip.empty |
yes | A positioned clip with no note, media, registered, opaque, or nested-sequence content. |
tempo.ramp |
yes | A continuous tempo curve between two tempo-map points. |
clip.note-velocity-quantized |
yes | A note velocity that cannot be encoded as a sounding nonzero 7-bit Standard MIDI Note On without changing value. |
tempo.value-quantized |
yes | A tempo value that cannot round-trip exactly through an integer-microseconds-per-quarter representation. |
clip.media-window |
yes | A media clip that plays a source subrange rather than the referenced asset's complete frame range. |
clip.fade-shape |
yes | A fade whose gain curve is not the linear ramp, so a format carrying only fade durations changes what the transition sounds like. |
clip.midi-expression-lane |
yes | A continuous controller stream authored alongside a clip's notes -- control change, pitch bend, channel or poly pressure, program change, or a registered or assignable parameter -- carrying its own points independently of any note. |
sequence.section-role |
yes | A region that names the structural part it spans, beyond its free-text name. |
context.chord-bass |
yes | A chord statement naming the pitch class in the bass, rather than sounding root position. |
context.chord-extension |
yes | A chord statement carrying added scale degrees beyond its quality. |
context.chord-voicing |
yes | A chord statement carrying a hint for how a generator should spread its tones. |
tuning.project |
yes | A document-wide statement of the tuning every instrument plays in. |
tuning.instrument |
yes | One instrument overriding the document-wide tuning with its own. |
modulation.modulator |
yes | A track-owned generator of modulation signal, by identity and declared kind. |
modulation.macro |
yes | A track-owned named performer control that drives parameters through modulation routes. |
modulation.route-device-param |
yes | A modulation route contributing a depth-scaled offset to a device parameter, on top of whatever base value is in force. |
modulation.route-track-mixer |
yes | A modulation route contributing a depth-scaled offset to a track's own gain or pan. |
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 |
clip.empty |
full | |
tempo.ramp |
none | not declared |
clip.note-velocity-quantized |
none | not declared |
tempo.value-quantized |
none | not declared |
clip.media-window |
none | not declared |
clip.fade-shape |
none | not declared |
clip.midi-expression-lane |
none | per-clip controller and expression streams |
sequence.section-role |
none | not declared |
context.chord-bass |
none | not declared |
context.chord-extension |
none | not declared |
context.chord-voicing |
none | not declared |
tuning.project |
none | not declared |
tuning.instrument |
none | not declared |
modulation.modulator |
none | not declared |
modulation.macro |
none | not declared |
modulation.route-device-param |
none | not declared |
modulation.route-track-mixer |
none | not declared |
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 |
drop | dropped | the writer cannot place sample-anchored clips on its beats-only lane, so the clip and its content are omitted | |
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 durations 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 |
drop | dropped | the writer does not inspect take lanes, so alternate takes are omitted | |
take.comp |
drop | dropped | the writer does not flatten comp selections, so comp segment choices are omitted | |
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 does not emit embedded media bytes, so an embedded asset is omitted | |
asset.referenced-media |
full | |||
sequence.multiple |
drop | dropped | only the root sequence is written; other sequences are dropped | |
sequence.nested |
drop | dropped | not declared | |
content.registered |
drop | dropped | the writer cannot preserve registered extension payloads, so the clip content is omitted | |
content.opaque |
drop | dropped | the writer cannot preserve opaque extension payloads, so the clip content is omitted | |
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 | |
clip.empty |
full | |||
tempo.ramp |
drop | dropped | the writer emits only its first constant tempo, so continuous tempo curves are dropped with the rest of the tempo map | |
clip.note-velocity-quantized |
full | |||
tempo.value-quantized |
full | |||
clip.media-window |
drop | dropped | the writer references the complete media asset, so a nonzero source start or partial frame count is dropped | |
clip.fade-shape |
drop | dropped | the writer emits no fade at all, so a non-linear fade curve goes with the fade it shaped | |
clip.midi-expression-lane |
drop | dropped | the writer emits clip notes without their controller streams, so authored control change, pitch bend, pressure, program change, and parameter movement are omitted | |
sequence.section-role |
drop | dropped | DAWproject arrangement markers carry a name and span but no typed structural role | |
context.chord-bass |
drop | dropped | the DAWproject chord representation carries quality and root but no bass | |
context.chord-extension |
drop | dropped | the DAWproject chord representation carries no added scale degrees | |
context.chord-voicing |
drop | dropped | the DAWproject chord representation carries no voicing hint | |
tuning.project |
drop | dropped | DAWproject has no document-wide tuning statement | |
tuning.instrument |
drop | dropped | DAWproject has no per-instrument tuning statement | |
modulation.modulator |
drop | dropped | not declared | |
modulation.macro |
drop | dropped | not declared | |
modulation.route-device-param |
drop | dropped | not declared | |
modulation.route-track-mixer |
drop | dropped | not declared |
Standard MIDI File¶
Format id smf. Writer registered: yes.
Import¶
| Concept | Level | Detail |
|---|---|---|
unknown |
none | not declared |
track.flat |
full | |
track.group |
none | not declared |
track.video |
none | not declared |
clip.musical |
partial | positions are exact when the file division divides the canonical tick grid; otherwise import reports bounded nearest-tick rounding |
clip.absolute |
none | sample-anchored clips |
clip.note |
full | |
clip.media |
none | media clips |
clip.gain |
none | not declared |
clip.fades |
none | not declared |
clip.crossfade |
none | not declared |
clip.warp |
none | not declared |
clip.launch |
none | not declared |
gap.explicit |
none | not declared |
tempo.single |
partial | tempo periods are represented as integer microseconds and may round on import |
tempo.map |
partial | tempo positions may use bounded nearest-tick rounding on non-dividing file grids, and periods are integer microseconds |
meter.single |
partial | meter positions may use bounded nearest-tick rounding on non-dividing file grids |
meter.map |
partial | time-signature changes are admitted only when they land on canonical bar boundaries |
marker |
none | arrangement markers |
timecode.origin |
none | not declared |
media.provenance |
none | not declared |
mixer.track-gain |
none | not declared |
mixer.track-pan |
none | not declared |
mixer.sends |
none | not declared |
automation.device-param |
none | automation lanes |
automation.track-gain |
none | not declared |
automation.track-pan |
none | not declared |
device.placement |
none | device chains |
device.payload |
none | not declared |
effect.timewarp |
none | not declared |
take.lane |
none | takes and comp lanes |
take.comp |
none | not declared |
track.freeze |
none | not declared |
asset.sealed-hash |
none | not declared |
asset.embedded-media |
none | not declared |
asset.referenced-media |
none | not declared |
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 | not declared |
context.groove |
none | not declared |
clip.note-modifier |
none | per-note probability, conditions, and ratchets |
clip.empty |
none | empty positioned clips |
tempo.ramp |
none | continuous tempo ramps |
clip.note-velocity-quantized |
none | not declared |
tempo.value-quantized |
none | not declared |
clip.media-window |
none | not declared |
clip.fade-shape |
none | not declared |
clip.midi-expression-lane |
none | per-clip controller and expression streams |
sequence.section-role |
none | not declared |
context.chord-bass |
none | not declared |
context.chord-extension |
none | not declared |
context.chord-voicing |
none | not declared |
tuning.project |
none | not declared |
tuning.instrument |
none | not declared |
modulation.modulator |
none | not declared |
modulation.macro |
none | not declared |
modulation.route-device-param |
none | not declared |
modulation.route-track-mixer |
none | not declared |
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 |
drop | dropped | sample-anchored clips cannot be placed on the Standard MIDI File tick grid, so the clip and its content are omitted | |
clip.note |
full | |||
clip.media |
drop | dropped | Standard MIDI Files carry MIDI events rather than audio media, so media clips are omitted | |
clip.gain |
drop | dropped | Standard MIDI Files have no per-clip gain, so authored clip gain is omitted | |
clip.fades |
drop | dropped | Standard MIDI Files have no per-clip fades, so authored fade-in and fade-out durations are omitted | |
clip.crossfade |
drop | dropped | not declared | |
clip.warp |
drop | dropped | not declared | |
clip.launch |
drop | dropped | Standard MIDI Files describe a linear arrangement, so launcher scenes are omitted | |
gap.explicit |
drop | dropped | not declared | |
tempo.single |
full | |||
tempo.map |
full | |||
meter.single |
full | |||
meter.map |
full | |||
marker |
drop | dropped | the bounded writer does not emit marker meta-events, so markers and regions are omitted | |
timecode.origin |
drop | dropped | the bounded writer does not emit a session timecode origin, so the document opens at zero | |
media.provenance |
drop | dropped | not declared | |
mixer.track-gain |
drop | dropped | the bounded writer does not lower authored track gain to MIDI controller events | |
mixer.track-pan |
drop | dropped | the bounded writer does not lower authored track pan to MIDI controller events | |
mixer.sends |
drop | dropped | not declared | |
automation.device-param |
drop | dropped | the bounded writer does not lower device automation to MIDI controller events | |
automation.track-gain |
drop | dropped | the bounded writer does not lower track-gain automation to MIDI controller events | |
automation.track-pan |
drop | dropped | the bounded writer does not lower track-pan automation to MIDI controller events | |
device.placement |
drop | dropped | device chains have no Standard MIDI File representation and are omitted | |
device.payload |
drop | dropped | not declared | |
effect.timewarp |
drop | dropped | not declared | |
take.lane |
drop | dropped | takes and comp lanes have no Standard MIDI File representation and are omitted | |
take.comp |
drop | dropped | take comp selections have no Standard MIDI File representation and are omitted | |
track.freeze |
drop | dropped | frozen audio renders have no Standard MIDI File representation and are omitted | |
asset.sealed-hash |
drop | dropped | Standard MIDI Files do not carry Pulp media identity hashes | |
asset.embedded-media |
drop | dropped | Standard MIDI Files do not embed authored media assets | |
asset.referenced-media |
drop | dropped | Standard MIDI Files do not retain external media locators | |
sequence.multiple |
drop | dropped | only the root sequence is written; other sequences are omitted | |
sequence.nested |
drop | dropped | nested sequence placements have no Standard MIDI File representation and are omitted | |
content.registered |
drop | dropped | registered extension clip content has no Standard MIDI File representation and is omitted | |
content.opaque |
drop | dropped | opaque extension clip content has no Standard MIDI File representation and is omitted | |
edit-rate.non-audio |
drop | dropped | not declared | |
context.chord-scale |
drop | dropped | the bounded writer does not emit chord or scale context | |
context.groove |
drop | dropped | the bounded writer does not apply or serialize authored groove context | |
clip.note-modifier |
degrade | clip.note |
degraded | Standard MIDI notes carry no probability, pass condition, or ratchet, so the notes play unconditionally once |
clip.empty |
drop | dropped | Standard MIDI Files have no positioned empty-clip object, so the clip is omitted | |
tempo.ramp |
degrade | tempo.map |
approximated | continuous tempo curves become discrete Set Tempo steps at the authored tempo points |
clip.note-velocity-quantized |
degrade | clip.note |
approximated | 16-bit note velocities are quantized to the nearest nonzero 7-bit Standard MIDI velocity |
tempo.value-quantized |
degrade | tempo.map |
approximated | tempo values are rounded to the nearest representable integer microseconds per quarter note |
clip.media-window |
drop | dropped | not declared | |
clip.fade-shape |
drop | dropped | Standard MIDI Files have no per-clip fades, so a non-linear fade curve is omitted with the fade it shaped | |
clip.midi-expression-lane |
drop | dropped | Pulp's Standard MIDI File writer emits note, tempo, and meter events only, so an authored controller stream is omitted and the file plays with every controller left wherever the receiving instrument already had it | |
sequence.section-role |
drop | dropped | the bounded writer emits a region's name and span but not the part it names | |
context.chord-bass |
drop | dropped | the bounded writer does not emit chord or scale context | |
context.chord-extension |
drop | dropped | the bounded writer does not emit chord or scale context | |
context.chord-voicing |
drop | dropped | the bounded writer does not emit chord or scale context | |
tuning.project |
drop | dropped | Standard MIDI Files have no document-wide tuning statement | |
tuning.instrument |
drop | dropped | Standard MIDI Files have no per-instrument tuning statement | |
modulation.modulator |
drop | dropped | not declared | |
modulation.macro |
drop | dropped | not declared | |
modulation.route-device-param |
drop | dropped | not declared | |
modulation.route-track-mixer |
drop | dropped | not declared |
Adding a format¶
- Write
core/interchange/capabilities/<format>.jsondeclaring the next stable contiguousordinal, 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.