Візуальний еквалайзер, проблеми
Riddik 16, бер 2013, 10:07
Потрібно було для гри зробити візуальний еквалайзер, де стовпчики стрибають вгору-вниз у такт музиці, як у Winamp, наприклад.
Як робив. Усього стовпчиків 42. Мінімальна висота стовпчика взята за 0f (фактично стовпчик не малюється). Максимальна висота взята за 1f. Отримуємо в кожному кадрі масив спектра частот, скориставшись функцією GetSpectrumData(). Хоч у нас і 42 стовпчика, але мінімальна кількість елементів, переданих для обчислення у ф-ію, має бути 64 (як каже нам документація).
Потім беремо перші 42 елементи і на основі отриманих значень визначаємо висоту:
І ось тут починаються проблеми. Нормально рухається тільки перший стовпчик (нульовий в масиві columns), решта смикається в самому низу. Вирішив подивитися на значення samples, які повертає GetSpectrumData(), так і є - нульовий елемент набуває нормальних значень від 0f до 1f, значення решти елементів близько до нуля (0.000021413, 0.00003078 і т.д.).
Поки вирішив проблему незграбно, ввів для кожного стовпчика свій коефіцієнт, на який множиться samples[i], тоді всі стовпчики більш-менш стрибають. Але це не грамотно та якось костально.
Якщо хтось в курсі, якщо хтось знає або програмував звук, будь ласка, допоможіть вирішити проблему, зрозуміти у чому справа і знайти правильне рішення, щоб було як у музичних програвачах.
Re: Візуальний еквалайзер, проблеми
Order 18 бер 2013, 07:03
Як то брав з іноземного форуму все працювало.
using UnityEngine; using System.Collections;
public class CSBars : MonoBehaviour
// Public Variables public AudioListener Audio; public int numSamples = 64; public GameObject abar;
// PrivateЗмінні float [ ] numberleft = новий float [ 64 ] ; float[] numberright = новий float[64]; GameObject [ ] thebarsleft ; GameObject [ ] thebarsright ; інтервал між плаваючими місцями; float w >;
// Використовуйте це для ініціалізації void Start ( ) < thebarsleft = новий GameObject[numSamples]; thebarsright = новий GameObject[numSamples]; інтервал = 0,4f - ( numSamples * 0,001f ); w >= 0,3f - ( numSamples * 0,001f ); для ( int i = 0 ; i numSamples ; i ++ ) < float xpos = i * інтервал - 8.0f ; Позиція вектора3 зліва = новий вектор3(xpos,3,0); thebarsleft[i] = (GameObject) Instantiate(bar, positionleft, Quaternion.identity) as GameObject; ліворуч[i] трансформувати. localScale = новий вектор3(w>);
Vector3 positionright = новий Vector3(xpos, - 3, 0); thebarsRight[i] = (GameObject) Instantiate(bar, positionRight, Quaternion.identity) as GameObject; thebarsright[i] трансформувати. localScale = новий вектор3(w>); > >
// Оновлення викликається один раз на кадр void Update( )
//AudioListener.GetOutputData(numberleft, 0); //AudioListener.GetOutputData(numberright, 1);
numberleft = AudioListener. GetSpectrumData (numSamples, 0, FFTWindow. BlackmanHarris); numberright = AudioListener. GetSpectrumData (numSamples, 1, FFTWindow. BlackmanHarris);
for ( int i = 0 ; i numSamples ; i ++ ) < if ( float . IsInfinity ( numberLeft [ i ] * 30 ) float . IsNaN ( numberLeft [ i ] * 30 ) ) < > інакше < ліворуч[i] трансформувати. localScale = new Vector3(w>[i]*30,0.2f); thebarsright[i] трансформувати. localScale = new Vector3(w>[i]*30,0.2f); > > > >