Un visualizador que vive dentro del reproductor
Casi todos los reproductores te dan un analizador de espectro y ahí se quedan. rox tiene esos paneles, un motor Milkdrop para veinte años de presets, y debajo una capa de modulación: señales con nombre sacadas del audio, enrutadas a entradas de shader que escribes tú, guardadas en el mismo archivo donde vive el resto de tu tema.
Primero, los paneles normales
Un panel de espectro con estilos de barra o de bloque, degradados, marcas de pico con su propia gravedad, etiquetas de frecuencia, y zonas partidas que analizan por encima y por debajo de una frecuencia elegida con ventanas de distinto tamaño, así que cada extremo del rango cambia reactividad por resolución en sus propios términos. Una tira de forma de onda que dibuja la pista entera, por canal, y que va adonde hagas clic. Un medidor VU. Un estante de carátulas que las gira en 3D de verdad. Nada de esto necesita una línea de código y es lo que usará la mayoría.
Pausar congela las barras donde estaban, en vez de dejarlas caer al suelo. Suena a poco hasta que intentas mirar el momento exacto en el que pausaste.
Milkdrop, en un panel y detrás de todo
Un panel Milkdrop renderiza presets a través de libprojectM en su propio hilo y dibuja el resultado por la misma cadena de shaders que todo lo demás: se acopla, se pone en pestaña y se desprende como cualquier otro panel, y un shader de superficie pasa por encima igual. Suelta un paquete de presets en la carpeta que indica la página Presets, Cream of the Crop o el juego original de MilkDrop, y pulsa Reescanear. Las texturas que vienen dentro de un paquete se encuentran solas.
Elegir preset abre un explorador en su propia ventana: un árbol de carpetas o una cuadrícula de miniaturas, un filtro, un interruptor de favoritos y navegación con teclado. Hacer clic en un preset lo carga al momento detrás de la ventana, así que lo que ves es el render real y no una vista previa. La rotación decide qué recorren Siguiente, Anterior y el cambio temporizado, y el bloqueo mantiene un preset de una pista a otra.
El mismo motor corre como fondo detrás de cada ventana, compuesto sobre la carátula desenfocada con la intensidad que tú fijes. Un preset puede conservar sus propios colores, invertirse para el tema claro, pintar en la paleta o tomar el color de la carátula que suena conservando su propio detalle, y un tinte de álbum desplaza los tonos hacia la carátula. Una cola detenida lo funde a negro y el hilo de render se para, así que un visual parado no cuesta nada.
Shaders, en cuatro superficies
Un shader de rox es una etapa de fragmento WGSL. Puede ejecutarse sobre el cuerpo de un solo panel, como panel de Shader propio, como superposición sobre toda la ventana, o como fondo pintando bajo todos los paneles, detrás de la carátula. La superposición y el fondo tienen cada uno un interruptor que los extiende a todas las ventanas que rox tenga abiertas. El mismo lenguaje, el mismo bloque de uniforms y el mismo enrutado en todos ellos.
Cada shader recibe el reloj, la resolución, el puntero y ocho floats meta que describen el momento: volumen, dónde está el cabezal dentro de la pista, si el audio se está moviendo de verdad, la duración de la pista, y cuán oscura se dibuja la paleta actual, así que un mismo shader puede vestirse para claro y oscuro en vez de estar hecho solo para el tema contra el que se escribió.
Un shader de panel también puede leer lo que el panel dibujó en realidad. Un enlace de máscara le entrega la pintura del propio panel repetida sobre transparencia, y los paneles publican la forma de su contenido, así que una sombra o un resplandor sigue a una carátula con bandas y no a las franjas vacías de los lados.
Pasada una etapa, un comentario // @pass parte el texto en una cadena de hasta ocho, cada una capaz de leer por nombre las pasadas anteriores. Eso es lo que necesita una pirámide de desenfoque o un bloom en dos etapas. Una línea // @asset nombra una imagen que muestrear, y // @asset art: @cover enlaza la carátula de la pista que suena, reenlazándola cuando la pista cambia. Vienen nueve ejemplos con la aplicación, cada uno demostrando una parte distinta de ese contrato en vez de nueve variaciones sobre un plasma.
Apunta el panel a un archivo del disco y rox lo vigila. Guarda en tu editor y la ventana ya lo tiene. Un guardado que no compila deja la última versión buena en pantalla con el error en el panel, porque perder la imagen es una mala forma de enterarte de que has escrito mal un punto y coma.
Las señales son la parte diferente
Un shader con un reloj dentro es un salvapantallas. Lo que lo convierte en visualizador es lo que le des de comer, y en rox eso es un conjunto de señales con nombre compartido por toda la aplicación. Las construyes en una ventana propia, dentro de Aplicación, junto al ecualizador, y lleva un espectro y un transporte por la misma razón que el ecualizador: eliges una banda a ojo y de oído contra lo que estás reproduciendo de verdad.
Cinco clases de origen. Una banda es la energía entre dos frecuencias, que es la señal sobre la que cabalga un crescendo. Nivel es toda la mezcla. Un ataque pulsa cuando una banda salta por encima de su propia media reciente, que es la señal sobre la que cabalga un golpe. Un disparo pulsa cuando una banda cruza una línea que dibujaste tú, para material donde la media móvil nunca llega a bajar y un ataque se queda callado tras el primer compás. Un total suma otra señal a lo largo del tiempo y da la vuelta en uno, así que un shader puede leerlo como una fase que avanza mientras la música está fuerte y se estanca mientras no lo está.
Cada una lleva suavizado de respuesta y una puerta. La puerta es el ajuste que se gana su sitio: una banda cabalgando el ruido de sala mantiene para siempre todos los mandos que cuelgan de ella ligeramente fuera de su reposo, y un umbral con una curva encima entrega silencio entre los golpes. El medidor dibuja el valor sin puerta con el umbral marcado encima, porque una barra que desapareciera bajo su propia puerta no ayudaría nada a colocar la puerta.
Una ruta une una señal con un parámetro y un tramo de salida: esta señal, este destino, de aquí hasta allá. Dieciséis slots llegan a cada shader, y los slots a los que no se enruta nada reciben un deslizador normal en la página de ajustes, así que un aspecto puede estar medio interpretado y medio puesto a mano.
Critters, como argumento
Uno de los espacios de trabajo incluidos es el reproductor entero renderizado como una impresión de 1 bit: un tramado ordenado sobre cada superficie, tonos que se aplastan con los subgraves, y un muro de ruido detrás de los paneles que se mueve con la canción. Son cinco señales y cuatro shaders en un solo archivo, y nada de eso es un caso especial dentro de la aplicación.

