Noticias

¡RECUERDA QUE SI ERES UN NUEVO USUARIO, DEBES PRESENTARTE PARA PODER PUBLICAR MENSAJES! | TENEMOS CANAL OFICIAL DE TELEGRAM: t.me/unity3dspain

Ecualizador grafico

Iniciado por Jose134, Julio 31, 2015, 09:11:24 PM

Tema anterior - Siguiente tema
Julio 31, 2015, 09:11:24 PM Ultima modificación: Julio 31, 2015, 09:13:46 PM por Jose134
Hola a todos me gustaria hacer lo tipico de que unas barritas sean mas altas o bajas dependiendo de la intensidad de la frecuencia pero no se muy bien como empezar he estado investigando un poco pero no encuentro nada que me sirva asi que me gustaria que me pasaseis algo de info.Muchas gracias EDIT: un ejemplo de lo que quiero hacer https://www.youtube.com/watch?v=M4MXCcf0hYs (aunque me gustaria que el mio estuviera un poco mas suavizado jeje)

hay un tio en el foro que hizo un reproductor con ecualizador k le kdo genial...

Hola soy ese tío Cargas el audio en un objeto clip de UnityExtraes las frecuencias con la FFT que lleva (AudioListener.GetSpectrumData y en mi caso FFTWindow.BlackmanHarris) y procesas cada valor que devuelve la matriz dependiendo de las frecuencias que necesites y las barras que uses. Dime que frecuencias vas a utilizar o si solamente los canales right/left.El truco para que las barras se muevan suaves es que, no se mueven! Se escalan en un eje!


Hola he conseguido hacer este script pero el problema es que solo se mueven las primeras barras. El resto no se mueve da igual que cancion le ponga o en que parte de la misma este
using UnityEngine;
using System.Collections;

public class Visualizer : MonoBehaviour {

public float heightMultiplier;
public float maxHeight;
public float minHeight;


private AudioSource source;
private float[] samples;
private GameObject[] bars;

void Awake () {
   source = GetComponent<AudioSource>();
   samples = new float[64];
   bars = new GameObject[samples.Length];

   for(int i = 0; i < samples.Length; i++){
      bars = GameObject.CreatePrimitive(PrimitiveType.Cube);   
      bars.transform.position = new Vector3(i,0,0);
      bars.transform.parent = transform;
   }
}

void Update () {
   source.GetSpectrumData(samples, 0, FFTWindow.BlackmanHarris);

   for(int i = 0; i < samples.Length; i++){
      float yValue = Mathf.Clamp(samples * heightMultiplier ,minHeight, maxHeight);
      bars.transform.localScale = new Vector3(1,yValue,1);
   }
}
}
 Este es el audio que estoy usando para probar el codigo: https://www.youtube.com/watch?v=3mIN39f_m6Q

Dame 10 min llego a casa y lo arreglamos.

