Actualización 8
Insatisfecho de tener que subir pistas al servicio y mirar el nuevo lanzamiento de RekordBox 3, he decidido volver a buscar un enfoque fuera de línea y una resolución más fina: D
Suena prometedor aunque todavía en un estado muy alfa:
Johnick - Buen tiempo
Tenga en cuenta que no hay escala logarítmica ni ajuste de paleta, solo un mapeo bruto de frecuencia a HSL.
La idea : ahora un renderizador de forma de onda tiene un proveedor de color al que se le pregunta por un color para una posición específica. El que está viendo arriba obtiene la tasa de cruce cero para las 1024 muestras al lado de esa posición.
Obviamente, todavía hay mucho por hacer antes de obtener algo robusto, pero parece un buen camino ...
De RekordBox 3 :
Actualización 7
La forma final que adoptaré, al igual que en la Actualización 3
(se ha retocado un poco Photoshop para obtener transiciones suaves entre colores)
La conclusión es que estuve cerca hace meses, pero no consideré ese resultado pensando que era malo X)
Actualización 6
Descubrí el proyecto recientemente, así que pensé en actualizarlo aquí: D
Canción: Chic - Good Times 2001 (mezcla de Stonebridge Club)
Es mucho mejor IMO, los ritmos tienen un color constante, etc. Sin embargo, no está optimizado.
Cómo ?
Todavía con http://developer.echonest.com/docs/v4/_static/AnalyzeDocumentation.pdf (página 6)
Para cada segmento:
public static int GetSegmentColorFromTimbre(Segment[] segments, Segment segment)
{
var timbres = segment.Timbre;
var avgLoudness = timbres[0];
var avgLoudnesses = segments.Select(s => s.Timbre[0]).ToArray();
double avgLoudnessNormalized = Normalize(avgLoudness, avgLoudnesses);
var brightness = timbres[1];
var brightnesses = segments.Select(s => s.Timbre[1]).ToArray();
double brightnessNormalized = Normalize(brightness, brightnesses);
ColorHSL hsl = new ColorHSL(brightnessNormalized, 1.0d, avgLoudnessNormalized);
var i = hsl.ToInt32();
return i;
}
public static double Normalize(double value, double[] values)
{
var min = values.Min();
var max = values.Max();
return (value - min) / (max - min);
}
Obviamente, se necesita mucho más código antes de llegar aquí (subir al servicio, analizar JSON, etc.), pero ese no es el objetivo de este sitio, así que solo estoy publicando las cosas relevantes para obtener el resultado anterior.
Así que estoy usando las primeras 2 funciones del resultado del análisis, ciertamente hay más que ver, pero aún tengo que probar. Si alguna vez encuentro algo más genial que el anterior, volveré y actualizaré aquí.
Como siempre, cualquier sugerencia sobre el tema es más que bienvenida.
Actualización 5
Algún gradiente usando series armónicas
El suavizado de color es sensible a la relación, de lo contrario se ve mal, necesitará algunos ajustes.
Actualización 4
Reescribió la coloración para que ocurra en la fuente y los colores suavizados utilizando un filtro Alfa beta con valores de 0.08 y 0.02.
Un poco mejor cuando se aleja
¡El siguiente paso es obtener una gran paleta de colores!
Actualización 3
Los amarillos representan medios
No tan bueno cuando no está enfocado, todavía.
(la paleta necesita un trabajo serio)
Actualización 2
Prueba preliminar utilizando la segunda pista de coeficiente 'timbre' de pichenettes
Actualización 1
Una prueba preliminar que utiliza un resultado de análisis del servicio EchoNest , tenga en cuenta que no está muy bien alineado (es mi culpa) pero es mucho más coherente que el enfoque anterior.
Para las personas interesadas en utilizar esta gran API, comience aquí: http://developer.echonest.com/docs/v4/track.html#profile
Además, no se confunda con estas formas de onda, ya que representan 3 canciones diferentes.
Pregunta inicial
Hasta ahora, este es el resultado que obtengo usando un FFT de 256 muestras y calculando el centroide espectral de cada fragmento .
Resultado bruto de los cálculos
Se aplicó algo de suavizado (la forma se ve mucho mejor con ella)
Forma de onda producida
Idealmente, así es como debería verse (tomado del software Serato DJ )
¿Sabes qué técnica / algoritmo podría usar para poder dividir el audio cuando la frecuencia promedio cambia con el tiempo? (como la imagen de arriba)
spectral_centroid
código . Lo que realmente me gustaría es mapear el espectro de audio en el espectro de color, por lo que una frecuencia baja es roja, la alta frecuencia es azul, la combinación de ambos es magenta, la frecuencia media es verde, el barrido de registro es arcoiris, el ruido blanco es blanco, el ruido rosa es rosa, el ruido rojo es rojo ... Sin embargo, no puedo entender cómo hacerlo, ya que un espectro es lineal y el otro es log. :) flic.kr/p/7S8oHARespuestas:
Puede probar primero lo siguiente (sin segmentación):
No está claro en la imagen si Serato hace esto, o de hecho va un paso más allá e intenta segmentar la señal; puede que no sea sorprendente que lo haga, ya que conocer los instantes en los que las notas están presentes en una señal de música puede ayudar a sincronizarlas. ! Los pasos serían:
ComplexDomainOnsetDetection
.Una vez que haga que esto funcione, una "fruta baja" sería calcular algunas otras características en cada segmento (momentos, un puñado de MFCC ...), ejecutar k-means en estos vectores de características y decidir el color de el segmento usando el índice de clúster. Ver la sección II del artículo de Ravelli .
fuente