This spec was written partly by reading the brief reference in the Falcon docs and partly by reverse-engineering the official C++ code from the Falcon Player repo. As such it may not reflect exactly the intentions of the original author.
All numbers are encoded little endian.
| Bytes | Description |
|---|---|
| 0-3 | Magic file identifier, must be 'PSEQ' |
| 4-5 | Offset to the start of channel data |
| 6 | Minor version, should be 0 |
| 7 | Major version, should be 2 |
| 8-9 | Standard header length/index to first variable header |
| 10-13 | Channel count per frame (*) |
| 14-17 | Number of frames |
| 18 | Step time in ms, usually 25 or 50 |
| 19 | Bit flags/reserved should be 0 |
| 20 | Compression type 0 for uncompressed, 1 for zstd, 2 for libz/gzip |
| 21 | Number of compression blocks, 0 if uncompressed |
| 22 | Number of sparse ranges, 0 if none |
| 23 | Bit flags/reserved, unused right now, should be 0 |
| 24-31 | 64-bit unique identifier, likely a timestamp or uuid |
If the file is compressed, a sequence of tuples containing the compression index will follow. Multiple frames are compressed together into a single block. Each tuple contains the index of the first compressed framei in the block and its byte size. To access the frame data, look for last block with a frame number smaller than the frame you want and decompress it. Then advance the pointer N times by the number of channels in each block, where N is the difference between the frame index you want and the frame index at the start of the block.
| Bytes | Description |
|---|---|
| 0-3 | Frame number |
| 4-7 | Length of block |
After the block index, a sequence of sparse ranges follows. Each sparse range is defined by a start channel number and a number of channels.
| Bytes | Description |
|---|---|
| 0-2 | Start channel number |
| 3-5 | Number of channels |