5.2 Unityでオーディオファイルを利用する
新しい設計
というわけで、カラオケ採点機のための新しい設計を考えました。
- オーディオファイル(wavとか)を鳴らす
- 主旋律やテンポなどのデータを取ったファイルをMIDIとして用意、読み込んでwavファイルと同期させる
この設計にすることで、以下の様な利点と欠点が生まれます。
利点
- 原曲音源でもカラオケが出来る
- MIDIの解析が楽になる
- 既存のUnity機能を使って楽に制作できる
Unityでオーディオファイルを扱う
MIDIの解析が山場になることが確定しましたが、とりあえずUnityでオーディオファイルを扱う方法についてメモ。
空のGameObjectを作成し、Add Component -> Audio -> Audio Source。上のようなものがInspectorに出てきます。
音源を対象プロジェクトのAssetsフォルダに追加します。Unityに戻ると自動で同期されます。オーディオファイルの場合、同期に時間がかかる場合もあるみたいです。
こんな感じにインポート出来るはずです(画像のオーディオファイルは作業時に聞いていたものです)。
先ほど作成したAudio SourceのAudio Clipにドラッグしておきます。
さて、楽しいコーディングです。
Add ComponentからC#スクリプトを加えます。名前はAudioにでもしておきましょう。
以下の様なコードを書きましょう。
using UnityEngine; using System.Collections; public class Audio : MonoBehaviour { public int start_time; // Use this for initialization void Start () { audio.Play(); audio.time = start_time; } // Update is called once per frame void Update () { Debug.Log(audio.time); } }
audio.Play()
このGameObjectに割り当てられたAudio Sourceを再生する。
audio.time
このGameObjectに割り当てられたAudio Sourceの再生位置を設定および読み込みする。
フレームごとに再生時間を出力します。
start_timeを弄ってから再生することで、開始時間を変更できます。
音質がものすごく劣化するけど、回避方法はあるのかな。
参考文献
OSC, MIDI プラグイン (Unity) – Keijiro Takahashi
オーディオファイルの再生と動機して、MIDIデータから譜面を読み込み何だかんだするライブラリ(SmfLite)があります。ここから新設計の着想を得ました。
keijiro_smflite at test · GitHub.htm
SmfLiteのサンプルです。ここからUnityのAudioについて知見を得ました。