Files
Musicreater/docs/FSQ文件格式.md

38 lines
2.4 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# FSQ 文件格式
FSQ 文件是 · 库存储音符序列的一种格式取自 **F**lowing Music **S**e**q**uence 之名
现在 · 库及其上游软件使用的是在 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 校验值 全曲音符总数 作为种子值