跳转到主要内容

目的

整理 Song 合成中容易困惑的 ScoreNote 的规范。 实现依据来自 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 管理会更利于运维。
  1. 保存自定义格式的 JSON
  2. 读入并转换为 Note / Score
  3. 传给 Voicevox::song() 生成

JSON 示例

读入并合成

相关页面

最后修改于 2026年7月18日