技術的なやつ

技術的なやつ

5.2 Unityでオーディオファイルを利用する

  1. Unityを用いる
    1. C#について少し復習する
    2. Unityの2D描画について簡単に学ぶ
  2. Unityの音声制御
    1. MIDIを再生させる手段を見つける
    2. 音声のマイク入力手段を見つける
  3. 入力音声の解析
    1. UnityのFFTライブラリを触ってみる
    2. FFTされたデータから音程を確定させるアルゴリズムを考える
  4. MIDIの解析
    1. 第1トラックの楽譜を解析する
    2. MIDIの再生箇所を解析する手段を見つける
  5. 採点のための解析
    1. 全体の点数計算アルゴリズムを考える
    2. ビブラート判定アルゴリズムを考える
    3. しゃくり判定アルゴリズムを考える
    4. タイミング判定アルゴリズムを考える
    5. なめらかさ判定アルゴリズムを考える

UnityでMIDI再生は出来ない!

早速ですが、UnityでMIDI再生は出来ません。└(┐┘)┌ゴミだァ~~~~~
色々と探しましたが、お金を払わない範囲ではどうしようもないようです。

新しい設計

というわけで、カラオケ採点機のための新しい設計を考えました。

  • オーディオファイル(wavとか)を鳴らす
    • 主旋律やテンポなどのデータを取ったファイルをMIDIとして用意、読み込んでwavファイルと同期させる

この設計にすることで、以下の様な利点と欠点が生まれます。

利点
  • 原曲音源でもカラオケが出来る
  • MIDIの解析が楽になる
  • 既存のUnity機能を使って楽に制作できる
欠点
  • キー変更が出来ない
  • テンポ変更が出来ない
  • テンポを完コピしたMIDIを用意しなければ同期ズレが発生する

特にキー変更が出来ないのは痛いですが、仕方がないです。

Unityでオーディオファイルを扱う

MIDIの解析が山場になることが確定しましたが、とりあえずUnityでオーディオファイルを扱う方法についてメモ。
f:id:ibako31:20140202172524j:plain
空のGameObjectを作成し、Add Component -> Audio -> Audio Source。上のようなものがInspectorに出てきます。
音源を対象プロジェクトのAssetsフォルダに追加します。Unityに戻ると自動で同期されます。オーディオファイルの場合、同期に時間がかかる場合もあるみたいです。
f:id:ibako31:20140202173034j:plain
こんな感じにインポート出来るはずです(画像のオーディオファイルは作業時に聞いていたものです)。
先ほど作成した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を弄ってから再生することで、開始時間を変更できます。
f:id:ibako31:20140202174738j:plain
音質がものすごく劣化するけど、回避方法はあるのかな。

参考文献

OSC, MIDI プラグイン (Unity) – Keijiro Takahashi
オーディオファイルの再生と動機して、MIDIデータから譜面を読み込み何だかんだするライブラリ(SmfLite)があります。ここから新設計の着想を得ました。

keijiro_smflite at test · GitHub.htm
SmfLiteのサンプルです。ここからUnityのAudioについて知見を得ました。