- Home /
Question by
Exalia · Oct 30, 2013 at 10:11 PM ·
audioaudiosourcesample
Music Visualiser Troubles
It's quite difficult to describe what is the issue here so here is the code, insert any audiofile you have into the scene and drag it into the script via the inspector, add as many cubes as you like, tag them as "Cube" (make cube tag as "Cube" and duplicate), drag the camera from the scene into the script and run the scene.
using UnityEngine;
using System.Collections;
public class SamplerScript : MonoBehaviour
{
//Public Variables
public int sampleNum;
public int channel;
public AudioSource audioSource;
public Camera mainCamera;
//Private Variables
private float[] arrVolume;
private float[] arrFrequency;
private float sumVolume;
private float sumFrequency;
private float avgVolume;
private float avgFrequency;
//Temp Variables
bool dataCollected = false;
bool dataShown = false;
private float qtrFreq;
private float maxFreq;
private float minFreq;
public int cubeCount;
private int count = 0;
public GameObject[] cubes;
private float divSamples;
private int loopCount = 0;
// Use this for initialization
void Start ()
{
//Set Up Arrays
arrVolume = new float[sampleNum];
arrFrequency = new float[sampleNum];
cubes = (GameObject[])GameObject.FindGameObjectsWithTag("Cube");
cubeCount = cubes.Length;
mainCamera.transform.position = new Vector3(cubes.Length / 2, 0, -cubes.Length / 2.5f);
print("Cubes Positions");
orderCubes();
}
void orderCubes()
{
loopCount = 0;
foreach (GameObject cube in cubes)
{
cube.transform.position = new Vector3(loopCount, 0, 0);
loopCount++;
}
}
// Update is called once per frame
void Update ()
{
count = 0;
sumFrequency = 0;
sumVolume = 0;
maxFreq = 0;
minFreq = 10;
//Get Volume Data
audioSource.GetOutputData(arrVolume, channel);
//Get Frequency Data
audioSource.GetSpectrumData(arrFrequency, channel, FFTWindow.BlackmanHarris);
//Itterate through each sample
for (int i = 0; i < sampleNum; i++)
{
//Sum Volume and Frequency
sumVolume += arrVolume[i];
sumFrequency += arrFrequency[i];
//Find Max and Min Frequency
if (maxFreq < arrFrequency[i])
{
maxFreq = arrFrequency[i];
}
}
//Average Sum of Volume and Frequency
avgVolume = sumVolume / sampleNum;
avgFrequency = sumFrequency / sampleNum;
//Temp
qtrFreq = maxFreq / cubeCount;
divSamples = sampleNum / cubeCount;
print(maxFreq);
for (int i = 0; i < sampleNum; i++)
{
for (count = 0; count < cubeCount; count++)
{
if (arrFrequency[i] < qtrFreq * (count + 1) && arrFrequency[i] > qtrFreq * count)
{
cubes[count].transform.localScale = new Vector3(1, arrVolume[i] * 40, 1);
cubes[count].renderer.material.color = new Color(arrFrequency[i] * 256, arrFrequency[i] * 256, arrFrequency[i] * 256);
}
}
count = 0;
}
}
}
Comment
Your answer
Follow this Question
Related Questions
How to AudioSource.GetSpectrumData while muted? 1 Answer
How can I pre-load samples from an audio file to spawn objects? 1 Answer
Global audio option 2 Answers
Audio loops too early 2 Answers