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).
FORM wraps the lot; COMM and SSND are required, the rest optional. Big-endian sizes, word-aligned with a pad byte on odd lengths.
Byte for byte the shape of a RIFF header, and the opposite byte order.
Required in AIFC, absent in plain AIFF. One u32 timestamp naming the format version; the only defined value is 0xA2805140, the Mac epoch (seconds since 1904-01-01) encoding of 23 May 1990. Readers compare it exactly.
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; the type must be checked against the known set before any decode. See the byte map below.
Two fields sit between the chunk and its samples. Skipping them is the classic AIFF bug.
A verbatim 24-byte AES3 channel-status block. Byte 0 carries: bit 0 professional/consumer, bit 1 audio/non-audio, bits 2-4 emphasis, bits 6-7 sample rate (48000 / 44100 / 32000 / unindicated).
Apple Loops metadata: version, beat count, root key, scale, time signature. No official spec; layout field-verified against indexed loops. Tempo is not stored directly: bpm = beats / (frames / rate) * 60.
The length counts the text. It does not count the byte that may follow it.
18 bytes for AIFF. Example: 2 channels, 88200 frames, 16-bit, 44100 Hz.