18
18

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-12-29

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

image

#Unity with Vocaloidをダウンロード
Unty wuth VocaloidのページからSDKをダウンロードしてくる。
image

#パッケージをインストール
image

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

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

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

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

#サンプルを拾ってくる

Unty wuth Vocaloidのページからサンプルをダウンロードしてくる。

image

#とりあえずサンプルのスクリプトみてみる
いくつか再生方法があるみたいだけど、とりあえず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

この3つ(4つ?)のスクリプトがコアの様子。
とりあえずこれを拝借してくれば歌わせられそう。

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

#どれみを歌わせたい

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

image

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

image

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

image

けど、プレファブの参照設定は外れているので、再設定。
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

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
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
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
https://youtu.be/dmTePPIuf6M

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

YVFConvertPhoneticSymbolToVowelID

#ホラーな感じに

動画:
IMAGE ALT TEXT HERE
https://youtu.be/WUkvNoiSYgA

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

#その他Tips

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

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

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

image

#MacOSXビルドではまったこと
CYP4eLgUwAAoZHj.png

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

CYP7d0YUEAETbuM.png

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

18
18
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
18

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?