UTAUレンダリングスクリプトについて覚書

エンジン回り弄りながら調べたことをまとめときます.
UTAU0.4系と0.2系で記述方法が異なる模様
調査は0.418で行ってます.

なお個人で解析したものであり,必ずしも正しい内容を保証するものではありません.

1.レンダリングスクリプトの場所
C:\user\<user名>\AppData\Local\Temp\utau1\temp.bat
・utauの次の番号は複数起動すると起動順に連番が降られる模様
・要は環境変数TEMPの下にフォルダが作られる模様


2.レンダリングスクリプトの概要
2.1. temp.bat
・UTAUから直接起動
・各種パラメータを変数に代入する役割
・休符分のwavtoolを起動する

2.2 temp_helper.bat
・temp.batから起動される
・temp.batで設定したパラメータをresamplerやwavtoolに送る


3.batの内容
3.1 temp.batのヘッダ
@rem project
プロジェクト名

@set loadmodule
モジュールの設定?よくわからないが実験中はずっと空欄だった

@set tempo
プロジェクトのテンポ

@set samples
サンプリングレート

@set oto
音源フォルダへのフルパス

@set tool
結合器(wavtool)のフルパス

@set resamp
伸縮器(resampler)のフルパス

@set output
temp.wavのフルパス

@set helper
temp_helper.batのパス

@set cachedir
キャッシュフォルダのパス

@set flag
プロジェクト全体に適用されるフラグ

@set env
音符のデフォルトで設定されてるデフォルトのエンベロープ

@set stp
stpの変数定義

@del "%output%" 2>nul
temp.wavの消去
"2>nul"はエラー出力をnullに出力(出さない)という事らしい

@mkdir "%cachedir%" 2>nul
キャッシュフォルダを作る.



3.2 temp.batのボディ
・休符の場合
@"%tool%" "%output%" "%oto%\R.wav" 0 480@120+0.0 0 0
wavtoolの呼び出し.
第1引数:出力ファイル

第2引数:原音の場所(休符はR.wavで認識してる模様)

第3引数:stp.休符なので0固定

第4引数:出力する長さ
 ノート長@tempo+補正値
 補正値は(先行発声)-(次のノートの先行発声)+(次のノートのオーバーラップ)

第5引数以降:エンベロープ
休符の場合:0 0  で2つ
それ以外の場合は後述

・休符以外の場合
@set params=100 0 !120 AA#5# [必須]
第1:音量

第2:モジュレーション

第3:ピッチテンポ
!tempoの書式
ここで指定したテンポで制御点の数が決まり,1拍ごとに制御点が96個
!120なら0.5秒で96個
!180なら0.333秒で96個

第4:ピッチ
2文字1組
-2048~2047までの12bitの2進数をbase64で2文字の文字列に変換し,
同じ数字の組みが続く時はランレングス圧縮してある
先のAA#5#は
AA AA AA AA AA AAの意で
[0,0,0,0,0,0]となる

時々ピッチテンポとピッチのパラメータがくっついて7ケタの英数字が入力されていることがあったが,条件も意味合いもよくわからなかった.

@set flag="g5"
フラグ
同じフラグが続く場合最初の1回しか無い模様
フラグを切るときはflag=""となってある


@set env=0 5 35 0 100 100 0 70 0 10 100 [必須]
エンベロープ
休符以外は3パターンあって
p1 p2 p3 v1 v2 v3 v4 ove
p1 p2 p3 v1 v2 v3 v4 ove p4
p1 p2 p3 v1 v2 v3 v4 ove p4 p5 v5
のいずれか

@set stp=150
stp値
これも必須ではなくフラグと同じく値が変わる時だけ

@set vel=100【必須】
子音速度

@set temp="%cachedir%\1_あ_C4_OkgOOW.wav" 【必須】
キャッシュファイルのパス.
ファイル名は[ustの先頭からいくつめのノートか]_[エイリアス名]_[音階]_[6桁の英数字].wav
エイリアス名は半角スペースが+に置き換わる
6ケタの英数字の意味は不明.
何らかの編集をした時にファイル名を変えることによってキャッシュファイルを消したりするのに役立ってる模様

@echo ##########------------------------------(1/4)【必須】
進捗状況を表示してくれるアレ


@call %helper% "%oto%\_おおうえあ.wav" C4 480@120+70.0 30 3170.884 600 50.0 -1169.19 0
temp_helper.batを呼び出す命令.引数は
第1引数:原音のファイル名("%oto%\_おおうえあ.wav")

第2引数:レンダリングする音階名(C4)

第3引数:ノートの長さ(休符の時と同じ)(480@120+70.0)

第4引数:先行発声(30)

第5引数:オフセット(3170.884)

第6引数:resamplerで出力するファイル長(600)
wavtoolでの結合前に余裕を持った長さで出力する模様
(第3引数をmsに直した長さ+stp)/50を切り上げしてから50倍した値

第7引数 固定範囲(50.0)

第8引数 右ブランク(-1169.19)

第9引数 連番(0)
マルチコア処理の時結合順で困らないため?
ここの値を変な値にしたらうまく結合しなかった


3.3temp_helper.bat
ustに関わらず固定
1行目:@if exist %temp% goto A
キャッシュファイルがあれば,伸縮器を飛ばす

2行目:@if exist "%cachedir%\%9_*.wav" del "%cachedir%\%9_*.wav"
同じ連番の異なる名前のファイルがある場合削除

3行目:@"%resamp%" %1 %temp% %2 %vel% %flag% %5 %6 %7 %8 %params%
エンジンの呼び出し.
引数はさっきのcall命令の部分で書いた通り

4行目::A
1行目でジャンプしてくるためのラベル

5行目:@"%tool%" "%output%" %temp% %stp% %3 %env%
結合 説明は休符のところで書いた通り
なおこの時点ではまだtemp.wavは生成されず,temp.whdtemp.datが生成される


3.4 temp.batのフッタ
ustの内容に関わらず6行
1行目:@if not exist "%output%.whd" goto E
2行目:@if not exist "%output%.dat" goto E
temp.whdとtemp.datが生成されてるかチェック.なければ以降の命令を飛ばす

3行目:copy /Y "%output%.whd" /B + "%output%.dat" /B "%output%"
temp.whdとtemp.datを結合してtemp.wavを作る.
#whdってwave headだろうか?

4行目:del "%output%.whd"
5行目:del "%output%.dat"
temp.whdとtemp.datを削除

6行目::E
whdやらdatがなかった時のジャンプ用のラベル



4.個人的に解析中はまったポイント
1.先行発声とオーバーラップ
velが別途読み込まれているのでプラグイン時と同様手動で計算が必要なのかと思ったが,
先行発声とオーバーラップはvel適用後の値になっている

2.ピッチ数列
ピッチ数列は左ブランクから途切れなく並ぶ
例えstpでぶった切られるとしても,その分もピッチ数列が並ぶ
bpm120でstpが250msあったらUTAUの画面上で左ブランクにあってる部分まで46個






5.雑感
疲れた.presamplerが完成しない.進捗ダメです.