[quote author=Jose134" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="15868" data-ipsquote-contentcommentid="101145">Hola he conseguido hacer este script pero el problema es que solo se mueven las primeras barras. El resto no se mueve da igual que cancion le ponga o en que parte de la misma este
using UnityEngine;using System.Collections;

public class Visualizer : MonoBehaviour {

public float heightMultiplier;
public float maxHeight;
public float minHeight;


private AudioSource source;
private float[] samples;
private GameObject[] bars;

void Awake () {
   source = GetComponent<AudioSource>();
   samples = new float[64];
   bars = new GameObject[samples.Length];

   for(int i = 0; i < samples.Length; i++){
      bars[i] = GameObject.CreatePrimitive(PrimitiveType.Cube);   
      bars[i].transform.position = new Vector3(i,0,0);
      bars[i].transform.parent = transform;
   }
}

void Update () {
   source.GetSpectrumData(samples, 0, FFTWindow.BlackmanHarris);

   for(int i = 0; i < samples.Length; i++){
      float yValue = Mathf.Clamp(samples[i] * heightMultiplier ,minHeight, maxHeight);
      bars[i].transform.localScale = new Vector3(1,yValue,1);
   }
}
}
 Este es el audio que estoy usando para probar el codigo:
">
[/quote]Vale. Estás recogiendo muy pocos samples y te quedas con un trozo del spectrum de frecuencias que es casi 0. Recoge 4096 en la matriz y los empaquetas, sumando los valores, por las barras que utilices. O sea un par de bucles.        for (int i = 0; i < this.cSpectrumData.Length; i++) {
            this.cSpectrumData = 0f;
            for (int j = i; j < this.EQSamples; j++) {
                this.cSpectrumData += this._spectrumData[j];
            }
        } Aunque yo recojo los valores del audio directamente del audiolistener así usando tu código:samples = AudioListener.GetSpectrumData(samples.Length, 0, FFTWindow.BlackmanHarris); 
Luego te vas a encontrar con otro "problema", pero no quiero decirte como resolverlo hasta que lo encuentres, ya que así se puede explicar mejor. Me voy a buscar una cerveza bien fría y te espero en pantalla

Muchas gracias. Creia que iban a ser muchos samples en caso de recoger mas pero segun lo que has dicho estaba equivocado jeje. Ahora voy a cenar ya dormir pero mañana por la mañana me pongo con ello

Unity es rapídisimo generando la fft y no hay problema en lanzarlo por cada frame. En mi app Xqualizer además se utilizan lights por todos lados y va finísimo. Nos vemos en la siguiente pregunta.

Agosto 04, 2015, 10:35:51 AM #9 Ultima modificación: Agosto 04, 2015, 10:36:50 AM por Jose134
seguro que sera por algun error muy tonto pero no lo veo. Ahora no se mueve nada 
using UnityEngine;
using System.Collections;

public class Visualizer : MonoBehaviour {

public float heightMultiplier;
public float maxHeight;
public float minHeight;
public int barsNumber;
[Range (1,4096)]
public int barSamples;


private AudioSource source;
private float[] samples;
private GameObject[] bars;

void Awake () {
   source = GetComponent<AudioSource>();
   samples = new float[4096];
   bars = new GameObject[samples.Length];

   for(int i = 0; i < barsNumber; i++){
      bars = GameObject.CreatePrimitive(PrimitiveType.Cube);   
      bars.transform.position = new Vector3(i,0,0);
      bars.transform.parent = transform;
   }
}

void Update () {
   samples = source.GetSpectrumData(samples.Length, 0, FFTWindow.BlackmanHarris);

   for(int i = 0; i < barsNumber; i++){
      float samplesAdd = 0;
      for(int j = i; j < barSamples; j++){
         samplesAdd += samples[j];
      }

      float yValue = Mathf.Clamp(samplesAdd * heightMultiplier, minHeight, maxHeight);
      bars.transform.localScale = new Vector3(1,yValue,1);
   }
}
}
Probablemente estara en los loops del update

No, lo que falta es marcha. Mucha más velocidad. Los valores que obtienes de la fft son muy pequeños y las variaciones son tan mínimas que no se pueden apreciar. Aparte, te recomiendo que mejor que el clamp, utilices el lerp con el time del update. O sea, quedaría algo así:             Vector3 v1 = new Vector3(0.1f, samplesAdd * heightMultiplier, 0.1f);
            float speed = Time.deltaTime * 10f;            bars.transform.localScale = Vector3.Lerp(this.bars.transform.localScale, v1, speed);El 10f de speed, ponlo como variable y juega con él desde el editor.
Con el valor del índice de matriz "" que no se porqué me lo ha quitado al copiarlo al foro.

[quote author=iRobb date=1438679853" data-ipsquote="" data-cite="iRobb" class="ipsQuote">No, lo que falta es marcha. Mucha más velocidad. Los valores que obtienes de la fft son muy pequeños y las variaciones son tan mínimas que no se pueden apreciar. Aparte, te recomiendo que mejor que el clamp, utilices el lerp con el time del update. O sea, quedaría algo así:             Vector3 v1 = new Vector3(0.1f, samplesAdd * heightMultiplier, 0.1f);
            float speed = Time.deltaTime * 10f;            bars.transform.localScale = Vector3.Lerp(this.bars.transform.localScale, v1, speed);El 10f de speed, ponlo como variable y juega con él desde el editor.Con el valor del índice de matriz "" que no se porqué me lo ha quitado al copiarlo al foro.[/quote]Vamos progresando jeje. He añadido eso a mi script y trasteando un poco con los valores he conseguido algo mas aproximado a lo que quiero. El problema es que las barras me van haciendo una especie de rampa. Algo asi:supongo que es porq se van sumando las frecuencias. Es decir la barra uno coge las frecuencias 1 2 3 4 5 6... la dos coge las 2 3 4 5 6 7... la tres las 3 4 5 6 7 8... etc

Claro. Aquí es donde quería llegar. Desconozco tu formación de base, pero ahora nos metemos en temas propios de sonido. Las frecuencias son el doble de la siguiente y así sucesivamente. Como normalizamos los valores? Sabes de que hablo o te lo explico?Ah, ves poniendo el código así lo copio y lo pruebo tambièn para que veamos lo mismo.
Ah y como dices, el bucle deberia avanzar en la i con un +j
Y más. Al ir modificando la escala y estar en el punto medio del objeto, deberias haber modificado la posición al mismo tiempo. Cierto?

Agosto 04, 2015, 03:35:50 PM #13 Ultima modificación: Agosto 04, 2015, 03:42:40 PM por Jose134
[quote author=iRobb date=1438689223" data-ipsquote="" data-cite="iRobb" class="ipsQuote">Claro. Aquí es donde quería llegar. Desconozco tu formación de base, pero ahora nos metemos en temas propios de sonido. Las frecuencias son el doble de la siguiente y así sucesivamente. Como normalizamos los valores? Sabes de que hablo o te lo explico?Ah, ves poniendo el código así lo copio y lo pruebo tambièn para que veamos lo mismo.Ah y como dices, el bucle deberia avanzar en la i con un +j[/quote]El codigo ahora mismo esta asi
Cita de: iRobb date=1438689223" data-ipsquote="" data-cite="iRobb" class="ipsQuoteY más. Al ir modificando la escala y estar en el punto medio del objeto, deberias haber modificado la posición al mismo tiempo. Cierto?De momento no estoy modificando la posicion. Eso lo hare una vez funcione el resto
								

Bueno primero arreglemos el bucle que como bien decias hay que incrementar i con el valor de barsamples y no se nos superpongan.

Etiquetas: