Jump to content
Sign in to follow this  
Jose134

Color segun intensidad de la musica

Recommended Posts

Hola a todos estaba intentando hacer que se generase un color segun la intensidad de la musica de un AudioSource. He hecho esto pero como aun no entiendo muy bien como funciona todo el tema de audio no se por que no termina de funcionar bien

 

using UnityEngine;
using System.Collections;

public class MusicColor : MonoBehaviour {

    public AudioSource source;
    public Color a;
    public Color b;

    public float[] spectrum;

    public Color color;
    public float multiplier;

    void Awake ()
    {
        spectrum = new float[64];
    }

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

        float spectrumMid = 0f;
        for (int i = 0; i < spectrum.Length; i++)
        {
            spectrumMid += spectrum[i] * multiplier;
        }
        spectrumMid = spectrumMid / spectrum.Length;

        color = Color.Lerp(a, b, spectrumMid);
        GetComponent<Camera>().backgroundColor = color;
    }
}

 

El problema de esto es que se ve muy "flickery" pero no entiendo por que

(La variable multiplier esta puesta en 1000)

Share this post


Link to post
Share on other sites

supongo que con flickery querras decir muy titilante o lago así, si es esto la razón por que la data del esectro salta de un valor a otro en intervalos grandes y no suavemente, lo que hay que hacer es aplicar un filtro.

El codigo de aplicación de un filtro a una señal lo podés encontar aqui : http://re-sounding.com/2013/12/14/unity-controlling-game-elements-with-sound/

fijate en el último códigop del post que está después del video de demostración.  El filtro está exactamente en la línea 28.

Espero te sirva. Saludos desde Argentina.

PD lo que querés hacer vos es mucho más facil en Processing: www.processing.org al menos que lo que estés haciendo sea parte de un proyecto unity.

Share this post


Link to post
Share on other sites

Ayer poniendo unos paneles absorventes en la seccion de viento del Conservatorio de Elche, el director me comento que habia cambiado el color del sonido de la sala. 

Share this post


Link to post
Share on other sites

supongo que con flickery querras decir muy titilante o lago así, si es esto la razón por que la data del esectro salta de un valor a otro en intervalos grandes y no suavemente, lo que hay que hacer es aplicar un filtro.

El codigo de aplicación de un filtro a una señal lo podés encontar aqui : http://re-sounding.com/2013/12/14/unity-controlling-game-elements-with-sound/

fijate en el último códigop del post que está después del video de demostración.  El filtro está exactamente en la línea 28.

Espero te sirva. Saludos desde Argentina.

PD lo que querés hacer vos es mucho más facil en Processing: www.processing.org al menos que lo que estés haciendo sea parte de un proyecto unity.

Aplique el tutorial a mi codigo y ha mejorado bastante el efecto consiguido pero al ser el color de toda la pantalla se sigue viendo muy "parpadeante", hay algun modo de suavizarlo aun mas?

 

Ayer poniendo unos paneles absorventes en la seccion de viento del Conservatorio de Elche, el director me comento que habia cambiado el color del sonido de la sala. 

Tal vez pueda aplicar eso a Unity :P

Edited by Jose134

Share this post


Link to post
Share on other sites

Ayer poniendo unos paneles absorventes en la seccion de viento del Conservatorio de Elche, el director me comento que habia cambiado el color del sonido de la sala. 

Dame de eso que fuma ese sñor

Share this post


Link to post
Share on other sites

UNa froma sencilla de aplicar un mayor suavizado es en la ecuación de filtrado del código del tutorial aplicar distintos valores al factor de filtrado:

smooth[0] = ((0.01f * absInput) + (0.99f * smooth[1]));

los dos valores numéricos en coma flotante de la ecuación son el "factor de filtrado" entonces prueba modofocando dichos valores.

Otra forma que puede ser combinada con la anterior es tomar para la interacción el promedio de lo que sería el buffer de sonido entero y no sample por sample como se hace en el tutorial.Este sería el código:

en C#:

using UnityEngine; using System.Collections; public class VolDisplay : MonoBehaviour { private float amp; private float[] smooth = new float[2]; private float aux; void Start () { // initalising the filter for (int i = 0; i

Edited by lozdanmultimedial
había una linea de código tipeada erroneamente

Share this post


Link to post
Share on other sites

Estimado Jose 134, por eses circunstancias de la vida ( digamoslo así ) necesito implementar un  vúmetro (indicador de nivels de sonido) , necesitaria saber como esta iserto el script al proyecto unity es decir si esta adjuntado a un game object vacio o lo que fuere. Muchas gracias.

Share this post


Link to post
Share on other sites
Sign in to follow this  

UnitySpain © Todos los derechos reservados 2020
×
×
  • Create New...