--- title: "Construction automatique de niveaux pour le jeu de rythme osu! à partir de fichiers audio" topic: "osu" author: "Aboujaib Alexandre - 28173" theme: "Copenhagen" header-includes: - \AtBeginDocument{\title[Construction automatique de niveaux pour osu!]{Construction automatique de niveaux pour le jeu de rythme osu! à partir de fichiers audio}} --- # Presentation du problème ### Le jeu osu! - Jeu de rythme pour PC - Sorti le 16 septembre 2007, adapté d'un jeu pour DS - Environ 500 000 joueurs actifs - Se joue avec une souris/tablette et clavier ![logo](osuLogo.png){ width=50% } ![tablet](tablet.png){ width=40% } ### Les beatmaps (niveaux) ::: columns :::: column ![Définition d'une beatmap](wikibeatmap.png){ width=110% } ![Beatmap en jeu](gameplay.jpg) :::: :::: column ![Liste de nouvelles beatmaps](MapList.png){ width=110% } :::: ::: ### Exemples de cercles ![](exemplesEditeur.png) ![](rcMusicRepresentation.png) ![](rcDifficultySpike.png) ### Exemples de sliders ![](sliderSimple.png){ width=50% } ![](sliderWave.png){ width=50% } ![](rcOffScreen.png) ![](rcSliderPath.png) ### Formulation du problème Nous nous proposons de **créer deux programmes** permettant **au mieux**, à partir d’un **fichier audio** donné, de **construire un niveau pour osu!**. # Partie I : Analyse de musique ### Approche en deux temps #### Spécifications *Entrée :* un fichier audio (format quelconque) *Sortie :* des données relatives à la musique permettant le placement des notes : `(double | (double * double)) list` #### Processus retenu ici ![](trame.png) ### Schéma du processus ![](process.png) ### Filtres physiques & Transformée de Fourier ::: columns :::: column ![Un exemple de filtre](filtre_ex.png){ width=90% } :::: :::: column ![Illustration de la FFT](fft.png) :::: ::: ### Résultats ![](dataBad.png){ width=60% } Résultat de l'extraction sur une musique (Bad Apple) pendant 15s ### Résultats ![](dataBigBad.png) Résultat de l'extraction sur la même musique pendant 120s ### Résultats #### Complexité ![](complexity.png){ width=95% } ### Limites, saturation et améliorations ![](tetris2.png) ### Limites, saturation et améliorations ![](tetris2.png) > les fréquences ne sont pas correctement détéctées ici (car trop d'harmoniques) ### Limites, saturation et améliorations ![](saturation.png) ### Limites, saturation et améliorations ![](saturation.png) > une musique "dense" fait que la méthode d'extraction des amplitudes n'est pas précise # Partie II : placement spatial # Annexe : code Python ### librairies utilisées ici ![](libs.png){ width=70% } ### quelques fonctions utiles ![](aux.png) ### `parse music` : extraction de la liste des amplitudes et du "sample rate" ::: columns :::: column ![](code/parsing_1.png){ width=80% } :::: :::: column ![](code/parsing_2.png) :::: ::: ### `cleaning` : retirer les fréquences trop basses et hautes ![](code/cleaning.png){ width=60% } ### `get amp distribution` : usage de files de priorité pour extraire les maxima ![](code/getDistr.png){ width=50% } ### `get frequency distribution` : fréquence maximale pour chaque point ![](code/getFreqs.png){ width=60% } ### `get sliders` : fusionner les notes trop proches en des 'sliders' ![](code/getSliders.png){ width=75% } ### `draw` : afficher les résultats ![](code/display.png){ width=60% } ### quelques données de test ::: columns :::: column ![](sample1.png){ width=75% } :::: :::: column ![](sample2.png) :::: ::: ### interface ![](sample3.png)