Fortius File Formats
Preamble
The following information has been obtained by dissecting the files using a hex editor and using a tool to study how the Tacx Analyser program reads the files. There are some gaps in the information - I do not know the purpose of every byte in the file, and some of my assumptions are no doubt wrong.
If you have any information which would help me fill in these gaps, or spot any errors, I'd be grateful if you could let me know.
I only have an i-Magic trainer, not a Fortius, so this data has been obtained from files created by an i-Magic trainer running the Fortius software. In theory it should apply to files created using a Fortius trainer as well.
Introduction
Fortius Catalyst run files, program files, virtual world (VR) run files and Real Life Video (RLV) definition files share a common structure.
At the start of the file there is an 8 byte header block. This includes a number indicating the file type and the number of blocks that follow.
Each data block comprises of a 12 byte info block, followed by the data itself. The info block contains the number of data records and the size of each record.
Wherever fields have units associated with them, such as weight, distance etc., the Tacx software stores the SI unit any only converts to the Imperial system for display purposes.
Data Types
I use .NET data types throughout; the following table gives sizes and explanations of each.
| Byte | 1 | Byte |
| Char | 2 | Character (size can be 1 byte if the encoding is set to ASCII) |
| Int16 | 2 | Signed 16 bit integer |
| UInt16 | 2 | Unsigned 16 bit integer |
| Int32 | 4 | Signed 32 bit integer |
| Single | 4 | Single precision IEEE floating point number |
| UInt32 | 4 | Unsigned 32 bit integer |
| Double | 8 | Double precision IEEE floating point number |
NB 1: The use of square brackets [] after a type indicates an array of that type. For example, Char[] is an array of char.
NB 2: Note that the size of the Char type depends on the encoding being used; in Fortius files this is always unicode, i.e. 2 bytes per character
The Header Block
An 8 byte block detailing the number of data blocks in the file, and a number indicating the type of file (i.e. whether it's a VR run file or a Catalyst one).
| FileFingerprint | 0 | 2 | | 1000 = Catalyst Program (.pgmf), 2000 = RLV (.rlv), 3000 = Catalyst Run (.caf), 4000 = VR Run (.imf) |
| FileVersion | 2 | 2 | | A 3 digit number indicating the file version, e.g. 100 or 110 |
| BlockCount | 4 | 4 | | Number of blocks in the file |
| Total | 8 | | |
Note that a file fingerprint of 2000 will not occur in an RLV run file (which is a .caf file), but only in an .rlv file.
The Info Block
A 12 byte block giving the number and size of records in the following data.
| BlockFingerprint | 0 | 2 | Int16 | Identifies the data to follow |
| BlockVersion | 2 | 2 | Int16 | A 3 digit number indicating the block version, e.g. 100 or 110 |
| RecordCount | 4 | 4 | Int32 | Number of records in the block |
| RecordSize | 8 | 4 |
Int32 | Size of each record in the block |
| Total | 12 | | |
The block fingerprints are listed below. Note that not all blocks appear in all files.
|