VisualStudio2008Expressにてコンパイルを確認。
UTAU音声セットの解析用プログラムとテキストVSQとUTAU原音設定を読み込んで合成音を作るプログラムに分かれています。
ちなみに今回楽曲内で使用した原音設定は母音とn音、母音様子音から始まる音に関してオーバーラップを40msに設定しなおしています。こうしないと繋ぎ目が不自然になると思います。
http://www.crestmuse.jp/cmstraight/index.php?STRAIGHT%20Wiki
STRAIGHT Libraryに関してはこちらをご参照ください。
また、僕とリンク先とは一切関係がございません。この記事及びツールなど関連事項をリンク先で質問なさるのはご遠慮ください。STRAIGHT Libraryの使用に関しましてはリンク先に従ってください。
・straightNote::CreateNote(,,,)
音符の設定に基づいてstraightNote内部に一音分のキャッシュを作ります。基本的に音符の長さをTick長と原音設定から計算し直して時間伸縮させています。
音符長は、後続音が連続でなければ
・(Velocity伸縮比)=pow(2.0,(64-Velocity)/64)
・(実際の音符長)=(ノートの音符長)+(先行発音)*(Velocity伸縮比)
後続に連続する音符がある場合、
・(実際の音符長)=(ノートの音符長)+(先行発音)*(Velocity伸縮比)
-(次音符の先行発音)*(次音符のVelocity伸縮比)
+(次音符のオーバーラップ)
で決定されます。
実際に音符を伸縮させる時には
・[左ブランク〜固定長分]*(Velocity伸縮比)
・[固定長終了〜右ブランク]
の二つの部分に分けて計算しています。Velocityによって子音の長さを変えています。VEL=64で伸縮比1、VEL=0で2倍、VEL=128で半分の長さになるはずです。
またこの部分でAccentとDecayを反映させています。単純に直線的に影響を与えてるので説明は割愛。Accent=50,Decay=0で何も影響されません。
・straightSynthesizer::Synthesize()
現在のノートと次のノートを読み込んでひたすら合成していきます。後続に連続するノートがある時は、オーバラップ分を線形にモーフィングしています。個人的にはオーバーラップ分をのりしろの様に重ねるよりも、次の音符の最初の音に向かってモーフィングさせた方が効果的な気もしますが、そうした場合波形の見直しを迫られるので少し面倒くさいです。今回は単純にのりしろ的に合成しています。
音程は後続音が連続している場合、オーバーラップより指定時間(今回は50ms)前から音程を対数的(と言うのか?)に変化させています。この部分の50msというのは、勘です、時々ケロケロします。
Vibratoは音量・音程ともにかけています。最後にDYNとPIT/PBSを反映させておしまい。
基本的にやることは読み込み部分がしんどいだけなので割とさっくりやみーに作っています。アップしたソースは適当そのものなのでどんなバグが起こっても責任を負いかねますので悪しからず。
もう少しいいもの作る方向に頑張ればよかったかと思った。今後に役立てられるご意見があれば是非聞かせてください、という意味合いでソースアップしておきます。
再生できない場合、ダウンロードは🎵こちら
ついでに開発中に作ったデータをアップしておきます。
合成結果はいわゆるスッピンデータではなくボリュームに関してはいじっています。ADSR処理はついていないのでぶつってきれるんですよ…