Engenharia
Por que o DanceGAI usa um Planner + Noter para gerar beatmaps
O ManiaGAI planeja o gameplay de cada seção com um modelo de difusão e depois posiciona as notas com um transformer estilo MaskGIT. O porquê e os trade-offs.
A forma mais natural de descrever um gerador de beatmaps com IA é “entra áudio, passa por uma rede neural, saem notas”. O ManiaGAI não funciona assim. Ele divide o trabalho em dois: um Planner decide como cada parte da música deve ser de jogar, e um Noter decide exatamente onde as notas vão. Este post explica por quê, o que cada modelo faz e quanto essa divisão custa.
Um beatmap é um arranjo, não uma transcrição
Um chart que segue o áudio de perto não é necessariamente um bom chart. Um bom mapa de osu! mania está mais perto de um arranjo: o mapper decide quais sons merecem notas, o quanto uma seção deve parecer densa, onde cabe um jack ou uma long note, como os padrões fluem entre as mãos — e como tudo isso muda entre um Easy e um Expert da mesma música.
Um único modelo que transforma áudio direto em notas precisa tomar todas essas decisões ao mesmo tempo, a cada momento: estrutura, dificuldade, estilo e a posição exata nas colunas. Esse tipo de modelo costuma acertar os detalhes locais e perder a forma da música — um refrão que não bate mais forte que a estrofe, um breakdown que não respira.
Duas perguntas, dois modelos
- Música
- Compreensão
- Planner
- Noter
- Validação
- Beatmap
Os dois modelos leem o mesmo retrato musical da música: uma grade de timing e uma representação do áudio alinhada a ela batida por batida (do modelo de código aberto MERT). A partir daí:
- O Planner responde o que deve acontecer. Antes de existir qualquer nota, ele define a estrutura de gameplay da música inteira, seção por seção: o quanto cada parte deve ser difícil e a mistura de long notes, jacks e outros tipos de padrão.
- O Noter responde como as notas ficam. Ele transforma o plano no posicionamento de fato — quais colunas, quais notas são taps e quais são long notes, como os padrões se conectam — seguindo tanto o plano quanto o áudio.
Cada modelo recebe uma tarefa mais estreita, e o plano dá à geração de notas algo que falta a um modelo que vai nota por nota: uma visão da música inteira que já foi decidida.
O Planner: difusão gaussiana sobre a música inteira
O Planner é um modelo de difusão gaussiana de cerca de 6 milhões de parâmetros. Ele gera o plano de todas as seções da música em conjunto, condicionado à música, ao número de teclas e à dificuldade e ao estilo pedidos.
A difusão combina com essa tarefa por dois motivos. Um plano é uma descrição suave e contínua de uma música — a dificuldade local e a mistura de padrões subindo e descendo ao longo do tempo —, e esse é o tipo de sinal que os modelos de difusão tratam bem. E gerar o plano como um todo, em vez de seção depois de seção, permite que o Planner equilibre a música inteira de uma vez: ele consegue fazer o refrão chegar ao ápice e a ponte descansar porque enxerga os dois.
O Noter: refinamento no estilo MaskGIT
O Noter é um transformer não autorregressivo no estilo MaskGIT de cerca de 51 milhões de parâmetros. Os charts são representados como tokens discretos de padrões. Em vez de escrevê-los um de cada vez, do início ao fim da música, o Noter preenche o chart inteiro e o refina ao longo de várias passadas — fixando as notas de que tem certeza e revisitando o resto. Como essas passadas são distribuídas ao longo de uma música é um método nosso, e uma das coisas que mantemos privadas.
Por que não gerar o chart da esquerda para a direita, do jeito que um modelo de linguagem escreve um texto?
- Escrever estritamente da esquerda para a direita significa que as decisões iniciais não podem levar em conta a música que vem depois, e os erros se acumulam ao longo de uma música longa.
- Em um modelo de refinamento, cada passada vê o contexto dos dois lados de cada seção, o que mantém os padrões consistentes ao longo da música.
- O chart inteiro é produzido em um número fixo de passadas, em vez de um token por vez — o que também importa para a velocidade.
- Uma seção pode ser revisada sem regenerar tudo o que vem depois dela (mais sobre isso abaixo).
Dificuldade e estilo são entradas, não um detalhe de última hora
A divisão também é o que torna a geração controlável. O ManiaGAI recebe controles explícitos, e os modelos foram treinados para segui-los:
- Número de teclas — de 4K a 9K.
- Dificuldade — qualquer seleção de star ratings de ★1 a ★10; uma execução produz um mapset inteiro.
- Estilo — cinco dimensões: proporção de long notes, inverse long notes, jacks, long notes curtas e delay. Cada dificuldade pode ter o seu próprio estilo, calibrado a partir de charts reais com aquele número de teclas e aquela star rating.
Esses controles agem sobre o plano, onde eles importam: “mais difícil”, “mais long notes” ou “mais jacks” são decisões sobre a forma de uma seção, não sobre uma nota. A densidade não é um botão separado — ela decorre da dificuldade-alvo e do plano. E como todas as dificuldades são geradas a partir da mesma compreensão da música, um mapset se lê como uma família de charts, e não como charts sem relação entre si.
A regeneração local sai naturalmente do design
Charts gerados raramente estão errados em tudo. O mais comum é um trecho estar fora — um padrão que não encaixa, uma parte densa demais. Regenerar o chart inteiro para consertar isso joga fora tudo o que já estava bom.
- Selecionar
- Mascarar
- Regenerar
- Refinar
Como o Noter refina um chart inteiro em vez de escrevê-lo da esquerda para a direita, ele consegue regenerar uma região selecionada mantendo tudo ao redor fixo, usando as notas vizinhas como contexto — assim a nova seção se integra ao chart em vez de destoar dele. Essa é a base para a edição por seção: um editor de mapas em que você seleciona a parte de que não gostou e regenera só aquela seção, ou edita as notas você mesmo e testa o resultado jogando, está em testes internos. Ele ainda não está disponível no site.
Treinando os dois separadamente
Os dois modelos são treinados separadamente, cada um na representação com que trabalha: o Planner como um modelo de difusão sobre uma descrição do gameplay de cada seção, o Noter por predição de tokens mascarados sobre tokens de padrões. As amostras são balanceadas entre números de teclas e níveis de dificuldade para que combinações raras, como 8K em ★10, não sejam abafadas pelas comuns. Os dados por trás dos dois estão descritos em Por dentro do dataset de um mapper de osu! mania com IA.
Quanto a divisão custa
Uma hierarquia não sai de graça. Os trade-offs com que convivemos:
- Dois modelos para treinar e manter em sincronia. O plano é uma interface entre eles; quando a definição dele muda, os dois lados precisam acompanhar.
- O Noter só pode ser tão bom quanto o plano que recebe. Um plano que avalia mal uma seção passa ao Noter as instruções erradas.
- Um plano só descreve o que escolhemos descrever. A dificuldade e a mistura de padrões por seção capturam muito do que faz um chart ser como é, mas não tudo o que um mapper pretende.
O que não afirmamos
Não comparamos este design com um único modelo de ponta a ponta treinado com os mesmos dados, então não afirmamos que ele é melhor. O que podemos dizer é que ele nos dá uma forma mais limpa de modelar separadamente a estrutura de longo alcance e o posicionamento local das notas, um lugar natural para os controles de dificuldade e estilo, e um modelo que consegue revisar uma seção de um chart sem mexer no resto. O estilo de mapping ainda é controlado por um punhado de dimensões; descrever um estilo por exemplos, e não por sliders, é uma direção em que estamos trabalhando.
A página de Tecnologia mostra onde os dois modelos ficam no pipeline completo, e como deixamos a geração rápida explica o que é preciso para rodá-los.