2.3.0,基于FSQ的完整流式音符信息传输支持。

This commit is contained in:
2025-04-11 16:31:54 +08:00
parent b4e16353ec
commit 23bf69619b
12 changed files with 847 additions and 141 deletions

View File

@ -1,3 +1,37 @@
# 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 校验值 全曲音符总数 作为种子值

View File

@ -1,12 +1,12 @@
# MSQ 文件格式
MSQ 文件是 · 存储音符序列的一种格式取自 MusicSeQuence
MSQ 文件是 · 存储音符序列的一种格式取自 **M**usic**S**e**Q**uence 类之名
现在 · 及其上游软件使用的是在 第二版 的基础上增设验功能的 MSQ 第三版
现在 · 及其上游软件使用的是在 第二版 的基础上增设验功能的 MSQ 第三版
## MSQ 第三版
第二版的码头是 `MSQ@` 这一版中所有的**字符串** _**GB18030**_ 编码进行编解码**数值****_大端序_**存储
第二版的码头是 `MSQ@` 这一版中所有的**字符串** _**GB18030**_ 编码进行编解码**数值**皆是以 _**大端字节**_ 存储的无符号整数
MSQ 第三版的码头是 `MSQ!`
@ -48,7 +48,7 @@ MSQ 第三版的码头是 `MSQ!`。
| **乐器名称** | sound_name | 依据先前定义 | 最多可支持 31 个中文字符 63 个西文字符其长度取决于先前获知的 乐器名称长度 的定义 |
| **声像位移**非必含 | position_displacement | 共三个值每个值 16 48 | 若前述**是否启用声像位移**已启用则此值启用三个值分别代表 xyz 轴上的偏移每个值支持数值 0~65535注意这里每个 1 代表最小音量的 0.001 个单位即取值是此处表示数字的千分倍 |
### 序列验
### 序列
_第三版新增_
@ -56,7 +56,7 @@ _第三版新增_
在这 128 位里 64 位是该通道音符数的 XXHASH64 校验值 3 作为种子值
64 位是整个通道全部字节串的 XXHASH64 校验值包括通道开头的音符数 该通道音符数 作为种子值
### 文件验
### 文件
_第三版新增_