A .bfdlac is one drum hit for FXpansion BFD, the sampled acoustic-drum engine. The name is BFD + lac (a lossless audio codec), and the container is an IFF chunk grid — but a big-endian one, unusual for a Windows/Mac plugin. A BFDC magic and outer size, then four chunks: fmt (the audio descriptor), BFDi (a pack id), Indx (a block seek index for random access into the stream), and data (the compressed audio). Every known BFDC file is identical in shape: 24-bit, 44100 Hz, stereo. The container and the descriptor read cleanly; the lac codec itself is undocumented, so the audio stays opaque. The tabs open each chunk, drawn byte by byte from a real hit. Hover a field to light its bytes, click a field with a + for its table. Color marks kind (see the key).
BFD's sound library is enormous — thousands of hits per kit, every velocity and articulation captured — so each hit is its own small file, and it is compressed. A .bfdlac is an IFF container (magic BFDC, an outer size = file length − 8) holding four chunks in a fixed order: fmt describes the audio, BFDi tags the pack, Indx is a seek index into the compressed stream, and data is the lossless-coded audio. The hit below is a real one from BFD Crush.
.bfdlac library layout: one compressed file per hit, indexed for random-access streaming.BFDC files, uniform in structure.data chunk holds losslessly-compressed PCM at roughly 7 bits/byte — enough entropy to be clearly compressed audio, but the codec is undocumented. The region and its geometry are readable, the samples are not.BFDC chunk sizes and the fmt/Indx integers are all big-endian — the reverse of RIFF/WAV. It is an IFF-family container in the Amiga/Kurzweil tradition, a design choice, not a platform constraint. Read every multi-byte field high byte first. One place it may part from strict IFF: chunks advance by 8 + size with no even-pad byte — but every known chunk size is even, so a pad byte would be invisible here either way.Indx stores the byte offset of every 1024-sample block into the data chunk, so the player seeks straight to the block it needs. The frame count (216) is ceil(num_samples / block_size) — a checkable invariant.fmt/BFDi/Indx/data, 24-bit / 44100 Hz / stereo. That uniformity is what lets a reader trust the layout and flag any file that deviates — a truncated data, a wrong outer size — rather than guess.The file opens with the BFDC magic and a big-endian outer size = file length − 8, the IFF convention. The first chunk, fmt, is the audio descriptor: five big-endian u32s giving bit depth, an encoding tag, the frame count, the sample rate, and the channel count. Everything a decoder needs to interpret the data stream, minus the codec itself. Both maps are from a real BFD Crush hit.
Hover outer_size — 906,302, exactly the file length minus 8.
The descriptor, big-endian throughout. Hover any field to light its four bytes.
FORM, outer_size counts everything after the 8-byte magic+size pair, so it equals file length − 8. Checked against the real file length, a mismatch is a fast integrity tell for a truncated or appended file.10 — a codec/encoding id for the lac stream, not a variable. The values that could vary between packs would be the frame count and rate, yet even those are pinned: 24-bit, 44100 Hz, stereo. A file that reports anything else is worth a second look.The Indx chunk is a seek table over the compressed stream. It gives the block size (how many samples one compressed block decodes to) and the frame count (how many blocks), then a u32 offset for each block: the byte position of that block inside the data chunk. With it, the engine jumps straight to any point in the hit without decoding from the start. The map is the chunk header plus its first two table entries.
Hover frame_count — 216 = ceil(220,577 / 1024).
Indx stores those unpredictable boundaries so the decoder can start at any block. The first offset is always 0 (block 0 opens the data payload); each next entry is larger.block_size and the fmt's num_samples, the frame count must be ceil(num_samples / block_size) — here ceil(220577 / 1024) = 216. Recompute it and reject a stored count off by more than one, catching a corrupt or mis-sized index before you trust its offsets.The data chunk is the hit itself — the 24-bit stereo audio, losslessly compressed by BFD's lac codec. It is the last and by far the largest chunk (905,342 of the file's 906,310 bytes here). There is no public specification for the codec, so the payload is opaque: its position and size are known, its samples are not. The map is the chunk header and the first bytes of the stream.
The payload past the 8-byte header is the compressed stream — high-entropy, no readable structure.
data chunk yields the literal compressed stream, byte-for-byte — useful for archival or for feeding a real BFD engine, not decodable to WAV.