mirror of
https://github.com/TriM-Organization/Musicreater.git
synced 2025-02-07 11:26:30 +08:00
6.5 KiB
6.5 KiB
MSQ 文件格式
MSQ 文件是 音·创 存储音符序列的一种格式,取自 MusicSeQuence。
MSQ 第二版
第二版的码头是 MSQ@ ,这一版中,所有的字符串以 GB18030 编码进行编解码,数值以**大端序**存储。
码头是文件前四个字节的内容,这一部分内容是可读的 ASCII 字串。因此,第二版的文件前四个字节的内容必为 MSQ@。
取 MSQ@ 是因为美式键盘上 @ 是 Shift+2 键 按下取得的,故代表 MSQ 第二版。
元信息
信息名称 | 西文代号 | 位长(多少个 0 或 1) | 支持说明 |
---|---|---|---|
音乐名称长度 | music_name_length | 6 位 | 支持数值 0~63 |
最小音量 | minimum_volume | 10 位 | 支持数值 0~1023,注意,这里每个 1 代表最小音量的 0.001 个单位,即取值是此处表示数字的千分倍 |
是否启用高精度音符时间控制 | enable_high_precision_time | 1 位 | 1 是启用,反之同理 |
总音调偏移 | music_deviation | 15 位 | 支持数值 -16383~16383,这里也是表示三位小数的,和最小音量一样。这里 15 位中的第一位(从左往右)是正负标记,若为 1 则为负数,反之为正数,后面的 14 位是数值 |
音乐名称 | music_name | 依据先前定义 | 最多可支持 31 个中文字符 或 63 个西文字符,其长度取决于先前获知的 “音乐名称长度” 的定义 |
在这一元信息中,音乐名称长度和最小音量合计共 2 字节;高精度音符时间控制启用和总音调偏移合计共 2 字节;因此,除音乐名称为任意长度,前四字节内容均为固定。
音符序列
每个序列前 4 字节为一个用以表示当前通道中音符数量的值,也就是通道音符数(notes_count)。也即是说,一个通道内的音符可以是 0~4294967295 个。
在这之后,就是这些数量的音符了,其中每个音符的信息存储方式如下
信息名称 | 西文代号 | 位长 | 支持说明 |
---|---|---|---|
乐器名称长度 | name_length | 6 位 | 支持数值 0~63 |
Midi 音高 | note_pitch | 7 位 | 支持数值 0~127 |
开始时刻 | start_tick | 17 位 | 单位 二十分之一秒,即约为 1 命令刻;支持数值 0~131071 即 109.22583 分钟 合 1.8204305 小时 |
音符持续刻数 | duration | 17 位 | 同上 |
是否作为打击乐器 | percussive | 1 位 | 1 是启用,反之同理 |
响度(力度) | velocity | 7 位 | 支持数值 0~127 |
是否启用声像位移 | is_displacement_included | 1 位 | 1 是启用,反之同理 |
时间精度提升值(非必含) | high_time_precision | 8 位 | 支持数值 0~255,若在 元信息 中启用高精度音符时间控制,则此值启用,代表音符时间控制精度偏移,此值每增加 1,则音符开始时刻向后增加 1/1250 秒 |
乐器名称 | sound_name | 依据先前定义 | 最多可支持 31 个中文字符 或 63 个西文字符,其长度取决于先前获知的 “乐器名称长度” 的定义 |
声像位移(非必含) | position_displacement | 共三个值,每个值 16 位 共 48 位 | 若前述是否启用声像位移已启用,则此值启用;三个值分别代表 x、y、z 轴上的便宜,每个值支持数值 0~65535,注意,这里每个 1 代表最小音量的 0.001 个单位,即取值是此处表示数字的千分倍 |