Convertir valores de ReplayGain a ajustes de volumen
Estoy tratando de implementar Replay Gain (es decir, respondiendo a las etiquetas replaygain en archivos de música) en la aplicación de reproductor de música Android / AOSP. Esto es sólo un proyecto personal, pero por la línea que podría ofrecer como un parche o tal vez hacer una lib o jugador de la mía. Sólo estoy mirando Track Gain en primera instancia. La naturaleza de mi pregunta es probablemente hasta el hecho de que flunked matemáticas;)
La tarea consiste en hacer dos cosas: A) Antes de iniciar la reproducción, sujete el volumen al máximo del dispositivo -14dB (o tal vez más, algunas fuentes aconsejan -23dB). B) Antes de comenzar la reproducción de cada pista, lea su etiqueta y ajuste por ese número de dB.
- ¿Puede explicar (cálculos matemáticos) ejemplo de gesto (Levenshtein)?
- Determinación de números pares / impares (enteros)?
- ¿Cómo obtengo el ángulo del teléfono en relación con el campo magnético de la Tierra?
- Latitud / Longitud y metros
- ¿Cómo inserto caracteres especiales como texto en el editor de XML para Android?
Veo que el ajuste del volumen de reproducción en Android implica escala de logaritmo, así , pero como soy nuevo en logaritmos no estoy seguro de si eso hace las cosas más fáciles o dos veces (10x?) Tan difícil.
¿Puede alguien por favor darme la pista que me falta sobre la forma de traducir los valores de decibelios a los parámetros utilizables para MediaPlayer.setVolume ()? Gracias por cualquier sugerencia.
EDIT: Tengo algunas afirmaciones (probablemente inestable) que podrían hacer que la conexión sea necesaria, pero necesito que me digan si alguno de ellos está desprevenido.
- ReplayGain funciona en una suposición de que el nivel objetivo de -14 dBFS == 89dB SPL. Por lo tanto, pretendo que estas escalas son equivalentes todo el camino arriba y abajo (sé que esto es inexacto, pero ¿cuán imprecisa?)
- Trato MediaPlayer.setVolume (1.0f, 1.0f) (el volumen máximo) como 0dBFS.
- Basándome en (1), comparo esto con 89 + 14 = 103dBSPL.
- Trato MediaPlayer.setVolume (0.0f, 0.0f) (mute) como 0dBSPL, por lo que tengo una escala de volumen lineal abstraído de 0-103.
Si estas mantienen el agua, me gustaría convertir un Track Gain valor de -1,3 en el parámetro adecuado para MediaPlayer.setVolume () de la siguiente manera:
- Sonido de destino = 89 – 1,3 = 87,7
- float newVol = 1.0f – (Math.log (103 – 87.7 / Math.log (103)) = 0.41143207395167
¿Está remotamente en el camino correcto?
- Tengo problemas para entender lo que realmente obtiene GetDisplayRect () de PhotoView (construyendo una herramienta de recorte de fotos de android)
- En C, tan (30) me da un valor negativo! ¿Por qué?
- Calcular el ángulo del punto tocado y rotarlo en Android
- ¿Qué es una buena biblioteca para analizar expresiones matemáticas en java?
- Mover la mano Minuto en el reloj de Android
- ¿Cómo mostrar fórmulas matemáticas en mi aplicación Android?
- Desplazamiento pequeño al calcular la rotación en función del punto de contacto
- Calcular la distancia entre dos puntos directamente en SQLite
- un dBFS significa decibel Full Sound, por lo que asignar que al nivel máximo es totalmente sensato.
- Los decibeles son una unidad que expresa (el log de) la razón de dos valores. Todo lo que está diciendo cuando se utiliza dBFS vs dBSPL es qué referencia de presión acústica que utiliza.
- -14 dBFS significa que está utilizando una presión acústica 10 ^ (- 14/20) veces menor que la que su referencia es (es decir, el máximo posible)
- 89 dBSPL significa que está utilizando un valor 10 ^ (89/20) veces mayor que "la presión de sonido de referencia comúnmente utilizada en el aire […] p0 = 20 μPa (RMS) o 0.0002 dynes / cm2, [5] que es generalmente considerado el umbral del oído humano (aproximadamente el sonido de un mosquito que vuela a 3 m de distancia) ". (de wikipedia).
Así que una vez que tienes un punto común entre sus dos escalas, que luego evolucionar el mismo. Definiste básicamente una relación entre las presiones acústicas de referencia de tus dos escalas diciendo que -14dbFS = 89 dBSPL.
Debido a que las escalas multiplicativas son una molestia, tomamos el logaritmo de estos valores multiplicativos, y los dividimos por 10, lo que nos da los valores aditivos llamados decibeles (el factor extra 2 viene del hecho de comparar el cuadrado de las presiones acústicas y no las presiones acústicas sí mismos).
Ahora, finalmente, si usted considera que tiene un rango de 103 dB que se correlaciona logarítmicamente (al igual que su dB) de 0.0f a 1.0f (que es lo que parece ser el caso para el volumen de reproducción en Android), entonces -14dBFS es ( 103 – 14) / 103.
Necesitas entrar en la matemática del log sólo si quieres hacer una escala lineal fuera de esto: 80% del sonido máximo en una escala lineal sería 1-log (20) / log (100) en la escala de salida.
Estoy trabajando en este mismo tema y creo que lo conseguí.
Lo primero que debe darse cuenta es que no es posible amplificar un archivo de audio ajustando el volumen de un jugador. Simplemente no puedes. Volumen va de 0% a 100%, y eso es todo.
Lo que realmente haces es atenuar todo. Para ello, tendrá que decidir qué volumen debe ser 0dB. Es decir, cuál debe ser el volumen para un archivo de audio donde no se aplica atenuación ni amplificación.
Digamos que usted quiere que 0dB sea 60%. Esta será su "base".
Sabiendo que vol% = 100 * 10 ^ (db / 20) - base
, entonces podemos calcular nuestra fórmula para obtener el volumen para un valor dado de dB:
vol% = 100 * 10 ^ (REPLAYGAIN_TRACK_GAIN / 20) - 60
También es posible que desee saber cuál es su rango de dB. Podemos hacerlo aislando la variable db
de la fórmula anterior:
db = 20 * Log(vol% + base) / (Log(2) + Log(5)) - 40
Conectando los valores de volumen y base a la fórmula anterior, tendremos que un 0% de volumen (mute) corresponde a -4.44dB y 100% (volumen máximo) corresponde a + 4.02dB.
Esto es útil porque usted necesita saber qué valores dB su fórmula será capaz de manejar. Por esta misma razón, tendrá que modificar la fórmula vol%
para que "ajuste" los valores de dB que están fuera de su rango admitido:
vol% = Min(100, Max(0, 100 * 10 ^ (REPLAYGAIN_TRACK_GAIN / 20) - 60)
- Insertar una nueva foto de contacto para Android
- Enviar correo electrónico con adjuntos – cambios entre ICS y JB?