Unity with VOCALOIDのサンプルプロジェクトHelloVOCALOIDを読んでみる Playback 編
CreateSequence を書いたから残りも書こうかなということで、Unity with VOCALOIDのサンプルプロジェクトHelloVOCALOIDを読んでみる CreateSequence 編に続いて、サンプルプロジェクト HelloVOCALOID の Playback をまとめます。
Playback は、予め用意しておいた VSQX ファイルを読み込んで合成するサンプルです。
細かいところは CreateSequence のときに書いたので、Playback に関するところだけまとめておきます。
Playback に関連するファイルはどれか?
このサンプルは CreateSequence とは異なりファイルを読み込んで再生するので、その分ファイルが増えています。
- Scenes/Playback.unity
- VOCALOID/Scripts/Playback/VocDirector.cs
- VOCALOID/Scripts/Playback/VocAudioManager.cs
- VOCALOID/Scripts/Playback/VocAudio.cs
- VOCALOID/Resources/Prefab/VOCALOIDAudioPlayback.prefab
- VOCALOID/Resources/Wav/Hello_VOCALOID.wav
- StreamingAssets/VOCALOID/SequenceFiles/Hello_VOCALOID.vsqx
- StreamingAssets/VOCALOID/SequenceFiles/Hello_VOCALOID_chorus1.vsqx
- StreamingAssets/VOCALOID/SequenceFiles/Hello_VOCALOID_chorus2.vsqx
Scenes/Playback.unity
メインカメラの正面にボタンが表示されます。
CreateSequence と同じです。
VOCALOID/Scripts/Playback/VocDirector.cs
再生に使用する Vsqx および Wav ファイルは以下のように宣言しています。
自前の Vsqx をとりあえずユニティちゃんに歌わせて見たい方は、ファイルを置いて、ここの名称を書き換えるだけで歌わせることができます。
private string[] sequencePath = new string[] { "/Hello_VOCALOID_chorus1.vsqx", "/Hello_VOCALOID.vsqx", "/Hello_VOCALOID_chorus2.vsqx", }; private const string audioPath = "Wav/Hello_VOCALOID";
Start() 内で、LoadSequence() を実行して Vsqx の読み込みをあらかじめ行います。
合わせて、Wav も AudioClip に設定します。
void Start() { // オーディオマネージャの初期化. if (!audioManager.Startup(engineCount)) { return; } audioManager.LoadSequence(sequencePath); audioManager.Backing.clip = Resources.Load(audioPath) as AudioClip; ready = true; }
VOCALOID/Scripts/Playback/VocAudioManager.cs
YVF には Vsqx を読み込むための YVFLoadVSQXFile() というメソッドが用意されています。
これだけで読み込みができるので、Vsqx を作れる方はにとっては Unity で歌わせることは割りと簡単です。
私には簡単じゃないです。
public void LoadSequence(string[] sequencePath) { songHandle = new Int32[sequencePath.Length]; for (Int32 i = 0; i < sequencePath.Length; ++i) { songHandle[i] = YVF.YVFOpenSong(); if (YVF.YVFLoadVSQXFile(songHandle[i], VocSystem.GetSequenceFilesPath() + sequencePath[i]) != YVF.YVFResult.Success) { throw new VocException("YVFLoadVSQXFile", songHandle[i]); } } }
VOCALOID/Scripts/Playback/VocAudio.cs
Playback では、Vsqx の読み込み時に既に YVFSong が生成されているので RenderMelody() 内では YVFOpenSong() および YVFCloseSong() を呼び出しません。
ただし、Vsqx を読み込んだだけでは MIDI Event データは生成されていないので、YVFBeginRender() の前に YVFSetupMidiEventsToEONInPart() を実行する必要があります。
public void RenderMelody() { (略) // 開始tickを指定し,MIDI EVENTデータを生成. if(YVF.YVFSetupMidiEventsToEONInPart(songHandle, partHandle, partHead.posTick) != YVF.YVFResult.Success) { throw new VocException("YVFSetupMidiEventsToEONInPart", songHandle); } Int32 totalFrame = YVF.YVFGetTotalFrameByPart(partHandle); if(totalFrame <= 0) { throw new VocException("YVFGetTotalFrameByPart", songHandle); } // レンダリング処理の開始. if(YVF.YVFBeginRender(engineHandle) != YVF.YVFResult.Success) { throw new VocException("YVFBeginRender", songHandle); } (略) YVF.YVFClearMidiEventsInPart(songHandle, partHandle); }
あんまり書くことなかった
ということで、CreateSequence とあまり変わらないので特筆することがないです。
気を付けないといけないのは、Vsqx を読み込んだ場合でも YVFSetupMidiEventsToEONInPart() は実行しないと行けないところくらいでしょうか。
VOCALOID 製品を元々に持っている人にとっては、このサンプルが 1 番役に立ちますね。
おしまい。
ディスカッション
ピンバック & トラックバック一覧
[…] Previous Post Unity with VOCALOIDのサンプルプロジェクトHelloVOCALOIDを読んでみる Playback 編 Next Post Mission Workshop VX Fitzroy AP Seriesを買ったよ […]