Steinberg publishes no specification. The only public reverse-engineering work found is cbconv, an unfinished Rust program by Harald Eilertsen, whose author says the version chunk is almost fully parsed and nearly everything else is unknown. This page reports that work, and nothing beyond it.
File layout
0RIFF tag4 bytes4Size big-endian; the file’s root chunk is four bytes short4 bytes8NUND tag, with no length after it4 bytes12ROOT and ARCH pairs repeated to the end of the filevaries
All lengths and numbers are big-endian, which is unusual for a RIFF file.
cbconv describes the NUND tag as odd: it would be an ordinary chunk if a
length followed it, and the size of the root chunk comes out four bytes short.
ROOT and ARCH
The body is a sequence of pairs, each a ROOT chunk naming a value and an
ARCH chunk holding it.
| Chunk | Layout | Meaning |
|---|---|---|
ROOT | Tag, 32-bit length, two strings | A field name and its data type |
ARCH | Tag, 32-bit length, payload | The data for the preceding ROOT |
A string is a 32-bit big-endian length, then that many bytes. The string can end in a NUL, which counts in the length, and cbconv assumes UTF-8.
The two field names cbconv acts on are Version and
Arrangement1.
Nodes
Inside an ARCH payload is a series of nodes, recognised by a four-byte
marker.
| Marker | Kind | Layout after the marker |
|---|---|---|
FF FF FF FE | Container | A string name and a 16-bit number |
FF FF FF FF | Object | A string name, a 16-bit number, a 32-bit length and that many payload bytes |
The 16-bit number’s meaning is unknown to cbconv’s author.
Version chunk
In the Version chunk, the object node payload has these fields. The last
four are optional: they are read only if bytes remain.
| Field | Type | Meaning |
|---|---|---|
| App name | string | The program’s name |
| App version | string | Its version |
| App date | string | Its build date |
| Number | 32-bit | Unknown |
| App architecture | string | Optional |
| Number | 32-bit | Optional, unknown |
| App encoding | string | Optional |
| App locale | string | Optional |
Arrangement data
The song itself is in the Arrangement1 chunk. cbconv walks its nodes but
decodes none of their fields, so the layout of tracks, parts and events is not publicly
known.
The 64-bit format
Steinberg’s help says the original format was not designed for files over 2 GB, and that Cubase and Nuendo 13.0.30 and later use a 64-bit project format for projects that need it. Those files can only be opened by 13.0.30 or later, and cannot be converted back.
One report calls the 64-bit container RIF2, in place of
RIFF, but its layout is not publicly documented.
Not confirmed
- The contents of arrangement, media and other chunks, including tracks, parts, events, mixer data and plug-in state.
- The meanings of the unnamed numbers, and of the data type strings in
ROOTchunks beyond their being types. - Whether older Cubase versions wrote something else.