ACIDCAT . FILE FORMAT REFERENCE

AIFF Anatomy

Audio IFF / AIFCApple, big-endian
rev 2026.06
magic "FORM"
endian big
container IFF chunks
form AIFF / AIFC

AIFF is Apple's IFF container: a FORM header, a form type (AIFF or compressed AIFC), then chunks, all big-endian. It mirrors RIFF with the bytes flipped and COMM in place of fmt. The standout is the sample rate, stored as an 80-bit IEEE-754 extended float that Python's struct cannot unpack, reassembled by hand. Hover a field to light its bytes, click a + for its table. Color marks kind (see the key).

chunk regions

FORM wraps the lot; COMM and SSND are required, the rest optional. Big-endian sizes, word-aligned with a pad byte on odd lengths.

FORM0x00 . 12 bytes
magic"FORM"
sizeu32 BIG-endian = file size - 8
form type"AIFF" (PCM) or "AIFC" (compressed)
COMMcommon . drawn below

Channels, frame count, bit depth, and the 80-bit sample rate. AIFC adds a 4-char compression type and a pascal-string name after the rate; acidcat validates the type against its known set and warns on anything else. See the byte map below.

uncompressedNONE, twos, sowt, raw , in24/in32, 42ni/23ni, fl32/fl64: frames are real frames, duration is exact
packet-codedalaw/ulaw, ima4, MAC3/MAC6, QDMC/QDM2, Qclp: frames count packets, duration is only approximate and flagged ~
unknown 4ccsurfaced with a warning, never silently treated as PCM
SSNDsound data
offsetu32, bytes to the first frame (usually 0)
block_sizeu32, block alignment (usually 0)
audiosize - 8 - offset bytes; acidcat clamps to bytes present
MARK / INSTmarkers, instrument
MARKu16 count, then id + position + pascal-string name
INSTbase note, detune, gain, key/velocity range, sustain/release loops referencing marker ids
COMTtimestamped comments
num_commentsu16 record count
time_stampu32, seconds since the 1904 Mac epoch
markeri16 MARK id the comment annotates, 0 = none
textu16 count, then count bytes, padded to even
AESDaes3 channel status

A verbatim 24-byte AES3 channel-status block. acidcat decodes byte 0: bit 0 professional/consumer, bit 1 audio/non-audio, bits 2-4 emphasis, bits 6-7 sample rate (48000 / 44100 / 32000 / unindicated).

APPLapplication data
signature4-byte OSType naming the owning application
dataapplication-defined; "pdos" and "stoc" begin it with a pascal string naming the app/structure
bascapple loops tempo

Apple Loops metadata: version, beat count, root key, scale, time signature. No official spec; layout field-verified against indexed loops. acidcat derives bpm = beats / (frames / rate) * 60, which matched the filename bpm on every test file.

cate / trns / FLLRapple loops companions
catecategory/descriptor taxonomy (instrument, genre); summarized, not yet field-parsed
trnstransient/slice table used for time-stretching; the REX hiding inside AIFF
FLLRfiller/padding so metadata can be rewritten in place
NAME / AUTH / (c) / ANNO / ID3text + embedded tag
NAME / AUTHplain text: title, author
(c) / ANNOcopyright, annotation
ID3an embedded ID3v2 tag, same as MP3 carries
COMM chunk

18 bytes for AIFF. Example: 2 channels, 88200 frames, 16-bit, 44100 Hz.