サンプル読みながら書きました。
ボカロはほぼ知らないです。ミクだけあるけど。
- Playbackモードの処理フロー
- YVF.YVFStartupメソッド
- YVF.YVFSetStaticSettingメソッド
- YVF.YVFOpenSongメソッド
- YVF.YVFLoadVSQXFileメソッド
- YVF.YVFFindTempoInMasterメソッド
- YVF.YVFFindPartメソッド
- YVF.YVFSetSingerInPartメソッド
- YVF.YVFSetupMidiEventsToEONInPartメソッド
- YVF.YVFGetTotalFrameByPartメソッド
- YVF.YVFBeginRenderメソッド
- YVF.YVFRenderメソッド
- YVF.YVFEndRenderメソッド
- YVF.YVFClearMidiEventsInPartメソッド
- YVF.YVFCloseSongメソッド
- YVF.YVFShutdownメソッド
- とりあえずこんなところで
Playbackモードの処理フロー
ボカロエンジンには2種類あって1つが譜面通り歌うタイプ、もう1つがリアルタイムで発声するタイプ。
今回は前者のPlaybackモードを使用します。
YVFクラスのメソッドを順番に実行しながら音声を合成するのが基本の流れ。
- YVFStartup()
- YVFSetStaticSetting()
- YVFOpenSong()
- シーケンスロード、編集など(ボカロ設定、楽譜読み込みetc…)
- YVFSetupMidiEventsToEONInPart()
- YVFBeginRender()
- YVFRender()
- YVFEndRender()
- YVFClearMidiEventsInPart() //4に戻ったりする
- YVFCloseSong() //3に戻ったりする
- YVFShutdown()
4番がプログラム的にはやること多いんですが、今回は.vsqxファイルを読み込んでしまおうかと。
サンプルプロジェクト(PlayBackシーン)を見ながらざっくりと使用メソッドをとりあげていきます。
だいたいリファレンスから引っ張ってます。
YVF.YVFStartupメソッド
public static YVF. YVFResult YVFStartup( string targetName, string path )
YVFクラスの初期化を行うメソッド。
targetNameは”personal”で固定、pathはボカロが使用するDB_iniフォルダのパスです。通常であればAssets>StreamingAssets>VOCALOID>DB_iniにあるかと。
戻り値はYVFResultという列挙型です。例外処理で使用。
YVF.YVFSetStaticSettingメソッド
public static YVF. YVFResult YVFSetStaticSetting( int length )
Playbackモードでエンジンを起動するメソッド。
lengthで起動する歌声合成エンジンの数を指定します。1~16個まで可能。またこれがそのままエンジンハンドルNo.になります。3なら0~2ですね多分。
戻り値はYVF.YVFStartupメソッドと同じなので省略。後もたくさん出てきますがそれも省略します。
YVF.YVFOpenSongメソッド
public static int YVFOpenSong()
ソングをオープンします。(原文ママ)
よくわかりませんがソングハンドルを返してくれます。
ソングハンドルは後のメソッドでたくさん使用します。
YVF.YVFLoadVSQXFileメソッド
public static YVF. YVFResult YVFLoadVSQXFile( int handle, string filePath )
VSQXファイルをロードしてくれる神メソッドです。
handleで上のYVFOpenSongで取得したソングハンドルを指定、ファイルパスはフルパス。
複数のVSQXファイルを読み込んで合掌したいとかいう場合はそれぞれ新しいソングをオープンする必要があるということですね。
我が家にはボカロエディタが無いので詳しい事がわからないのですが、適当に拾ってきた.vsqxファイルでテストしたいときはwavPartの記述があると読み込みエラーが発生するので、その場合はコメントアウトしておくとよいかと。
YVF.YVFFindTempoInMasterメソッド
public static YVF. YVFFindResult YVFFindTempoInMaster( int handle, int time, out YVF. YVFTempo tempo )
本筋とはあまり関係ありませんが、サンプルに出てきたメソッドを順番に。
検索開始位置以降の最初のテンポを検索します。(原文ママ)
handleはソングハンドル、timeは検索開始位置(tick単位)、YVF. YVFTempo構造体でout。
多分検索開始位置というか検索位置のBPMを返すと思うんですけど。
VSQXファイルを読み込むなら記載あると思うから要らない気がするんですが。どうなんだ。
YVF.YVFFindPartメソッド
public static YVF. YVFFindResult YVFFindPart( int handle, short track, int time, out YVF. YVFPartHead partHead )
パートを取得するメソッド。
handleはソングハンドル、trackはトラックナンバー、timeは検索開始時間(tick)。
outでパートヘッダをYVF. YVFPartHead構造型で取得。
YVF.YVFSetSingerInPartメソッド
public static YVF. YVFResult YVFSetSingerInPart( int handle, int partHandle, ref YVF. YVFSinger singer )
シンガーを設定するメソッド。
handleはソングハンドル、partHandleはYVF. YVFPartHead.partHandleから取得できます。
singerはYVF. YVFSinger構造型を参照渡し。シンガーの設定が入ってますが今はunityちゃんしか選べないですね。
YVF.YVFSetupMidiEventsToEONInPartメソッド
指定パートのVOCALOID MIDIデータを元に、フレームインデックスとの対応データをセットアップします。 public static YVF. YVFResult YVFSetupMidiEventsToEONInPart( int handle, int partHandle, int startTick )
フローの本筋に戻ってきてこのメソッド。なにを言ってるのかわからないですね。
handleはソングハンドル、partHandleはパートハンドル(パートヘッダのメンバから取得)、startTickはセット時間でしょうか。
partHandleで指定したパートをhandleで指定したソングのstartTickの位置にセットする、って事ですかね?
YVF.YVFGetTotalFrameByPartメソッド
public static int YVFGetTotalFrameByPart( int partHandle )
指定パートをレンダリングした時の総フレーム数を取得するメソッド。
BPMとTickからなんかいろいろしてくれてそうな気がします。
YVF.YVFBeginRenderメソッド
public static YVF. YVFResult YVFBeginRender( int engineHandle )
レンダリング準備を行うメソッド。
engineHandleで指定したエンジンでレンダリング準備します。
エンジンハンドルはYVF.YVFSetStaticSettingメソッドで一応出てきてますね(記憶にない)
YVF.YVFRenderメソッド
public static YVF. YVFResult YVFRender( int partHandle, short[] renderingData, int targetSamples, int engineHandle, out int renderedSamples )
レンダリングするメソッドです。
partHandleはパートハンドル、renderingDataは取得データの先頭ポインタ(????)、ターゲットサンプルは総サンプル数(1フレーム256サンプルらしい)、engineHandleはエンジンハンドル、renderdeSamplesは処理したサンプル数。
まるでわけがわかりませんのであとまわし。
YVF.YVFEndRenderメソッド
public static void YVFEndRender( int engineHandle )
Playbackモードのレンダリング終了メソッド。
YVF.YVFClearMidiEventsInPartメソッド
public static YVF. YVFResult YVFClearMidiEventsInPart( int handle, int partHandle )
指定パートのフレームインデックスとの対応データをクリアするメソッド。
引数はソングハンドルとパートハンドル。
YVF.YVFCloseSongメソッド
public static void YVFCloseSong( int handle )
ソングをクローズするメソッド。
handleはソングハンドルですね。
YVF.YVFShutdownメソッド
public static YVF. YVFResult YVFShutdown()
YVFを終了するメソッドです。
とりあえずこんなところで
まるで意味が分からんのが幾つかありましたが、とりあえずplaybackモードで.vsqxファイル読み込んで再生するってのは何とかなりそうですね。
適当に組んでみたいと思います。
コメント