2016 VOCALOID Group, Yamaha Corporation
2016 VOCALOID Group, Yamaha Corporation 2
2016 VOCALOID Group, Yamaha Corporation 3
#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 UnityEngine; using System.Collections; public class Example : MonoBehaviour { void Start () { // API はすべて static にアクセス. YVF.YVFStartup(personal, Application.streamingAssetsPath + /VOCALOID/DB_ini); } } 2016 VOCALOID Group, Yamaha Corporation 4
enum YVFResult YVFFindResult YVFFind~() YVFNext~() YVF.YVFResult result = YVF.YVFStartup(personal, path); // 結果に応じて必要な処理をする if (result == YVF.YVFResult.Success) { print( 正常終了 ); } else if (result == YVF.YVFResult.InvalidString) { print( 入力文字列が不正 ); // TODO } 2016 VOCALOID Group, Yamaha Corporation 5
App Startup YVFStartup() Playback 合成 Real+me 合成 YVFShutdown() App Shutdown 2016 VOCALOID Group, Yamaha Corporation 6
// VOCALOID エンジンの起動 public void Startup() { if (!initialized) { // Workshop... YVF.YVFResult result = YVF.YVFStartup(personal, Application.streamingAssetsPath + /VOCALOID/DB_ini); print(result); if (result!= YVF.YVFResult.Success) { return; } //...Workshop initialized = true; // Realtime 合成モードに設定する ( バッファサイズ : 512 Samples) // Workshop... YVF.YVFRealtimeSetStaticSetting(YVF.YVFRealtimeMode.Mode512); //...Workshop VAudio.Create(); } } 2016 VOCALOID Group, Yamaha Corporation 7
// VOCALOID エンジンの停止 public void Shutdown() { if (initialized) { VAudio.Delete(); // Workshop... YVF.YVFShutdown(); //...Workshop initialized = false; } } 2016 VOCALOID Group, Yamaha Corporation 8
2016 VOCALOID Group, Yamaha Corporation 9
Unity アプリケーション上位層 オーディオ出力データ VOCALOID プラグイン inac+ve 歌声ライブラリ 2016 VOCALOID Group, Yamaha Corporation 10
Unity アプリケーション上位層 オーディオ出力データ [ リアルタイム合成処理の開始 ] VOCALOID プラグイン ac+ve 歌声ライブラリ 2016 VOCALOID Group, Yamaha Corporation 11
Unity アプリケーション上位層 オーディオ出力データ [ 歌詞の設定 ] VOCALOID プラグイン ac+ve よろしくね 歌声ライブラリ 2016 VOCALOID Group, Yamaha Corporation 12
Unity アプリケーション上位層 オーディオ出力データ VOCALOID プラグイン ac+ve [ イベントの追加, 確定 ] e.g. ノートオン よろしくね 歌声ライブラリ 2016 VOCALOID Group, Yamaha Corporation 13
Unity アプリケーション上位層 オーディオ出力データ よー [ 歌声合成データの取得 ] VOCALOID プラグイン ac+ve よろしくね 歌声ライブラリ 2016 VOCALOID Group, Yamaha Corporation 14
Unity アプリケーション上位層 オーディオ出力データ VOCALOID プラグイン ac+ve Unity のオーディオ出力用データに歌声合成データを設定, 出音 よろしくね 歌声ライブラリ 2016 VOCALOID Group, Yamaha Corporation 15
Unity アプリケーション上位層 オーディオ出力データ [ リアルタイム合成処理の終了 ] VOCALOID プラグイン inac+ve 歌声ライブラリ 2016 VOCALOID Group, Yamaha Corporation 16
2016 VOCALOID Group, Yamaha Corporation 17
public void Create() { // リアルタイム合成処理の起動 ( イベント待ち受けの開始 ) // Workshop... YVF.YVFResult result = YVF.YVFRealtimeStart(); if (result!= YVF.YVFResult.Success) { return; } //...Workshop renderdata = new short[audiosettings.getconfiguration().dspbuffersize * 2]; // OnAudioFilterRead() で値を設定できるように AudioClip を生成,AudioSource を Play AudioClip clip = AudioClip.Create(VOCALOID, YVF.YVFSamplingRate, 1, YVF.YVFSamplingRate, true); AudioSource source = gameobject.getcomponent<audiosource>(); source.loop = true; source.clip = clip; source.play(); } public void Delete() { // リアルタイム合成処理の終了 ( イベント待ち受けの停止 ) YVF.YVFRealtimeStop(); } 2016 VOCALOID Group, Yamaha Corporation 18
// 歌詞の設定 public void SetLyrics(string lyrics) { // Workshop... YVF.YVFRealtimeSetLyrics(lyrics, YVF.YVFLang.Japanese); //...Workshop } 2016 VOCALOID Group, Yamaha Corporation 19
Unity アプリケーション上位層 オーディオ出力データ [ 歌詞の設定 ] VOCALOID プラグイン ac+ve よろしくね 歌声ライブラリ 今ココ 2016 VOCALOID Group, Yamaha Corporation 20
// ノートオン ( 発音開始 ) イベントを VOCALOID エンジンに通知する private void NoteOn(int notenumber) { if (YVF.YVFRealtimeGetSynthState() == YVF.YVFRealtimeSynthState.Running) { // 現在発音しているノートのノートオフ ( 発音停止 ), 新しいノートオン ( 発音開始 ) を追加して確定 (Commit) // Workshop... YVF.YVFRealtimeAddNoteOff(); YVF.YVFRealtimeAddNoteOn(noteNumber); YVF.YVFRealtimeCommitMidi(); //...Workshop if (runningcoroutine!= null) { StopCoroutine(runningCoroutine); } runningcoroutine = StartCoroutine(dynamicsCoroutine()); } } 2016 VOCALOID Group, Yamaha Corporation 21
Unity アプリケーション上位層 オーディオ出力データ VOCALOID プラグイン ac+ve [ イベントの追加, 確定 ] e.g. ノートオン よろしくね 歌声ライブラリ 今ココ 2016 VOCALOID Group, Yamaha Corporation 22
void OnAudioFilterRead(float[] data, int channels) { if (YVF.YVFRealtimeGetSynthState()!= YVF.YVFRealtimeSynthState.Running) { return; } // 合成済み歌声合成データサイズの取得 int numbufferdsamples = (int)yvf.yvfrealtimegetaudionumdata(); if (numbufferdsamples <= 0) { return; } // 合成済み歌声合成データを short[] renderdata に書き込む // Workshop... YVF.YVFRealtimePopAudio(renderData, numbufferdsamples); //...Workshop // 歌声合成データをAudioClipに書き込む for (int i = 0; i < numbufferdsamples; ++i) { float value = renderdata[i] / 32768.0f; // uint16_t (-32768 ~ 32767) float (-1.0 ~ 1.0) int index = i * channels; for (int j = index; j < index + channels; ++j) { data[j] = value; } } } 2016 VOCALOID Group, Yamaha Corporation 23
Unity アプリケーション上位層 オーディオ出力データ よー [ 歌声合成データの取得 ] VOCALOID プラグイン ac+ve よろしくね 歌声ライブラリ 今ココから次ページ 2016 VOCALOID Group, Yamaha Corporation 24
Unity アプリケーション上位層 オーディオ出力データ VOCALOID プラグイン ac+ve Unity のオーディオ出力用データに歌声合成データを設定, 出音 よろしくね 歌声ライブラリ 前ページココまで 2016 VOCALOID Group, Yamaha Corporation 25
void OnTriggerEnter(Collider collision) { if (collision.tag == UnityChanHead) { // ボールが上向きの速度をもっている場合には衝突判定を無視する if (GetComponent<Rigidbody>().velocity.y > 0) { return; } // ドレミファソラシドの高さで順番に歌う int notenumber = middlec + majorscale[noteindex++]; if (noteindex >= majorscale.length) { noteindex = 0; } // 続く.. 2016 VOCALOID Group, Yamaha Corporation 26
//.. 続き OnTriggerEnter // ヘディングしたときのボールの高さが一定値以上のときに成功とする if (transform.position.y > threshold) { mistaken = 0; bound(); } else { ++mistaken; // 失敗したら音を外す // Workshop... int rnd = Random.Range(1, 4); rnd = (Random.Range(0, 2) == 0)? rnd : -rnd; notenumber += rnd; //...Workshop // 続く.. 2016 VOCALOID Group, Yamaha Corporation 27
} //.. 続き OnTriggerEnter if (mistaken <= excuse) { bound(); } else { // 失敗が連続した場合は, ボールにx 軸方向の力をかけ床に落とし終了とする GetComponent<Rigidbody>().AddForce(5, 0, 0, ForceMode.VelocityChange); } } NoteOn(noteNumber); } else if (collision.tag == Field) { // 床に落ちたら終了 NoteOff(); VDirector.Deactivate(); } 2016 VOCALOID Group, Yamaha Corporation 28
2016 VOCALOID Group, Yamaha Corporation