← Tous les jeux · Kevin Roualec · PULSE v1.0 EN

PULSE — Rythme IA

Choisissez une musique. Une IA locale détecte les beats par analyse spectrale et l'autocorrélation des intervalles, puis génère un niveau qui tombe en rythme. À vous de taper D, F, J, K (ou les zones tactiles) au bon moment.

Privacy : votre fichier reste en mémoire dans votre navigateur. Aucun upload, aucun stockage disque, aucune transmission réseau. Validation stricte à l'arrivée, libération mémoire à chaque transition. Le code source de cette page n'effectue aucun appel sortant.

Score 0
Combo ×0
BPM
Précision —

Importez votre musique

Sujet A-7. HAL initialise le module d'écoute. Une fois votre signal calibré, observez votre instinct rythmique. Vous serez classé.

Fichiers MP3, WAV, OGG, FLAC, M4A. La décompression et l'analyse se font dans votre navigateur, sans aucun upload réseau.

En attente d'un fichier…
Lane 1
Lane 2
Lane 3
Lane 4
HAL 9000

Comment ça marche

Quand vous chargez un fichier, le navigateur le décode en signal PCM. Le moteur le passe dans deux bandes filtrées en parallèle : un passe-bas 200 Hz pour les kicks, un passe-bande autour de 3.5 kHz pour les snares et hi-hats. Pour chaque bande il calcule l'énergie sur des fenêtres glissantes de 512 échantillons (résolution temporelle ~6 ms) puis la dérivée positive (spectral flux), qui isole les attaques nettes plutôt que le volume brut.

Les deux bandes sont normalisées au 99ᵉ percentile pour équilibrer leur contribution, puis combinées en une enveloppe d'onset unique. Le BPM est estimé par autocorrélation directe sur cette enveloppe dans la plage 70–180 BPM. Le moteur cherche ensuite le déphasage qui aligne au mieux la grille de battements avec les attaques détectées (32 candidats de phase testés), puis génère une grille quantifiée où chaque note tombe pile sur un temps.

Le résultat : un niveau qui suit vraiment le pouls du morceau, indépendamment du genre — kick-snare détecté à la fois pour la techno et pour le rock acoustique. Pendant le jeu, un AnalyserNode FFT remonte le spectre en direct pour la visu de fond. La synchronisation utilise audioCtx.currentTime, ce qui élimine toute dérive d'horloge. Tout reste local.

Et la vie privée ? Le fichier audio est stocké dans une variable JS (ArrayBuffer) le temps de la session. À la fin de la partie ou à la fermeture de l'onglet, il est libéré et oublié. Il n'est jamais écrit dans localStorage, jamais envoyé via fetch, jamais empreinté. Le jeu ne contient aucun appel réseau sortant.