#こんなアプリ
ボタンを押したら「どれみ」ってユニティちゃんが歌うイメージ。
#Unity with Vocaloidをダウンロード
Unty wuth VocaloidのページからSDKをダウンロードしてくる。
unitypackage形式で配布されているようなので、適当な空のプロジェクトを作ってProjectのAssetsフォルダへドロップすると、インポートできます。
インポートするとVOCALOIDのDBや各プラットフォーム用のSDKが配置されます。
#マニュアルみてもわからん!
どうやら「サンプルを参考にして」という感じのマニュアルなので、サンプルを読み解く必要が・・・
あと、機種ごとにnamespace分かれているっぽい(APIは互換らしいけど...)
#サンプルを拾ってくる
Unty wuth Vocaloidのページからサンプルをダウンロードしてくる。
#とりあえずサンプルのスクリプトみてみる
いくつか再生方法があるみたいだけど、とりあえず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の歌っているところだけ調査してみる
この3つ(4つ?)のスクリプトがコアの様子。
とりあえずこれを拝借してくれば歌わせられそう。
#【閑話休題】なんか不安定?
余談:MacOSXなんだけど、なんだかやたらとレインボーアイコンになるのは自分だけ?
特にEidtor時のVOCALOIDDirectorとか選択した時とか。
#どれみを歌わせたい
VocDirectorってのがVocAudioManager起動したりしているので、これを自分のに置き換えていけば良さそう。
prefab参照もしているのでそのままもらってきた。
#プレファブの設定を再設定
けど、プレファブの参照設定は外れているので、再設定。
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を呼ぶように変更した
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番号を配列で渡してやれば、ボタン押すたびに「どーれーみー」と歌ってくれる。
動画:
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();
}
こんな感じで音は止められる。
動画:
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.YVFRealtimeCommitMidi();//設定を反映
を呼ぶと即時反映するっぽい。
#ピッチベンド
PBSendは半音?
PitchBendは127*127まで指定可能?
YVF.YVFRealtimeCommitMidi();//設定を反映
動画:
https://youtu.be/dmTePPIuf6M
#口パク
realtimeのデモだと発音記号から母音をとりだして口パクしているみたい
YVFConvertPhoneticSymbolToVowelID
#ホラーな感じに
動画:
https://youtu.be/WUkvNoiSYgA
Unityの
OnAudioFilterReadの中で生成した値を渡しているようなので、
Unityに渡す前に生成された音に対して加工もできる。ので、FM音源っぽいモジュレーションを掛け合わせてみたらホラーっぽい感じになった。
#その他Tips
#サンプルのままだとnamespaceがあって使いづらいので外す
それほど大型なアプリを作るわけでもないのでnamespaceを外すと少し楽になるかも。
(おそらく3つの別々のサンプルを組み合わせるための策っぽい気がする・・・)
#iOSビルドだとおかま声?になる現象
どうやら、iOSの時のビルドで、AudioManagerのSystem Sample Rateに44100を指定しないと変になるっぽい。
なにやらビルド時にエラーが出ていて、音がしなかったけど、
Architectureをx86_64にしたらエラーが消えました。