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

  1. Música
  2. Compreensão
  3. Planner
  4. Noter
  5. Validação
  6. 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.

  1. Selecionar
  2. Mascarar
  3. Regenerar
  4. 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.