Files
soundcraft/docs/file-format-parity.md
T
Dylan M. Taylor 91952090ec Take audio file formats from craft-audio; remove crates/audio-io (#1506)
craft-audio in craft-libs was built from audio-io and FilmCraft's codecs, so
each format has one implementation that every Craft app shares. Call sites use
its API directly: EncodeOptions::new(format).with_*(), EncodeFormat,
DECODE_EXTENSIONS, ENCODE_EXTENSIONS, encode_format_for, AudioInfo's container,
codec and layout.

soundcraft_model::FileFormat stays as the kind of file a session records for
each source: its variant names are part of the session format. It maps from
craft-audio's AudioInfo.

craft-audio and craft-media are pinned to the craft-libs branch of
storytold/craft-libs#824, which adds the extension tables SoundCraft had in
FileFormat and fixes the quadratic WAV chunk scan (#893).

Behaviour that changes: AAC, ALAC, Opus, AC-3/E-AC-3 and MP2 decode with
craft-audio's own decoders; MP4 and Matroska tracks import at their
presentation length; .opus, .ac3, .eac3, .ec3, .mov, .mka and .mpa are
importable names; .aifc is a writable name; FLAC files come from craft-audio's
encoder.
2026-11-11 18:46:56 -05:00

6.3 KiB
Raw Blame History

File-format parity

Last reviewed: 2026-10-19 · Last updated: 2026-11-11 · Change: minor (audio formats come from craft-audio; previously trivial: bounces carry a BWF time reference, #1296) · Target: Avid Pro Tools Ultimate 2026.4.1

Every format Pro Tools reads or writes, and ours. The Pro Tools list comes from the document types its bundle declares (CFBundleDocumentTypes in Info.plist: names only, nothing else read) and its documented import/bounce options. Ours comes from craft-audio in craft-libs (DECODE_EXTENSIONS, ENCODE_EXTENSIONS, detect_container, decode), crates/engine/src/cmd/file.rs, crates/engine/src/score.rs, crates/engine/src/clip_group_file.rs and crates/video.

File formats: ~40 % ready (estimated: weighted by how often a Pro Tools user hits each row; session interchange carries a third of the weight and is at 0 %). Remaining ≈ 70–120 h.

Legend: ✅ supported and tested · 🟡 partial · ❌ missing · — not applicable.

Sessions and interchange

Format Pro Tools Read Write Tests / notes
Pro Tools session .ptx (and .ptf from 7–9) native ❌ ❌ Proprietary, undocumented. Owner decision needed on black-box format study (G-03)
Session templates .ptxt read/write ❌ ❌ We have no templates at all (G-16)
AAF (Advanced Authoring Format) import/export ❌ ❌ #40. The post-production handoff from picture editors (G-03)
OMF import/export ❌ ❌ Legacy, still delivered by some editors
Media Composer–compatible session export ❌ ❌ AAF variant
ADM BWF (Dolby Atmos master) import/export ❌ ❌ G-12
SoundCraft session .scraft + Audio Files/ — ✅ ✅ JSON (serde); mutated-file property test loads or fails cleanly; plugin state embedded. Fades save optional curvature (-1..1); missing values default to 0 and preserve legacy envelopes
Import Session Data (from another session) Pro Tools sessions 🟡 — From .scraft only
Session info as text export — ✅ file.export_session_text
Clip groups .rgrp / ours .scgrp read/write 🟡 🟡 Our own .scgrp format; Pro Tools' clip-group files not read
Track presets, fade presets, I/O settings, workspace, sync settings read/write ❌ ❌ Their equivalents don't exist yet (G-16)

Audio

Format Pro Tools Read Write Tests / notes
WAV / BWF (PCM 16/24/32, float 32), bext native ✅ ✅ Native reader/writer, TPDF dither option; Float32 retains finite headroom (#791); also 8-bit and float 64 read. An empty data chunk followed by metadata reads as no audio; an unfinalised recording's audio is still read (#466). WAV bounces (mix and stems) carry a bext TimeReference: the session's timecode start plus the bounce start (#1296).
RF64 / BW64 (> 4 GiB) read/write ✅ ✅ Written above 4 GiB (EncodeOptions::with_force_rf64 below it)
WAV WAVE_FORMAT_EXTENSIBLE multichannel with channel mask read/write ✅ ✅ EncodeOptions::with_layout; default 5.1 import creates a stereo track (#89, PR #128)
AIFF / AIFF-C native ✅ ✅ (fl32) Native; fl32 retains finite headroom (#791)
FLAC import ✅ (symphonia) ✅ craft-audio's encoder
MP3 import, bounce ✅ (symphonia) ❌ G-21
AAC / M4A / MP4 audio import, bounce ✅ ❌ craft-audio's AAC-LC decoder; HE-AAC decodes its AAC-LC core only. MP4 and Matroska tracks import at their presentation length (edit list applied). G-21
ALAC import ✅ ❌
Ogg Vorbis — ✅ (symphonia) ❌ Beyond Pro Tools
Opus (Ogg, WebM, MP4), AC-3 / E-AC-3, MP1 / MP2 — ✅ ❌ craft-audio's decoders; E-AC-3 7.1 imports as its 5.1 downmix
CAF — ✅ (symphonia) ❌
Sound Designer / SD II import (legacy) ❌ — Rare today
ReCycle / REX import ❌ — Loops
MXF audio (OP-Atom, OP1a) import ❌ ❌ Avid media; FilmCraft has an MXF reader to learn from
iXML / polyphonic field-recorder metadata read ❌ ❌ G-17
Peak overviews .wfm cache ✅ (own, in memory) — craft_audio::peaks; not cached on disk

MIDI and notation

Format Pro Tools Read Write Tests / notes
Standard MIDI File (type 0/1) import/export ✅ 🟡 Exported MIDI omits imported controllers and ignores the tracks filter (#87, #98; PR #125)
MusicXML (to Sibelius) export — ✅ file.export_sibelius, score.rs
Printable score print — ✅ (SVG)

Video

Format Pro Tools Read Write Tests / notes
QuickTime / MP4, H.264 import, bounce ✅ ❌ Own pure-Rust decoder (Baseline/Main/High); mutated-movie fuzzing
ProRes (all flavours) import ✅ ❌ Own decoder
Motion JPEG import ✅ ❌
HEVC, AV1 import ❌ ❌ G-17
DNxHD / DNxHR, MXF video import ❌ ❌ G-17
Bounce with video export — ❌ G-17

Plugin and preset files

Format Pro Tools Ours
AAX plug-ins the only format it hosts ❌ (cannot: Avid SDK licence, PACE signing)
VST3 / Audio Units / CLAP — (AAX only) ✅ hosted (ahead of Pro Tools)
Plug-in settings .tfx read/write ❌ (our own JSON presets per plugin)

Revision history

Date Change Summary
2026-11-11 minor Audio formats come from craft-audio (craft-libs); crates/audio-io is gone. New on import: Opus, AC-3/E-AC-3, .mov/.mka audio; AAC, ALAC and MP2 no longer go through symphonia; .aifc is a writable name
2026-11-02 trivial WAV bounces (mix and stems) write a bext TimeReference: session timecode start plus bounce start (#1296)
2026-10-19 trivial WAV and AIFF-C Float32 encoders retain finite headroom (#791); whole-file, streaming and bounce regression tests
2026-10-13 trivial WAV: empty data chunk with trailing metadata (#466)
2026-10-13 minor Fade curvature round-trips in sessions with a zero default for older files. Format version and readiness estimate unchanged
2026-10-10 major Created: format inventory against Pro Tools 2026.4.1's declared document types and import/bounce options