rox

Uma visualização que mora dentro do player

A maioria dos players te dá um analisador de espectro e para por aí. O rox tem esses painéis, um motor Milkdrop para vinte anos de presets, e debaixo deles uma camada de modulação: sinais nomeados tirados do áudio, roteados para entradas de shader que você mesmo escreve, salvos no mesmo arquivo em que mora o resto do seu tema.

Primeiro os painéis comuns

Um painel de espectro com estilos de barra ou bloco, gradientes, marcas de pico com gravidade própria, rótulos de frequência, e zoneamento dividido que analisa acima e abaixo de uma frequência escolhida com tamanhos de janela diferentes, de modo que cada ponta da faixa troca reatividade por resolução nos próprios termos. Uma tira de forma de onda que desenha a faixa inteira, por canal, e busca onde você clicar. Um medidor VU. Uma prateleira de capas que as gira em 3D de verdade. Nada disso precisa de uma linha de código, e é o que a maioria das pessoas vai usar.

Pausar congela as barras onde estavam, em vez de deixá-las cair até o chão. Isso soa pequeno até você querer olhar exatamente o instante em que pausou.

Milkdrop, num painel e atrás de tudo

Um painel Milkdrop renderiza presets pelo libprojectM numa thread própria e desenha o resultado pela mesma cadeia de shaders que todo o resto: ele encaixa, vira aba e se solta como qualquer outro painel, e um shader de superfície passa por cima do mesmo jeito. Solte um pacote de presets na pasta indicada na página Presets, o Cream of the Crop ou o conjunto original do MilkDrop, e aperte Reescanear. Texturas que vêm dentro de um pacote são encontradas sozinhas.

Escolher preset abre um navegador em janela própria: uma árvore de pastas ou uma grade de miniaturas, um filtro, uma chave de favoritos e navegação pelo teclado. Clicar num preset já o carrega atrás da janela, então o que você vê é o render de verdade e não uma prévia. A rotação define o que Próximo, Anterior e a troca por tempo percorrem, e a trava segura um preset de uma faixa para a outra.

O mesmo motor roda como fundo atrás de cada janela, composto sobre a capa desfocada na intensidade que você define. Um preset pode manter as próprias cores, inverter para o tema claro, pintar na paleta ou pegar a cor da capa que toca mantendo o próprio detalhe, e um tom de álbum puxa os matizes para a capa. Uma fila parada faz ele sumir num fade e a thread de render para, então um visual parado não custa nada.

Shaders, em quatro superfícies

Um shader do rox é um estágio de fragmento WGSL. Ele pode rodar sobre o corpo de um único painel, como um painel de Shader próprio, como um overlay sobre a janela inteira, ou como um fundo pintando debaixo de todos os painéis, atrás da capa. Overlay e fundo têm cada um uma chave que os estende para todas as janelas abertas do rox. Mesma linguagem, mesmo bloco de uniforms, mesmo roteamento em todos eles.

Todo shader recebe o relógio, a resolução, o ponteiro, e oito floats de metadados que descrevem o momento: volume, onde o cursor está dentro da faixa, se o áudio está de fato se movendo, a duração da faixa, e quão escura a paleta atual renderiza. Assim um shader consegue se vestir para claro e escuro, em vez de servir só ao tema contra o qual foi escrito.

Um shader de painel também pode ler o que o painel realmente desenhou. Um vínculo de máscara entrega a ele a própria pintura do painel reproduzida sobre transparência, e os painéis publicam a forma do conteúdo deles, então uma sombra ou um brilho segue uma capa em letterbox em vez das barras vazias dos dois lados.

Passando de um estágio, um comentário // @pass divide o texto numa cadeia de até oito, cada um capaz de ler pelo nome os passes anteriores. É disso que uma pirâmide de blur ou um bloom de dois estágios precisa. Uma linha // @asset nomeia uma imagem para amostrar, e // @asset art: @cover vincula a capa da faixa que toca, revinculando quando a faixa vira. Nove exemplos vêm com o aplicativo, cada um demonstrando uma parte diferente desse contrato em vez de nove variações de um plasma.

Aponte o painel para um arquivo no disco e o rox fica de olho nele. Salve no seu editor e a janela já tem. Um salvamento que não compila deixa a última versão boa na tela com o erro no painel, porque perder a imagem é um jeito ruim de descobrir que você digitou um ponto e vírgula errado.

Os sinais são a parte diferente

