Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Linealizacion de volumen !?

Iniciado por Pogacha, 26 de Agosto de 2007, 07:57:23 PM

« anterior - próximo »

Pogacha

Como puta (con perdon de las putas) hago para linealizar psicoacusticamente el volumen?
O sea, que con el volumen a 1.0f sea lo mas fuerte y con 0.5f de la impresion de que esta a la mitad.

Con el paneo estoy teniendo el mismo problema  :(

Me voy a la teoria y no anda, a ejemplos de otros y no anda, se me quemaron los papeles.

Estoy con dsound.

¿Alguien me puede aclarar el tema?

ethernet

no va con una escala logarítmica?

quizás la última parte de este artículo te puede ayudar:
http://kebby.org/articles/fr08snd4.html

como dice kb, linear is bad !

Pogacha

Pasa que a dsound le tengo que pasar decibeles de atenuación, o sea de nada de atenuación (maximo volumen), a 100dB de atenuación.
Como se comen esos?
Yo de volumen tengo un flotante de 0 a 1 y quiero que se cumpla que para un volumen X el volumen X/2 parezca tener la mitad de intensidad.
El link no me despeja la duda :( , gracias igual.
Saludos

[EX3]

Y no te serviria una escala de enteros? de 0 a 100 por ejemplo, que es lo que uso yo en la dx_lib32.

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

Pogacha

No, pues no es lineal :(

Es posible de que lo que estoy buscando no existe  :cry:

Por ahora encontré una solución revisando otros códigos. Pongo un limite inferior para callarlo y luego una escala logaritmica que tampoco es exacta pero me permite variar el volumen de un lado a otro con distinta percepción volumen.

static inline int VolumeToDB(const float vol) {
if(vol<0.02f) return DSBVOLUME_MIN;
return static_cast<int>( 6000.0f*(log10(9.0f*vol+1.0f) - 1.0f) ) ;
}


Me falta teoría y por mas que busque no encontré nada que se aplique a esto.
Saludos

ethernet

Si a  dsound le tienes que pasar atenuación en db tendrás que calcularla en función de tu variable. Sabes que 0 db es el máximo volumen, si le pasas 3db de atenuación (-3db ) será la mitad. La fóruma de memoria es 20*log(volumen/cte).

De todas formas no sé que te pasa exactamente.

Pogacha

CitarDe todas formas no sé que te pasa exactamente.

Tengo una linda barra de control de volumen, la cual me devuelve un valor de 0 a 1 proporcional a la posición de la perilla.
El problema es que estando contra un lado el sonido es fuerte, al 3/4 de la barra es 1/3 de volumen aparentemente, al medio es 1/8 de volumen y al 1/4 de la barra ya ni se oye.

Lo que quiero es que a un lado el sonido sea fuerte, al 3/4 de la barra sea 3/4 del volumen aparentemente, al medio sea 1/2 del volumen y al 1/4 de la barra sea un cuarto del volumen, para terminar con nada de volumen al otro lado de la barra.

Según las formula:
Lw[dB] = 10 * Log( Volume )
W = 10 ^ (dB/10)


Para que se cumpla:
F(1) = 0dB
F(3/4)= -5/4dB
F(1/2) = -3dB
F(1/4) = -6dB
F(1/8) = -9dB
F(1/16) = -12dB
F(0)    = -100dB


Tengo que 10 ^ ( -100dB / 10 )  = 0.0000000001 = 1.0E-10;

if(Volume > 1.0E-10) dB = 10 * Log( Volume );
   else dB = -100;


Luego tienes que tener en cuenta que DSound usa hundreths of dB, o sea centimos de dB, o sea que hay que multiplicarlo por 100.

Pero por mas que está muy lindo, no anda!

Si escuchando sonidos constantes e iguales pongo la barra en una posicion arbitraria y luego la llevo instantaneamente a la mitad, el sonido parece tener 3/4 del volumen original o mas, y no la mitad como seria util.

Me puse a jugar con la ecuación y decidí aumentarle la constante de 10 a 20, y como note una mejoría luego la puse en 40 (con el minimo en 0.31e-2) y ahí recién parece que estuviera comportándose como yo quiero. Podes variar el volumen en un amplio rango y siempre varia notoriamente, si cambias en el extremo donde hay mayor volumen la variación será menor, pero de todas formas es algo que uno espera.

Igual sigo pensando que algo lo estoy entendiendo mal, que me estoy perdiendo de algún concepto, en general los potenciómetros(las perillas de los equipos electrónicos) de audio son logarítmicos para que tengan mayor utilidad, para que se adapten a las necesidades de variar logarítmicamente el volumen pues sino quedarian grandes zonas de poca variación y pequeñas zonas de mucha variación. Esto te hace entender, que una barra logarítmica es lo que necesitaría y de esa manera enviar a dsound un lineal entre 0 y tantos dB de atenuación tan solo, pero esto tampoco anda para nada. Como saber cuanto será lo que se escucha en tu computadora? para entonces poder poner la linealización de 0 a la cantidad de decibeles que son necesarios para que ya no se escuche nada. Si me paso, a la mitad de la barra estaras sin sonido y se pensará en un error o no se que. Si me falta, uno no podrá regular el sonido a una medida inferior que desee.

ethernet

La teoría resumida es la siguiente: los db son una medida relativa, esto es, no hacen referencia a una medida absoluta. Sí que hay otras medidas parecidas como los dbm que si dan medidas absolutas.

Normalmente cuando se habla de dB se habla de potencia y sabemos que la potencia es proporcional a la tensión al cuadrado:>

10 log (P/P0) => 10* log(V^2/V0^2) => 20*log(V/V0)

Mirando el código de wine se ve más o menos como se monta el tema: http://source.winehq.org/source/dlls/dsound/sound3d.c?v=wine20030219

a partir de la línea 202

También puede depender de la onda que estés usando para medirlo ya que lo estás midiendo a oido. Para ser fieles habría que coger el osciloscopio y ponerlo en la salida de la tarjeta de sonido y ver que pasa para cada valor.

Pogacha

CitarLa teoría resumida es la siguiente: los db son una medida relativa, esto es, no hacen referencia a una medida absoluta. Sí que hay otras medidas parecidas como los dbm que si dan medidas absolutas.

Normalmente cuando se habla de dB se habla de potencia y sabemos que la potencia es proporcional a la tensión al cuadrado:>

10 log (P/P0) => 10* log(V^2/V0^2) => 20*log(V/V0)
Aceptado, pero por eso, teniendo una medida relativa como se cuan fuerte el pibe tiene el equipo en su casa para darle fin a la barra?
O sea, m$ debio poner un modulador para multiplicar la onda y nada mas, con esto de db te atenuación uno no sabe como armar una escala que ande en cada computadora con diferentes equipos de sonidos.

En realidad con lo que tengo estoy creo, muchas gracias de todos modos.
Saludos!






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.