Musicreater/docs/FSQ文件格式.md

2.4 KiB

FSQ 文件格式

FSQ 文件是 音·创 库存储音符序列的一种格式,取自 Flowing Music Sequence 之名。

现在 音·创 库及其上游软件使用的是在 MSQ 第三版 的基础上进行流式的兼容性变动。

FSQ 第一版

第一版的码头是 FSQ! ,这一版中,所有的字符串皆以 GB18030 编码进行编解码,数值皆是以 大端字节序 存储的无符号整数。

码头是文件前四个字节的内容,这一部分内容是可读的 ASCII 字串。因此,这一版的文件前四个字节的内容必为 FSQ!

因为这一版本是在 MSQ 第三版的基础上演变而来的,因此取自 MSQ 码头的 MSQ! 而改作 FSQ!

文件头

FSQ 第一版的文件头是在 MSQ 第三版的文件头的基础上增加了一个占 5 字节的全曲音符总数。

也就是说,与 MSQ 第三版一致的,在这一元信息中,音乐名称长度最小音量合计共 2 字节;高精度音符时间控制启用总音调偏移合计共 2 字节;因此,除音乐名称为任意长度,前四字节内容均为固定。而最后增加 5 字节作为全曲音符总数。

音符序列

FSQ 格式不包含音符的通道信息,在读取处理时默认将同一乐器的音符视为同一通道。也就是说,仅存在一个序列。其中每个音符的信息存储方式与 MSQ 第三版一致。

音符序列的存储顺序是按照音符的开始时间进行排序的。

但是注意!有可能一个较长的音符的开始到结束时间内还包含有音符,此时如有要适配的读取器,还请继续读取直到下一个音符的开始时间大于此较长音符的结束时间。

在每 100 个音符后,插入一段 32 位的 XXHASH32 校验码,其所校验的内容为这一百个音符中每个音符的第 6 个字节彼此异或之结果,种子值为这一百个音符中每个音符的第 2 个字节的彼此异或结果。

若最后不满足 100 个音符,则不插入上述校验码。

文件校验

在所有有效数据之后,包含一个 128 位的校验值,用以标识整个文件结束的同时,验证整个文件的完整性。

该 128 位的校验值是 包括码头在内的元信息的 XXHASH64 校验值(种子值是全曲音符数) 对于前述所有 XXHASH32 校验值彼此异或的异或 所得值之 XXHASH128 校验值,以 全曲音符总数 作为种子值。