こんな感じになります。
実際にやってみると綺麗ですよー
参考
#コード
qiita.csharp
using UnityEngine;
using System.Collections.Generic;
public class Sinus : MonoBehaviour
{
float[] _spectrum = new float[128];
float _lastLow = 0;
public GameObject cube;
[Range(0, 1)]
public float t = 1;
List< GameObject> cubes = new List< GameObject>();
List< Vector3> cubess = new List< Vector3>();
void Start()
{
for (int i = 0; i < 128; i++) {
cubes.Add ((GameObject)Instantiate (cube, new Vector3 (5*Mathf.Sin(i * 15), 5*Mathf.Cos(i*20), 0), Quaternion.identity));
cubess.Add (new Vector3 (i * 1.2f, i * 1.2f, 0));
}
}
void Update()
{
AudioListener.GetSpectrumData(_spectrum, 0, FFTWindow.Rectangular);
float low = 0;
for (int i = 1; i < 3; i++)
low += _spectrum[i];
low = _lastLow * (1 - t) + low * t;
transform.localScale = Vector3.one * 0.05f * low + Vector3.one;
_lastLow = low;
print (cubes.Count);
for (int i = 0; i < cubes.Count; i++) {
//cubes[i].transform.rotation = Quaternion.Euler (new Vector3 (1, _spectrum[i]*i, 1) * 30);
cubes[i].GetComponent<Renderer>().material.color = new Color(0.5f+Mathf.Sin(Time.time)+_spectrum[i]*1,0.5f,0.5f+Mathf.Cos(Time.time)+_spectrum[i]*1);
cubes [i].transform.position = new Vector3 (10*Mathf.Sin(i*100+Time.deltaTime*_spectrum[i])*Mathf.Cos(i),10*Mathf.Sin(i*100)*Mathf.Sin(i),10*Mathf.Cos(i*100));
cubes [i].transform.localScale = new Vector3 (0.1f,0.1f,1000*_spectrum[i]);
cubes [i].transform.LookAt(new Vector3 (100*Mathf.Sin(i*100)*Mathf.Cos(i),100*Mathf.Sin(i*100)*Mathf.Sin(i),100*Mathf.Cos((i*100))));
}
}
}
こんな感じ!!
音のデータって、128とか64らしい!
んで、配列の中に一気に音声データが入り込むらしいですね!スゴイ!知りませんでした!
ちゃんと音楽勉強したらもっと人生豊かになれるんでしょうね!
最高!
#音の周波数スペクトラムについて
参考
まず音って、たくさんの周波数の集まりなので、それを
AudioListener.GetSpectrumData(_spectrum, 0, FFTWindow.Rectangular);
をつかって、高速フーリエ変換する。んででてくるたくさんの波のデータの中の重み成分が、たぶんスペクトラムの配列の中に入っていると思う。。。
asin(Tsita) のa の部分がスペクトラム
どういう順番で入っているのかっていうと、おそらく音の高さ(Tの大きさによる違い)がそれぞ順番として割り当てられていると思う。
フーリエ変換とかについて
参考