Song 合成で迷いやすい Score と Note の仕様を整理します。
実装の根拠は Revolution\Voicevox\Song\Note / Score / SongAudioQuery のソースです。
Note クラス
Note は 1 音符(または休符)を表します。
コンストラクタ引数
フレーム長の計算
length はフレーム単位です。秒数からは次で求めます。
この値は直感的ではないため、MIDI に慣れている場合は Note::len() を使うのが実用的です。
- 4 分音符を
480 ticks として扱う前提
125 BPM がデフォルト
- 内部で
round() して整数化するため、長い曲では丸め誤差が徐々に蓄積します
Note::len() は便利ですが、長尺の楽曲では累積誤差に注意してください。必要ならセクション単位で長さを再調整します。
休符の表現
休符は次の組み合わせです。
MIDI ノート番号の目安
Score クラス
Score は Note の配列を持つ楽譜オブジェクトです。
重要ルール
最初のノートは必ず休符にしてください。
主な API
Score::make(array $notes) で生成
add(Note $note) で追記
toJson() で JSON 文字列化
Score コンストラクタは配列入力時に lyric の空文字/null を吸収する実装があり、ConvertEmptyStringsToNull ミドルウェア経由のフォーム入力でも扱いやすくなっています。
実用パターン: JSON ファイル管理(推奨)
実際のプロダクトでは、PHP に楽譜を直書きせず JSON で管理するほうが運用しやすいです。
- 独自フォーマット JSON を保存
- 読み込んで
Note / Score に変換
Voicevox::song() へ渡して生成
JSON 例
読み込みと合成
関連ページ