Unity Spain

Post Antiguos => General (Antiguo) => Mensaje iniciado por: Jose134 en Julio 31, 2015, 09:11:24 PM

Título: Ecualizador grafico
Publicado por: Jose134 en Julio 31, 2015, 09:11:24 PM
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 (//%5Byoutube%5Dhttps://www.youtube.com/watch?v=M4MXCcf0hYs%5B/youtube%5D) (aunque me gustaria que el mio estuviera un poco mas suavizado jeje)
Título: Ecualizador grafico
Publicado por: H@pesend en Julio 31, 2015, 09:21:09 PM
hay un tio en el foro que hizo un reproductor con ecualizador k le kdo genial...
Título: Ecualizador grafico
Publicado por: iRobb en Agosto 03, 2015, 12:36:07 PM
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!
Título: Ecualizador grafico
Publicado por: o0Charly0o en Agosto 03, 2015, 01:28:37 PM
http://forum.unity3d.com/threads/unity-3-audio-spectrum-analysis.58769/ (http://forum.unity3d.com/threads/unity-3-audio-spectrum-analysis.58769/) esto te puede servir, saludos.
Título: Ecualizador grafico
Publicado por: Jose134 en Agosto 03, 2015, 06:23:07 PM
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 (//%5Byoutube%5Dhttps://www.youtube.com/watch?v=3mIN39f_m6Q%5B/youtube%5D)
Título: Ecualizador grafico
Publicado por: iRobb en Agosto 03, 2015, 08:17:18 PM
Dame 10 min llego a casa y lo arreglamos.
Título: Ecualizador grafico
Publicado por: iRobb en Agosto 03, 2015, 09:27:09 PM
[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
Título: Ecualizador grafico
Publicado por: Jose134 en Agosto 03, 2015, 10:20:16 PM
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
Título: Ecualizador grafico
Publicado por: iRobb en Agosto 03, 2015, 10:27:02 PM
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.
Título: Ecualizador grafico
Publicado por: Jose134 en Agosto 04, 2015, 10:35:51 AM
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
Título: Ecualizador grafico
Publicado por: iRobb en Agosto 04, 2015, 11:17:33 AM
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.
Título: Ecualizador grafico
Publicado por: Jose134 en Agosto 04, 2015, 01:47:46 PM
[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:(//%3CfileStore.core_Attachment%3E/monthly_2015_08/EQBars.thumb.png.c362ec990eb006ad2b5ae8709a14d8a5.png)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
Título: Ecualizador grafico
Publicado por: iRobb en Agosto 04, 2015, 01:53:43 PM
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?
Título: Ecualizador grafico
Publicado por: Jose134 en Agosto 04, 2015, 03:35:50 PM
[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
			
Título: Ecualizador grafico
Publicado por: iRobb en Agosto 04, 2015, 03:41:01 PM
Bueno primero arreglemos el bucle que como bien decias hay que incrementar i con el valor de barsamples y no se nos superpongan.
Título: Ecualizador grafico
Publicado por: Jose134 en Agosto 04, 2015, 03:43:48 PM
[quote author=iRobb date=1438695661" data-ipsquote="" data-cite="iRobb" class="ipsQuote">Bueno primero arreglemos el bucle que como bien decias hay que incrementar i con el valor de barsamples y no se nos superpongan.[/quote]Que tal haciendo esto?

			
Título: Ecualizador grafico
Publicado por: iRobb en Agosto 04, 2015, 03:46:13 PM
Vale. Que ocurre con las barras? Que defectos ves (estoy en el tablet no con el pc).
Título: Ecualizador grafico
Publicado por: Jose134 en Agosto 04, 2015, 03:52:25 PM
Pues me pasa como antes. Solo se mueven las dos primeras barras. Las variables tienen estos valores:he puesto en barSamples 32 porque 4096 samples que recojo entre 128 barras que he creado segun la calculadora el resultado es 32. Entonces cada barra representa 32 frecuencias distintas (a no ser que funcione de un modo distinto pero segun lo poco que he ido deduciendo deberia ser asi) 
Título: Ecualizador grafico
Publicado por: iRobb en Agosto 04, 2015, 03:59:58 PM
Voy al PC. Pero diria que el bucle está mal. Lo miro.
Buff. Vamos mal. Hay que reorganizar ya que entiendo que barsamples son las fft y barnumbers las barras que se muestran. Voy a poner mi código.
Título: Ecualizador grafico
Publicado por: Jose134 en Agosto 04, 2015, 04:16:44 PM
    public float heightMultiplier;
public float maxHeight;
public float minHeight;
public int barsNumber; //Numero de barras que se crean
[Range (1,4096)] public int barSamples; //Numero de samples que muestra cada barra
public float heightSpeed;


private AudioSource source;
private float[] samples; //Las samples recogidas con GetSpectrumData
private GameObject[] bars; //Las barras
 
Título: Ecualizador grafico
Publicado por: iRobb en Agosto 04, 2015, 04:27:53 PM
Mi código sobre el tuyo modificado: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 float[] samplesPacked;
    private GameObject[] bars;    void Awake() {
        this.source = GetComponent<AudioSource>();
        this.samples = new float[this.barSamples];
        this.samplesPacked = new float[this.barsNumber];
        this.bars = new GameObject[samples.Length];        for (int i = 0; i < this.barsNumber; i++) {
            this.bars = GameObject.CreatePrimitive(PrimitiveType.Cube);
            this.bars.transform.position = new Vector3(i, 0, 0);
            this.bars.transform.parent = transform;
            this.bars.transform.localScale = new Vector3(0.1f, 0.1f, 0.1f);        }
    }    void Update() {
        samples = source.GetSpectrumData(samples.Length, 0, FFTWindow.BlackmanHarris);
        //samples = AudioListener.GetSpectrumData(samples.Length, 0, FFTWindow.BlackmanHarris);        int rBars = this.barSamples / this.barsNumber;
        int index = 0;        for (int i = 0; i < this.barSamples; i += rBars, index++) {
            this.samplesPacked[index] = 0f;
            for (int j = 0; j < this.barsNumber; j++) {
                this.samplesPacked[index] += this.samples[j + index];
            }
        }
        for (int k = 0; k < this.barsNumber; k++) {
            Vector3 v1 = new Vector3(0.1f, this.samplesPacked[k] * heightMultiplier, 0.1f);
            float speed = Time.deltaTime * 10f;            this.bars[k].transform.localScale = Vector3.Lerp(this.bars[k].transform.localScale, v1, speed);
        }
    }
}
Sorry, esta línea del for está mal, es:                this.samplesPacked[index] += this.samples[j + i]; 
Height M = 20bar number = 32bar samples = 4096
Cuando lo tengas mezclado con el tuyo me dices. Verás que ya tiene una pinta estupenda
[quote author=Jose134" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="15868" data-ipsquote-contentcommentid="101216">
    public float heightMultiplier;public float maxHeight;
public float minHeight;
public int barsNumber; //Numero de barras que se crean
[Range (1,4096)] public int barSamples; //Numero de samples que muestra cada barra
public float heightSpeed;


private AudioSource source;
private float[] samples; //Las samples recogidas con GetSpectrumData
private GameObject[] bars; //Las barras
 [/quote]barSamples es todo el sampleado de todas las frecuencias en un momento dado, que es lo que devuelve la fftbarsNumber es el número de barras a mostrar, que serán el empaquetado de frecuencias de barSamples.
Título: Ecualizador grafico
Publicado por: Jose134 en Agosto 04, 2015, 06:42:00 PM
El codigo se me ha quedado asi
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;
public float heightSpeed;


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

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

   CreateBars();
}

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

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

   int rBars = barSamples / barsNumber;
   int index = 0;

   for(int i = 0; i < barSamples; i+= rBars, index++){
      packedSamples[index] = 0f;
      for(int j = 0; j < barsNumber; j++){
         packedSamples[index] += samples[j + i];
      }

      /*
      float yValue = Mathf.Clamp(samplesAdd * heightMultiplier, minHeight, maxHeight);
      bars.transform.localScale = new Vector3(1,yValue,1);
      */
   }

   for (int k = 0; k < barsNumber; k++) {
      Vector3 v1 = new Vector3(1f, packedSamples[k] * heightMultiplier, 1f);
      float speed = Time.deltaTime * heightSpeed;
      
      bars[k].transform.localScale = Vector3.Lerp(bars[k].transform.localScale, v1, speed);
   }
}
}
Pero las barras siguen sin funcionar como me gustaria La primera barra siempre esta muy alta las siguientes se mueven un poco y las ultimas apenas pasan de 0.2 de altura por cierto los graves son las barras de la izquierda o de la derecha?
Título: Ecualizador grafico
Publicado por: iRobb en Agosto 04, 2015, 09:11:13 PM
Claro, esto es normal. Piensa que cada valor de frecuencia es la mitad de su anterior, o lo que es lo mismo, cada frecuencia es el doble de la anterior. Por tanto, es las frecuencias más altas (la barra altísima), el valor es muy grande y en las primeras muuuy pequeño. Como normalizamos esto, pues con el logaritmo. Al resultado de la suma de los valores packed, aplícale Mathf.Log. Y serán todas enormes, por tanto tendrás que modificar el heightmodifier.
Título: Ecualizador grafico
Publicado por: iRobb en Agosto 04, 2015, 09:57:35 PM
Y al verlas moverse, seguro que descubres cuáles son las bajas y cuáles las altas.
Título: Ecualizador grafico
Publicado por: ACarranza en Agosto 04, 2015, 10:40:19 PM
no se que pasa , pero se lee interesante, llegando a casa me mentere tambien en este tema  
Título: Ecualizador grafico
Publicado por: iRobb en Agosto 04, 2015, 11:02:49 PM
Ya parece un tutorial 
Título: Ecualizador grafico
Publicado por: Jose134 en Agosto 05, 2015, 11:54:23 AM
INFINITAMENTE MEJOR Peeeero no para de salirme este error en la consola:transform.localScale assign attempt for '14' is not valid. Input localScale is { 1.000000, -Infinity, 1.000000 }.
UnityEngine.Transform:set_localScale(Vector3)
Visualizer:Update() (at Assets/Scripting/Visualizer.cs:56) Solo que no siempre pone 14 son numeros desde el 0 hasta el 31
Título: Ecualizador grafico
Publicado por: iRobb en Agosto 05, 2015, 12:01:09 PM
Que cosa más rara. Mi código sin este error es: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;
    public float barSpeed;    private AudioSource source;
    private float[] samples;
    private float[] samplesPacked;
    private GameObject[] bars;    private Vector3[] pBars;
    private Vector3[] sBars;    private Vector3 barScale;    void Awake() {
        this.source = GetComponent<AudioSource>();
        this.samples = new float[this.barSamples];
        this.samplesPacked = new float[this.barsNumber];
        this.bars = new GameObject[samples.Length];        this.pBars = new Vector3[this.barsNumber];
        this.sBars = new Vector3[this.barsNumber];        this.barScale = new Vector3(0.5f, 0.01f, 0.1f);        for (int i = 0; i < this.barsNumber; i++) {
            this.bars = GameObject.CreatePrimitive(PrimitiveType.Cube);
            this.bars.transform.position = new Vector3(i, 0, 0);
            this.bars.transform.parent = transform;
            this.bars.transform.localScale = this.barScale;            this.pBars = bars.transform.localPosition;
            this.sBars = bars.transform.localScale;
        }
    }    void Update() {
        //samples = source.GetSpectrumData(samples.Length, 0, FFTWindow.BlackmanHarris);
        samples = AudioListener.GetSpectrumData(samples.Length, 0, FFTWindow.BlackmanHarris);        int rBars = this.barSamples / this.barsNumber;
        int index = 0;        for (int i = 0; i < this.barSamples; i += rBars, index++) {
            this.samplesPacked[index] = 0f;
            for (int j = 0; j < this.barsNumber; j++) {
                this.samplesPacked[index] += this.samples[j + i];
            }
            this.samplesPacked[index] = Mathf.Log(this.samplesPacked[index]);
        }        for (int k = 0; k < this.barsNumber; k++) {
            Vector3 v1 = this.barScale + new Vector3(0f, this.samplesPacked[k] * heightMultiplier, 0f);
            //Vector3 v2 = new Vector3(0.1f, this.samplesPacked[k] * heightMultiplier / 2f, 0.1f);
            float speed = Time.deltaTime * this.barSpeed;            this.bars[k].transform.localScale = Vector3.Lerp(this.sBars[k], v1, speed);
            //this.bars[k].transform.localPosition = Vector3.Lerp(this.bars[k].transform.localPosition, this.pBars[k] + v2, speed);
        }
    }
} Los params:HM = 6BarsN = 32BarsS = 4096BarSpeed = 15 
Ah yo de mientras ayer cambié el lerp de localscale. Para que sea más dinámico, lo hago partir del scale inicial, no del que tenga en ese momento. Así lo obligo a ir de 0f de escala a la escala del valor.
El mío se mueve de la leche. Muy chulo.
Título: Ecualizador grafico
Publicado por: Oak Human Flesh en Agosto 05, 2015, 12:16:09 PM
Si no les molesta, me quiero sumar como tester ,
Título: Ecualizador grafico
Publicado por: iRobb en Agosto 05, 2015, 12:18:44 PM
Claro, bienvenido. Cuántos más seamos más nos divertiremos.
A ver si entre todos lo hacemos mucho mejor.
[quote author=Oak Human Flesh" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="15868" data-ipsquote-contentcommentid="101253">Si no les molesta, me quiero sumar como tester , [/quote]Si quieres ver la app completa que hice con la base de audio que conozco, ve a  Título: Ecualizador grafico
Publicado por: Jose134 en Agosto 05, 2015, 12:59:51 PM
Con el codigo que me has dado no me sale el error pero me puse a hacer una cosilla con el movil y la cancion termino y las barras estaban asiprivate bool ended;

void Update () {
    if(!source.isPlaying && !ended){
   ended = true;
}
if(ended){
   for(int i = 0; i < barsNumber; i++){
      float speed = Time.deltaTime * barSpeed;
      bars.transform.localScale = Vector3.Lerp(bars.transform.localScale, Vector3.zero, speed);
   }
}
}
El problema es que a veces como que "parpadea"
Título: Ecualizador grafico
Publicado por: iRobb en Agosto 05, 2015, 01:12:24 PM
Jajajaja. Pero veo que utilizar el lerp de antes, no el nuevo que parte del scale original al del dato. 
A es que quieres que vayan a zero cuando la canción termine!
Lo que tienes que hacer es jugar con los valores de heightm y el speed en el editor, hasta que encuentres un equilibrio entre suavidad y velocidad. 
De todos modos, hay algo extraño en el código, porqué las barras deberían partir de 0f y las veo nerviosas. No quiero mirar mi código de la app para no hacer trampas. A ver si lo resolvemos.
Título: Ecualizador grafico
Publicado por: Oak Human Flesh en Agosto 06, 2015, 02:16:22 PM
Si quieres ver la app completa que hice con la base de audio que conozco, ve a http://unityspain.com/topic/15839-xqualizer-09a/ (//<___base_url___>/topic/15839-xqualizer-09a/)[/quote] He experimentado bastante, " muchas gracias" iRobb muy buen ejemplo.Por mi parte no conocía mucho sobre como obtener el espectro de frecuencias de los sonidos en Unity using UnityEngine;
using System.Collections;
[RequireComponent (typeof (AudioListener))]
public class Visualizer : MonoBehaviour
{

public GameObject barrasEqPrefab;
public int cantidadBarrasEq = 64;
public int samples = 4096;
public int longest = 100;
public float height = 7f;
Vector3 outSpectrum;
float[] spectrum;
float sample = 0f;
public float trim = 450;
LineRenderer lr, lrC1, lrC2;
public bool blkmanHarris, hamming, blkMan, rectangular;

void Start()
{
   outSpectrum = new Vector3 ();
   spectrum = new float[samples];
   lr = GameObject.FindWithTag("lr").GetComponent<LineRenderer> ();
   lrC1 = GameObject.FindWithTag("C1").GetComponent<LineRenderer> ();
   lrC2 = GameObject.FindWithTag("C2").GetComponent<LineRenderer> ();
   lr.SetVertexCount (longest-1);
}

void Update()
{
   FFTWindowSelect ();
   LineRendererMainSamplesAnEditorDraw ();
   ControlBarras (8, 9, 10, 11, -25, 48, lrC1);
   ControlBarras (12, 13, 14, 15, -25, 50, lrC2);
}

void FFTWindowSelect ()
{
   //float[] spectrum = audio.GetSpectrumData(8192, 0, FFTWindow.BlackmanHarris);
   if (blkmanHarris) {
      spectrum = AudioListener.GetSpectrumData (spectrum.Length, 0, FFTWindow.BlackmanHarris);
      
   }
   if (hamming) {
      spectrum = AudioListener.GetSpectrumData (spectrum.Length, 0, FFTWindow.Hamming);
      
   }
   if (blkMan) {
      spectrum = AudioListener.GetSpectrumData (spectrum.Length, 0, FFTWindow.Blackman);
      
   }
   if (rectangular) {
      spectrum = AudioListener.GetSpectrumData (spectrum.Length, 0, FFTWindow.Rectangular);
      
   }

}
void LineRendererMainSamplesAnEditorDraw ()
{
   int i = 1;
   while (i < longest-1) {
      outSpectrum = new Vector3(i, Mathf.Log(spectrum) + height, 0);
      //Debug.DrawLine(new Vector3(i - 1, spectrum + 10, 0), new Vector3(i, spectrum[i + 1] + 10, 0), Color.red);
      Debug.DrawLine(new Vector3(i - 1, Mathf.Log(spectrum[i - 1]) + 1, 2), new Vector3(i, Mathf.Log(spectrum) + height, 2), Color.cyan);
      
      lr.SetPosition(i, outSpectrum);
      //Debug.DrawLine(new Vector3(Mathf.Log(i - 1), spectrum[i - 1] - 10, 1), new Vector3(Mathf.Log(i), spectrum - 10, 1), Color.green);
      //Debug.DrawLine(new Vector3(Mathf.Log(i - 1), Mathf.Log(spectrum[i - 1]), 3), new Vector3(Mathf.Log(i), Mathf.Log(spectrum), 3), Color.yellow);
      i++;
   }
}
void ControlBarras (int a, int b, int c, int d, float minPos0, float PosXLineRend1, LineRenderer lRend)
{
   sample = spectrum [a] + spectrum + spectrum [c] + spectrum [d] * trim + minPos0;
   Vector3 c1 = new Vector3 (PosXLineRend1, sample, 0);
   lRend.SetPosition (1, c1);
}
void CreateBars (GameObject inputBarGobj, int cantBarras)
{
   int i = 0;
   while (i < cantBarras) {
      GameObject clon = Instantiate (inputBarGobj, new Vector3 (0, 0, 0), Quaternion.identity) as GameObject;
      clon.gameObject.name = "C" + i;
      clon.GetComponent<LineRenderer>().SetPosition(0, new Vector3(1f * i + i, 0f, 0f));
      clon.GetComponent<LineRenderer>().SetPosition(1, new Vector3(1f * i + i, 5f, 0f));
      i++;
   }
}
void OnGUI ()
{
   if (GUILayout.Button ("CREAR BARRAS")) {
      CreateBars(barrasEqPrefab, cantidadBarrasEq);
   }
}
}en las líneas donde se obtienen los samples (spectrum = AudioListener.GetSpectrumData (spectrum.Length, 0, FFTWindow.xxxx)), arroja un caution que aun no me lo he podido sacar, dice que esta forma de obtener los samples esta obsoleta Oo.
Assets/scripts/Visualizer.cs(53,50): warning CS0618: `UnityEngine.AudioListener.GetSpectrumData(int, int, UnityEngine.FFTWindow)' is obsolete: `GetSpectrumData returning a float[] is deprecated, use GetOutputData and pass a pre allocated array instead.'[/quote]Conoces la forma no obsoleta de obtener los samples????
Título: Ecualizador grafico
Publicado por: iRobb en Agosto 06, 2015, 02:25:20 PM
Me voy a mirar tu código esta tarde que lo veo muy interesante. Respecto al obsolete, lo llevo viendo desde la 4.6. Lo intenté con esa función que menciona pero no ví que devolviera el mismo nivel de detalle. Ah y lo del cambio de tipo fft parece muy interesante.
Título: Ecualizador grafico
Publicado por: Oak Human Flesh en Agosto 06, 2015, 02:33:56 PM
He exportado el proyecto y lo he subido para que puedas analizar mejor, esta en la ultima version de Unity 5 Pppppppppersoooonal Lol
EqGraph.unitypackage
Título: Ecualizador grafico
Publicado por: iRobb en Agosto 06, 2015, 08:06:35 PM
Ahora voy a por él 
Oye quedan muy bien las barras. Por otro lado, para los canales right/left, yo hice otra implementación aparte de la fft. Te interesa?
Título: Ecualizador grafico
Publicado por: Oak Human Flesh en Agosto 06, 2015, 09:11:20 PM
Título: Ecualizador grafico
Publicado por: iRobb en Agosto 06, 2015, 09:20:22 PM
Ok! Mira:        float rawValue = 0f;        AudioListener.GetOutputData(audioData, channel);        for (int x = 0; x < audioData.Length; x++) {
            // -1 to 1 = 0 to 1
            rawValue += audioData        } Donde channel es left = 0 y right = 1 y lo empaquetas en una matriz de float también. Como los valores son entre -1 y 1, los elevamos al cuadrado para dejarlos entre 0 y 1 y eliminar los negativos. Y luego para el RMS (seguro que algo de audio sabes :D) aplicas la siguiente fórmula:        //RMS = squareroot(avg(sum(audioData
Título: Ecualizador grafico
Publicado por: Oak Human Flesh en Agosto 06, 2015, 09:28:38 PM
Whoaa!, a penas pueda lo pruebo,  muy bueno el ejercicio, muchas gracias 
Título: Ecualizador grafico
Publicado por: Oak Human Flesh en Agosto 06, 2015, 11:03:45 PM
Jajajaja ya me suponía que eso de obtener el valor RMS era mucho más que solo tratar de obtener el valor de peak y luego multiplicarlo por .707 
Título: Ecualizador grafico
Publicado por: Oak Human Flesh en Agosto 09, 2015, 07:16:32 PM
 
Y luego para el RMS (seguro que algo de audio sabes :D) aplicas la siguiente fórmula://RMS = squareroot(avg(sum(audioData
Título: Ecualizador grafico
Publicado por: iRobb en Agosto 10, 2015, 12:03:08 AM
Pues yo creo que ya tienes todas las piezas del puzzle. Y añado:Si sustituyes AudioListener por un AudioSource que contenga el audioclip ya no será deprecated.