Address the code smells flagged in the .beam format spec:
- Write the project's actual sample rate on save instead of a hardcoded 48000
(add AudioProject::sample_rate()).
- Remove the vestigial RasterKeyframe.media_path field (it was only used by the
legacy ZIP loader, which now derives "media/raster/<id>.png" from the keyframe
id) and the dead buffer_path_at_time accessor. Backward-compatible: older files
carrying media_path deserialize fine (the field is ignored).
- Drop the unused SaveSettings fields auto_embed_threshold_bytes / force_embed_all
/ force_link_all; only large_media_mode was ever consulted. Un-prefix the now-used
`settings` parameter.
Update BEAM_FILE_FORMAT.md to match. The remaining notes (reserved MediaKind::Video,
exact-match version check) are design choices, left as-is.
The .beam container moved from ZIP to SQLite, but the docs/tooling still
described the old ZIP format.
- Rewrite BEAM_FILE_FORMAT.md as a normative spec of the current SQLite
container: file-magic identification, the four-table schema, the two version
numbers, the media model (kinds, packed/referenced storage, 4 MiB chunking),
derived media-id formulas, project.json top-level + key entities, save/load
semantics, the legacy-ZIP format + migration, large-media policy, conformance
and security sections, and known quirks.
- Port beam_inspector.py to read SQLite (auto-detecting container by magic,
with the legacy ZIP path preserved): a --media store view, packed/referenced
storage detection, and chunk-reassembling media extraction.
- Update beam_inspector_README.md to match.