【Unity】Unity with Vocaloidで「どれみ」を歌わせるまで

#こんなアプリ
ボタンを押したら「どれみ」ってユニティちゃんが歌うイメージ。

![image](https://qiita-image-store.s3.amazonaws.com/0/96808/f4510e7b-ef94-2d15-6693-c771c216541c.png)

#Unity with Vocaloidをダウンロード
[Unty wuth Vocaloidのページ](http://business.vocaloid.com/unitysdk/)からSDKをダウンロードしてくる。
![image](https://qiita-image-store.s3.amazonaws.com/0/96808/3c203e37-7eab-cbe4-10d1-46ee64ac8920.png)

#パッケージをインストール
![image](https://qiita-image-store.s3.amazonaws.com/0/96808/557ac08b-107a-0cd4-f2b3-26ada21c7359.png)

unitypackage形式で配布されているようなので、適当な空のプロジェクトを作ってProjectのAssetsフォルダへドロップすると、インポートできます。

インポートするとVOCALOIDのDBや各プラットフォーム用のSDKが配置されます。

#マニュアルみてもわからん！
どうやら「サンプルを参考にして」という感じのマニュアルなので、サンプルを読み解く必要が・・・

あと、機種ごとにnamespace分かれているっぽい（APIは互換らしいけど．．．）

#サンプルを拾ってくる

[Unty wuth Vocaloidのページ](http://business.vocaloid.com/unitysdk/)からサンプルをダウンロードしてくる。

![image](https://qiita-image-store.s3.amazonaws.com/0/96808/083888ef-0970-eaf5-15f0-d9f3a9186742.png)

#とりあえずサンプルのスクリプトみてみる
いくつか再生方法があるみたいだけど、とりあえずRealtimeのサンプルを探る

新規プロジェクトを作って、パッケージをインポートして、中身を見てみる。

```
#if UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN
using Yamaha.VOCALOID.Windows;
#elif UNITY_EDITOR_OSX || UNITY_STANDALONE_OSX 
using Yamaha.VOCALOID.OSX;
#elif UNITY_IOS
using Yamaha.VOCALOID.iOS;
#endif
```

なるほど、こんな感じで機種別のusingを対応するみたい。

例えばusingを使わない場合の書き方

```
 Yamaha.VOCALOID.OSX.YVF.YVFMIDIEventType;
```

#realtimeの歌っているところだけ調査してみる

![image](https://qiita-image-store.s3.amazonaws.com/0/96808/2e548bb6-3280-c1cf-84d6-cb6069f783c6.png)

この３つ（４つ？）のスクリプトがコアの様子。
とりあえずこれを拝借してくれば歌わせられそう。

#【閑話休題】なんか不安定？
余談：MacOSXなんだけど、なんだかやたらとレインボーアイコンになるのは自分だけ？
特にEidtor時のVOCALOIDDirectorとか選択した時とか。

#どれみを歌わせたい

VocDirectorってのがVocAudioManager起動したりしているので、これを自分のに置き換えていけば良さそう。

![image](https://qiita-image-store.s3.amazonaws.com/0/96808/08324eff-3bad-a36e-160c-b92241fbc492.png)

prefab参照もしているのでそのままもらってきた。

![image](https://qiita-image-store.s3.amazonaws.com/0/96808/4fae8893-af2d-294c-48ec-4441801ca01d.png)

#プレファブの設定を再設定

![image](https://qiita-image-store.s3.amazonaws.com/0/96808/dbdd8983-5917-c25f-e06d-d55d3b42e452.png)

けど、プレファブの参照設定は外れているので、再設定。
OutputもミキサーをNoneに設定。

#ボタンを押して音を出すように変更

とりあえず、VocAudioManager.csに
以下の行を追加して・・・

```
        void Start ()
        {
            // オーディオマネージャの初期化.
            this.Startup();
        }

        public void OnButton()
        {
            this.SetLyrics("どれみ");

            int noteNumber = 60;
            // ノートオンを送信する.
            YVF.YVFRealtimeAddMidi(YVF.YVFMIDIEventType.NoteOn, noteNumber);
            YVF.YVFRealtimeCommitMidi();
        }
```

##uGUIのボタンの設定

OnClick()のところで上で追加したOnButtonを呼ぶように変更した

![image](https://qiita-image-store.s3.amazonaws.com/0/96808/1164be89-ec52-9179-aced-279186e64c6f.png)

Canvasのボタンの設定でOnButton()を呼ぶと
「どー」
と鳴り続けるところまでできた！

しかし、「どー」しか鳴らない・・・

#ボタンを押すたびに音程を変えたい

```
        void Start ()
        {
            // オーディオマネージャの初期化.
            this.Startup();
            this.SetLyrics("どれみ");  //  先に歌詞を設定しておく
        }

        int[] noteList = new int[]{60,62,64};   //  ドレミのノート番号リスト
        int noteCount = 0;
        public void OnButton()
        {
            int noteNumber = noteList[noteCount%noteList.Length];
            // ノートオンを送信する.
            YVF.YVFRealtimeAddMidi(YVF.YVFMIDIEventType.NoteOn, noteNumber);
            YVF.YVFRealtimeCommitMidi();
            noteCount++;
        }
```

先に歌詞を指定しておけば、ノートオンで勝手に歌詞が先送りされるようなので、Note番号を配列で渡してやれば、ボタン押すたびに「どーれーみー」と歌ってくれる。

動画：
[![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/wA2q0WK12G4/0.jpg)](http://www.youtube.com/watch?v=wA2q0WK12G4)
https://youtu.be/wA2q0WK12G4

#音を止めるには？

たぶん、NoteOffを送ればいい。
最後に発音したNoteOnを覚えていないといけないかも。

```
public void OnNoteOff()
        {
            int noteNumber = noteList[(noteCount-1)%noteList.Length];   //  1つ前の音程
            // ノートオフを送信する.
            YVF.YVFRealtimeAddMidi(YVF.YVFMIDIEventType.NoteOff, noteNumber);
            YVF.YVFRealtimeCommitMidi();
        }
```

こんな感じで音は止められる。

動画：
[![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/HqCJv-A9vR0/0.jpg)](http://www.youtube.com/watch?v=HqCJv-A9vR0)
https://youtu.be/HqCJv-A9vR0


#感想
使ってみて欲しいと思った機能

- 再生中のNoteNo知りたい

- 再生中のlyric知りたい 

これあれば、Callbackとかポーリングとかでもらえれば、口パクとか同期させやすい気がする。

- RealtimeAddMidiのインプリメントチャートが欲しい

何がコントロールできるのか知りたい

```
YVFMIDIEventType

public enum YVFMIDIEventType
{
	Begin,
	ProgramChange,
	BankSelect,
	PBSens,
	PitchBend,
	Dynamics,
	Breathiness,
	Brightness,
	Clearness,
	Opening,
	Gender,
	VibratoDepth,
	VibratoRate,
	NoteOff,
	NoteOn,
	End
}
```

に定義されているっぽい？値の範囲が不明だが・・・MIDIっぽい感じなはず。

- 複数鳴らせない？

RealtimeAddMidiにMIDI Chの指定がない・・・

#ジェンダーを変えてみる

```
YVF.YVFRealtimeAddMidi(YVF.YVFMIDIEventType.Gender, 64);　//通常
```

```
YVF.YVFRealtimeAddMidi(YVF.YVFMIDIEventType.Gender, 127);//体格の大きい感じ
```

```
YVF.YVFRealtimeAddMidi(YVF.YVFMIDIEventType.Gender, 0);//ねずみっぽい
```

#音量を変えてみる

```
YVF.YVFRealtimeAddMidi(YVF.YVFMIDIEventType.Dynamics, 64);//通常
```

```
YVF.YVFRealtimeAddMidi(YVF.YVFMIDIEventType.Dynamics, 127);//大きい
```
   
```         YVF.YVFRealtimeAddMidi(YVF.YVFMIDIEventType.Dynamics, 1);//かなり小さい
```

#再生中の音にパラメータ変更させるには？

次の発音からしか反映しない？（再生中の音をコントロールできない？）
って時は

``` 
YVF.YVFRealtimeCommitMidi();//設定を反映
``` 
を呼ぶと即時反映するっぽい。


#ピッチベンド

PBSendは半音？
PitchBendは127*127まで指定可能？

```  YVF.YVFRealtimeAddMidi(YVF.YVFMIDIEventType.PBSens, 2);            YVF.YVFRealtimeAddMidi(YVF.YVFMIDIEventType.PitchBend, 127*127);
YVF.YVFRealtimeCommitMidi();//設定を反映
```

動画： 
[![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/dmTePPIuf6M/0.jpg)](http://www.youtube.com/watch?v=dmTePPIuf6M)
https://youtu.be/dmTePPIuf6M

#口パク
realtimeのデモだと発音記号から母音をとりだして口パクしているみたい

```
YVFConvertPhoneticSymbolToVowelID
```

#ホラーな感じに

動画：
[![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/WUkvNoiSYgA/0.jpg)](http://www.youtube.com/watch?v=WUkvNoiSYgA)
https://youtu.be/WUkvNoiSYgA

Unityの
OnAudioFilterReadの中で生成した値を渡しているようなので、
Unityに渡す前に生成された音に対して加工もできる。ので、FM音源っぽいモジュレーションを掛け合わせてみたらホラーっぽい感じになった。

#その他Tips

#サンプルのままだとnamespaceがあって使いづらいので外す
それほど大型なアプリを作るわけでもないのでnamespaceを外すと少し楽になるかも。
（おそらく３つの別々のサンプルを組み合わせるための策っぽい気がする・・・）

#iOSビルドだとおかま声？になる現象

どうやら、iOSの時のビルドで、AudioManagerのSystem Sample Rateに44100を指定しないと変になるっぽい。

![image](https://qiita-image-store.s3.amazonaws.com/0/96808/b1085614-658d-1198-faff-68d621bad693.png)

#MacOSXビルドではまったこと
![CYP4eLgUwAAoZHj.png](https://qiita-image-store.s3.amazonaws.com/0/96808/35d2293b-9607-13ca-779a-b2ae7ec892e1.png)

なにやらビルド時にエラーが出ていて、音がしなかったけど、

![CYP7d0YUEAETbuM.png](https://qiita-image-store.s3.amazonaws.com/0/96808/7e467299-3c4e-4391-54d1-33814b4af013.png)

Architectureをx86_64にしたらエラーが消えました。