Um shader com um relógio dentro é um protetor de tela. O que o torna uma visualização é o que você dá de comer a ele, e no rox isso é um conjunto de sinais nomeados compartilhado pelo aplicativo inteiro. Você os monta numa janela própria, em Aplicativo, ao lado do equalizador, e ela traz um espectro e um transporte pelo mesmo motivo que o equalizador traz: você escolhe uma banda de olho e de ouvido, contra aquilo que está realmente tocando.

Cinco tipos de fonte. Uma banda é a energia entre duas frequências, o sinal em que uma onda cavalga. Nível é a mistura inteira. Um onset pulsa quando uma banda salta acima da média recente dela, o sinal em que uma batida cavalga. Um gatilho pulsa quando uma banda cruza uma linha que você desenhou, para material em que a média móvel nunca chega a cair e um onset silencia depois do primeiro compasso. Um total soma outro sinal ao longo do tempo e dá a volta em um, então um shader pode lê-lo como uma fase que avança enquanto a música está alta e empaca enquanto não está.

Cada um traz uma suavização de resposta e um gate. O gate é a configuração que merece o lugar dela: uma banda cavalgando no ruído da sala segura todo controle preso a ela ligeiramente fora do repouso para sempre, e um limiar com uma curva acima dele entrega silêncio entre as batidas no lugar disso. O medidor desenha o valor sem gate com o limiar marcado por cima, já que uma barra que sumiu debaixo do próprio gate não ajudaria em nada a posicionar o gate.

Uma rota liga um sinal a um parâmetro com um intervalo de saída: este sinal, este alvo, daqui até ali. Dezesseis slots chegam a todo shader, e os slots para os quais nada está roteado ganham um controle simples na página de configurações, então um visual pode ser metade regido pela música e metade ajustado na mão.

Critters, como argumento

Um dos espaços de trabalho que já vêm com o rox é o player inteiro renderizado como uma impressão de 1 bit: um dither ordenado sobre cada superfície, tons que esmagam com o sub-grave, e uma parede de ruído atrás dos painéis que se move com a música. São cinco sinais e quatro shaders num arquivo só, e nada disso é um caso especial dentro do aplicativo.

O espaço de trabalho Critters do rox: a janela inteira renderizada em dither ordenado preto e branco, com uma prateleira curva de capas sobre uma barra de posição, uma fileira de transporte, uma tira de forma de onda e uma tabela de faixas, tudo em cima de um campo de ruído que se desloca.

Carregue pela janela de boas-vindas, depois abra as configurações e desmonte. O resto deles.

Rodando o shader de um estranho

Os shaders viajam dentro dos arquivos de espaço de trabalho, o que significa que um visual importado chega carregando código de outra pessoa.

Nada roda antes de você mandar. O código de cada shader recebe uma impressão digital, e a lista de aprovados é local da máquina e só é escrita por uma ação direta: você escolheu o arquivo, você recarregou, você escolheu uma predefinição, você apertou Aprovar. Um visual que chegou num pacote fica ali inerte, com um botão embaixo, até então. Os exemplos que vêm com o rox são confiáveis por construção, porque estão compilados dentro do binário.

Ligar um deles abre uma janela de confirmação que espera por uma resposta em vez de contar o tempo, e essa janela nunca é sombreada. Faça o shader o que fizer com o resto da tela, o caminho de volta continua legível.

O que não está coberto

  • As rotas alcançam os slots dos shaders e os controles do painel de partículas. As configurações de todo outro painel continuam sendo controles que você ajusta na mão.
  • Presets Milkdrop, não AVS. Não existe importador para o AVS do Winamp. E um preset é um arquivo no seu disco, então qual está carregado fica por máquina em vez de viajar dentro de um espaço de trabalho.
  • Sem superfície de controle MIDI ou OSC. O passe de overlay e os passes de painel são o que existe, movidos pelo áudio e pelo ponteiro.
  • Um passe de janela inteira é um passe de GPU de verdade a cada quadro. Num laptop na bateria, isso é uma escolha que você está fazendo.

A distância entre “quero o player inteiro piscando no bumbo” e ter isso é uma banda, um gate e uma rota, e nenhum dos três precisa recompilar nada.

Experimente na sua própria coleção

Nada aqui liga para lugar nenhum: a análise é o áudio que já está passando pelo player. Mais sobre o que um espaço de trabalho carrega.

Baixar o rox

Está no Arch ou no NixOS? Instale pelo AUR ou pelo flake do Nix.

v1.26.4 · Linux, macOS, Windows · todos os downloads