Engineering
Warum DanceGAI Beatmaps mit Planner + Noter generiert
ManiaGAI plant das Gameplay jedes Abschnitts mit einem Diffusionsmodell und setzt dann Noten mit einem MaskGIT-Transformer. Gründe, Kompromisse, Möglichkeiten.
Die naheliegendste Beschreibung eines KI-Beatmap-Generators lautet „Audio rein, neuronales Netz, Noten raus“. So funktioniert ManiaGAI nicht. Es teilt die Aufgabe in zwei Teile: Ein Planner entscheidet, wie sich jeder Teil des Songs spielen soll, und ein Noter entscheidet, wo genau die Noten hinkommen. Dieser Beitrag erklärt, warum, was jedes Modell macht und was die Aufteilung kostet.
Eine Beatmap ist ein Arrangement, keine Transkription
Ein Chart, das dem Audio genau folgt, ist nicht unbedingt ein gutes Chart. Eine gute osu! mania-Map ist eher ein Arrangement: Der Mapper entscheidet, welche Sounds Noten verdienen, wie dicht sich ein Abschnitt anfühlen soll, wo ein Jack oder eine Long Note hingehört, wie Patterns zwischen den Händen fließen – und wie sich all das zwischen einer Easy und einer Expert desselben Songs verändert.
Ein einzelnes Modell, das Audio direkt auf Noten abbildet, muss jede dieser Entscheidungen gleichzeitig treffen, in jedem Moment: Struktur, Schwierigkeit, Style und die genaue Platzierung in den Spalten. Ein solches Modell bekommt die lokalen Details oft richtig hin, verliert dabei aber die Form des Songs – ein Refrain, der nicht stärker reinhaut als die Strophe, ein Breakdown, der nicht atmet.
Zwei Fragen, zwei Modelle
- Musik
- Verständnis
- Planner
- Noter
- Validierung
- Beatmap
Beide Modelle lesen dasselbe musikalische Bild des Songs: ein Timing-Raster und eine Repräsentation des Audios, die Beat für Beat daran ausgerichtet ist (aus dem Open-Source-Modell MERT). Von dort aus:
- Der Planner beantwortet, was passieren soll. Bevor es überhaupt eine Note gibt, legt er die Gameplay-Struktur des ganzen Songs Abschnitt für Abschnitt fest: wie schwer jeder Teil sein soll und welcher Mix aus Long Notes, Jacks und anderen Pattern-Typen.
- Der Noter beantwortet, wie die Noten liegen. Er setzt den Plan in eine konkrete Platzierung um – welche Spalten, welche Noten Taps und welche Long Notes sind, wie Patterns ineinandergreifen – und folgt dabei sowohl dem Plan als auch dem Audio.
Jedes Modell bekommt eine engere Aufgabe, und der Plan gibt der Notengenerierung etwas, das einem Note-für-Note-Modell fehlt: einen Blick auf den ganzen Song, über den bereits entschieden wurde.
Der Planner: Gauß’sche Diffusion über einen ganzen Song
Der Planner ist ein Gauß’sches Diffusionsmodell mit etwa 6 Millionen Parametern. Er generiert den Plan für alle Abschnitte des Songs gemeinsam, konditioniert auf die Musik, die Tastenzahl sowie die gewünschte Schwierigkeit und den gewünschten Style.
Diffusion passt aus zwei Gründen zu dieser Aufgabe. Ein Plan ist eine glatte, kontinuierliche Beschreibung eines Songs – lokale Schwierigkeit und Pattern-Mix, die über die Zeit steigen und fallen –, und genau mit solchen Signalen kommen Diffusionsmodelle gut zurecht. Und wenn der Plan als Ganzes statt Abschnitt für Abschnitt generiert wird, kann der Planner den gesamten Song auf einmal ausbalancieren: Er kann den Refrain zum Höhepunkt machen und die Bridge zur Ruhepause, weil er beides sieht.
Der Noter: Verfeinerung im MaskGIT-Stil
Der Noter ist ein nicht-autoregressiver Transformer im MaskGIT-Stil mit etwa 51 Millionen Parametern. Charts werden als diskrete Pattern-Tokens dargestellt. Statt sie einzeln vom Anfang des Songs bis zum Ende zu schreiben, füllt der Noter das ganze Chart aus und verfeinert es über mehrere Durchgänge – er legt die Noten fest, bei denen er sich sicher ist, und nimmt sich den Rest erneut vor. Wie diese Durchgänge über einen Song hinweg geplant werden, ist unser eigenes Verfahren und eines der Dinge, die wir für uns behalten.
Warum das Chart nicht von links nach rechts generieren, so wie ein Sprachmodell Text schreibt?
- Wer strikt von links nach rechts schreibt, kann bei frühen Entscheidungen die spätere Musik nicht berücksichtigen, und Fehler summieren sich über einen langen Song.
- In einem Verfeinerungsmodell sieht jeder Durchgang den Kontext auf beiden Seiten jedes Abschnitts, was die Patterns über den ganzen Song hinweg konsistent hält.
- Das ganze Chart entsteht in einer festen Anzahl von Durchgängen statt Token für Token – was auch für die Geschwindigkeit wichtig ist.
- Ein Abschnitt kann überarbeitet werden, ohne alles danach neu zu generieren (mehr dazu unten).
Schwierigkeit und Style sind Eingaben, keine Nachgedanken
Die Aufteilung ist auch das, was die Generierung steuerbar macht. ManiaGAI nimmt explizite Steuergrößen entgegen, und die Modelle wurden darauf trainiert, ihnen zu folgen:
- Tastenzahl – 4K bis 9K.
- Schwierigkeit – eine beliebige Auswahl an Star Ratings von ★1 bis ★10; ein Durchlauf erzeugt ein ganzes Mapset.
- Style – fünf Dimensionen: Long-Note-Anteil, inverse Long Notes, Jacks, kurze Long Notes und Delay. Jede Schwierigkeit kann ihren eigenen Style bekommen, kalibriert anhand echter Charts mit dieser Tastenzahl und diesem Star Rating.
Diese Steuergrößen wirken auf den Plan, also dort, wo sie zählen: „schwerer“, „mehr Long Notes“ oder „mehr Jacks“ sind Entscheidungen über die Form eines Abschnitts, nicht über eine einzelne Note. Dichte ist kein eigener Regler – sie ergibt sich aus der Zielschwierigkeit und dem Plan. Und weil jede Schwierigkeit aus demselben Verständnis des Songs generiert wird, liest sich ein Mapset wie eine Familie von Charts statt wie eine Sammlung unzusammenhängender.
Lokale Neugenerierung ergibt sich aus dem Design
Generierte Charts sind selten überall falsch. Häufiger passt eine einzelne Passage nicht – ein Pattern, das nicht sitzt, ein Abschnitt, der zu dicht ist. Das ganze Chart neu zu generieren, um das zu beheben, wirft alles weg, was schon gut war.
- Auswählen
- Maskieren
- Neu generieren
- Verfeinern
Weil der Noter ein ganzes Chart verfeinert, statt es von links nach rechts zu schreiben, kann er einen ausgewählten Bereich neu generieren und alles drumherum unverändert lassen, wobei er die umliegenden Noten als Kontext nutzt – so fügt sich der neue Abschnitt ins Chart ein, statt damit zu kollidieren. Das ist die Grundlage für Bearbeitung auf Abschnittsebene: Ein Map-Editor, in dem du den Teil auswählst, der dir nicht gefällt, und nur diesen Abschnitt neu generierst – oder die Noten selbst bearbeitest und das Ergebnis probespielst –, ist im internen Test. Auf der Website ist er noch nicht verfügbar.
Getrenntes Training
Die beiden Modelle werden getrennt trainiert, jedes auf der Repräsentation, mit der es arbeitet: der Planner als Diffusionsmodell über eine Beschreibung des Gameplays jedes Abschnitts, der Noter per Masked-Token-Vorhersage über Pattern-Tokens. Die Samples werden über Tastenzahlen und Schwierigkeitsstufen hinweg ausbalanciert, damit seltene Kombinationen wie 8K bei ★10 nicht von häufigen übertönt werden. Die Daten hinter beiden beschreibt Ein Blick in den Datensatz hinter einem KI-Mapper für osu! mania.
Was die Aufteilung kostet
Eine Hierarchie gibt es nicht umsonst. Die Kompromisse, mit denen wir leben:
- Zwei Modelle, die trainiert und synchron gehalten werden müssen. Der Plan ist eine Schnittstelle zwischen ihnen; wenn sich seine Definition ändert, müssen beide Seiten nachziehen.
- Der Noter kann nur so gut sein wie der Plan, den er bekommt. Ein Plan, der einen Abschnitt falsch einschätzt, gibt dem Noter die falsche Vorgabe.
- Ein Plan beschreibt nur, was wir beschreiben wollten. Schwierigkeit und Pattern-Mix auf Abschnittsebene erfassen viel von dem, was ein Chart so anfühlen lässt, wie es sich anfühlt – aber nicht alles, was ein Mapper beabsichtigt.
Was wir nicht behaupten
Wir haben dieses Design nicht gegen ein einzelnes End-to-End-Modell gebenchmarkt, das auf denselben Daten trainiert wurde, also behaupten wir nicht, dass es besser ist. Was wir sagen können: Es gibt uns einen saubereren Weg, langfristige Struktur und lokale Notenplatzierung getrennt zu modellieren, einen natürlichen Ort für Schwierigkeits- und Style-Steuerung und ein Modell, das einen Abschnitt eines Charts überarbeiten kann, ohne den Rest anzufassen. Der Mapping-Style wird noch über eine Handvoll Dimensionen gesteuert; einen Style anhand von Beispielen statt über Schieberegler zu beschreiben, ist eine Richtung, auf die wir hinarbeiten.
Die Technologie-Seite zeigt, wo beide Modelle in der gesamten Pipeline sitzen, und wie wir die Generierung schnell gemacht haben behandelt, was es braucht, sie laufen zu lassen.