整理 Song 合成中容易困惑的 Score 与 Note 的规范。
实现依据来自 Revolution\Voicevox\Song\Note / Score / SongAudioQuery 的源码。
Note 类
Note 表示 1 个音符(或休止符)。
构造函数参数
帧长计算
length 的单位是帧。从秒数换算如下。
由于该值并不直观,如果你熟悉 MIDI,使用 Note::len() 更实用。
- 前提是将四分音符视为
480 ticks
- 默认
125 BPM
- 内部通过
round() 取整,因此长曲子中会逐渐累积舍入误差
Note::len() 虽然方便,但在长曲子中请注意累积误差。必要时可以按段落重新调整长度。
休止符的表示
休止符通过以下组合表示。
MIDI 音符编号参考
Score 类
Score 是持有 Note 数组的乐谱对象。
重要规则
第一个 note 必须是休止符。
主要 API
- 通过
Score::make(array $notes) 生成
- 通过
add(Note $note) 追加
- 通过
toJson() 转换为 JSON 字符串
Score 构造函数在数组输入时会吸收 lyric 中的空字符串/null,因此即便是经过 ConvertEmptyStringsToNull 中间件处理的表单输入也易于处理。
实用模式:JSON 文件管理(推荐)
在实际产品中,与其把乐谱直接写在 PHP 里,用 JSON 管理会更利于运维。
- 保存自定义格式的 JSON
- 读入并转换为
Note / Score
- 传给
Voicevox::song() 生成
JSON 示例
读入并合成
相关页面