Wit needs a ProjectData parser for Logic and GarageBand (they share a container). Do not start from scratch, and do not start from logic2ableton.
Start here: jonkubis/LogicProFormatWriter — Python, MIT, ~4,100 LOC plus a ~1,000-line PROJECTDATA_FORMAT.md. It writes valid .logicx from scratch, which is strictly harder than reading, and it ships 30 real Logic 11.2.2 fixtures.
Its spec already documents the root frame (24-byte header, LE u32 length at +0x10), the universal 36-byte record header with size at +0x1c, the reversed-FourCC tag table, tempo encoding, and — critically — track names, which other projects list as unsolved.
The task
Write a read-only ProjectData walker in experiments/ that:
- Walks records via the 36-byte header (never by scanning for magic signatures — see below).
- Emits a per-tag record census.
- Extracts track and region names.
- Runs against both a Logic
.logicx and a GarageBand .band, proving one parser serves both.
Two traps, both documented in docs/FORMATS.md
- Never scan for magic signatures.
logic2ableton recovers zero MIDI notes from all 30 real fixtures for exactly this reason — and even with its wrong byte corrected, a terminal flag bit inside the signature window means it structurally cannot find the last note of any region. Walk the framing.
- Two time origins at 960 PPQ. Region placements use origin 34560 (9 bars); tempo, marker and note events use 38400. Confusing them silently corrupts arrangement placement.
Also known: three consecutive saves of a real project had identical record censuses (no semantic change) yet differed in 97 and 140 bytes — a plugin-state UUID is regenerated every save. Your parser should make that detectable.
⚠️ Read-only. Copy to a scratch directory before any experiment that writes.
Wit needs a
ProjectDataparser for Logic and GarageBand (they share a container). Do not start from scratch, and do not start fromlogic2ableton.Start here:
jonkubis/LogicProFormatWriter— Python, MIT, ~4,100 LOC plus a ~1,000-linePROJECTDATA_FORMAT.md. It writes valid.logicxfrom scratch, which is strictly harder than reading, and it ships 30 real Logic 11.2.2 fixtures.Its spec already documents the root frame (24-byte header, LE
u32length at+0x10), the universal 36-byte record header with size at+0x1c, the reversed-FourCC tag table, tempo encoding, and — critically — track names, which other projects list as unsolved.The task
Write a read-only
ProjectDatawalker inexperiments/that:.logicxand a GarageBand.band, proving one parser serves both.Two traps, both documented in
docs/FORMATS.mdlogic2abletonrecovers zero MIDI notes from all 30 real fixtures for exactly this reason — and even with its wrong byte corrected, a terminal flag bit inside the signature window means it structurally cannot find the last note of any region. Walk the framing.Also known: three consecutive saves of a real project had identical record censuses (no semantic change) yet differed in 97 and 140 bytes — a plugin-state UUID is regenerated every save. Your parser should make that detectable.