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を買ったよ […]