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 |