Cárgalo desde la ventana de bienvenida, luego abre los ajustes y destrípalo. El resto de ellos.
Ejecutar el shader de un desconocido
Los shaders viajan dentro de los archivos de espacio de trabajo, lo que significa que un aspecto importado llega con código de otra persona.
Nada se ejecuta hasta que tú lo dices. El código de cada shader lleva una huella, y la lista de aprobados es local a la máquina y solo se escribe por una acción directa: elegiste el archivo, pulsaste recargar, elegiste un preajuste, pulsaste Aprobar. Un aspecto que llegó en un paquete se queda ahí inerte con un botón debajo hasta entonces. Los ejemplos que vienen con rox son de confianza por construcción, porque están compilados dentro del binario.
Encender uno abre una ventana de confirmación que espera una respuesta en vez de contar atrás, y esa ventana nunca se sombrea. Haga lo que haga el shader con el resto de la pantalla, el camino de vuelta sigue siendo legible.
Qué no está resuelto
- Las rutas llegan a los slots de shader y a los mandos del panel de partículas. Los ajustes de todos los demás paneles siguen siendo mandos que pones a mano.
- Presets de Milkdrop, no AVS. No hay importador para el AVS de Winamp. Y un preset es un archivo en tu disco, así que cuál está cargado se queda por máquina en vez de viajar dentro de un espacio de trabajo.
- Sin superficie de control MIDI ni OSC. Lo que existe es la pasada de superposición y las pasadas de panel, movidas por el audio y el puntero.
- Una pasada a ventana completa es una pasada de GPU real en cada fotograma. En un portátil con batería, eso es una decisión que estás tomando.
La distancia entre "quiero que el reproductor entero destelle con el bombo" y tenerlo son una banda, una puerta y una ruta, y ninguna de las tres necesita recompilar nada.
Pruébalo con tu propia biblioteca
Aquí nada llama a ningún sitio: el análisis es el audio que ya está pasando por el reproductor. Más sobre qué lleva un espacio de trabajo.
¿En Arch o NixOS? Instálalo desde el AUR o el flake de Nix en su lugar.