A Bitwig preset is not audio. It is an ASCII BtWg header, a big-endian self-describing metadata block, an opaque device tree, and, when "embed files" was on, a ZIP archive of the referenced assets. The same container backs .bwpreset, .bwclip, and .bwmodulator; everything below is field-verified against real Bitwig Studio 6.x files. Hover any field to light its exact bytes and read the decode; click a field with a + to open its table. Color marks kind (see the key).
Top to bottom, what a reader walks. The metadata a producer wants sits right behind the header, ahead of the opaque device tree and any embedded-asset zip.
All ASCII: the 4-byte magic, ten format/version digits, then a run of hex digits. Careful with the family: .bwimpulse is not this container at all, it is a plain FLAC file.
A list of key/value entries, each one self-describing: a u32-BE length and that many ASCII key bytes, then a type byte (0x08 = string), a u32-BE value length, and the value bytes. One worked entry is drawn below: device_name = "Drum Machine". The keys, in order:
revisionThe Grid and device graph: a nested CONTENTS/MODULES/N/CONTENTS/... structure holding every module in the patch. The meta block can be read without touching this tree; walking it yields module and device names in pre-order, named device parameters in raw internal units, and an addressable structure tree built from the Grid paths.
With "embed files" enabled, every referenced asset is packed into a DEFLATE ZIP embedded in the preset. Unzip it and the referenced files come back whole.
Not this container, but from the same writer: audio bounced out of Bitwig carries its own tempo trail in the WAV.