Unity with VOCALOIDのサンプルプロジェクトHelloVOCALOIDを読んでみる Playback 編

2016年8月13日

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 番役に立ちますね。

おしまい。

スポンサーリンク