Pièce du musée — surface historiqueLe propos a été publié comme article le 2026-09-13, dans le modèle éditorial commun. La page garde la forme d'origine. Toutes les pièces du musée
Rapport concurrentiel · 12 septembre 2026

RainbowJourney face à Chromatic River

Deux POC développés en parallèle à partir du même prompt : apprendre et improviser au piano MIDI par synesthésie couleurs, avec notes fantômes, fontaine de notes et rivière réactive. Ce rapport compare leur technique, leurs fonctions et leur organisation, puis propose ce qu'il faut extraire de chacun pour les combiner.

RainbowJourney

Dépôt
D:\GitRepos\RainbowPiano · FGDidou/RainbowJourney
Branche
fix/priority-fixes · 12 commits après v0-astra-tango · 2 fichiers non commités
Pile
React 19, TypeScript strict, Vite, three.js, Tonal, Zod, idb
Code
4 469 lignes TS/TSX/CSS (src + tests)
Tests
60/60 unitaires relancés ici, 2 specs Playwright, CI
Monde
Vallée low-poly, rivière à filaments, rubans

Chromatic River

Dépôt
D:\GitRepos\ChromaticRiver · FGDidou/ChromaticRiver
Branche
kimifix · 8 commits après v0-kimi · PR #1 ouverte
Pile
JS vanilla, modules ES, three.js 0.169 par CDN, aucun build
Code
5 793 lignes JS/CSS
Tests
0 dans le dépôt · vérifié en navigateur et par scripts ponctuels
Monde
Canal vénitien, réflexion planaire HDR, ville procédurale
Verdict

RainbowJourney est le meilleur socle, Chromatic River a la meilleure expression de l'idée.

RJ est plus avancé en ingénierie et en profondeur produit. CR rend mieux ce que le prompt appelait « l'objectif le plus complexe » : voir les prochaines notes et leur émotion dans le monde, pas seulement dans une liste.

Recommandation
  1. Garder RainbowJourney comme base : types, tests, persistance, éditeur et MIDI éprouvé sur le vrai DP1 coûteraient cher à refaire.
  2. Corriger d'abord ses trois défauts de chemin chaud, toujours présents et dont un s'est aggravé.
  3. Porter de Chromatic River le classement des candidats, la palette OKLCH, l'atlas de 13 glyphes, les bouées fantômes 3D et la fontaine partant de la touche.
  4. Intégrer le canal vénitien comme un décor, à côté de la vallée, plutôt que de remplacer le monde.
Comparaison

Dimension par dimension

DimensionRainbowJourneyChromatic RiverAvantage
Socle techniqueTypeScript strict, Vite, schémas Zod sur réglages et sessionsJS vanilla sans build ; les interfaces ne sont garanties que par CONTRATS.mdRJ
Tests et CI60 unitaires sur 10 fichiers, Playwright, GitHub ActionsAucun test dans le dépôt ; contrôles faits en navigateur et hors dépôtRJ
MIDIFIFO des attaques, Panic, sortie armée explicitement ; essayé sur le DP1 réelFIFO, Panic, sortie et canal sélectionnables ; testé sur doublure uniquementRJ
Moteur musicalTonal, intervalles jusqu'à 24 demi-tons, règles d'expression éditables, accords stabilisés sur 40 msThéorie maison, octave distincte de l'unisson, scoreCandidates pur avec diversité de famillesÉgal
Notes fantômesPoint générique sur la touche, 2 à 4 suggestions en liste textuelleBouées 3D sur l'eau, 13 glyphes par famille, 4 fortes et le reste en filigrane, pastilles sur le pianoCR
Direction artistiqueVallée low-poly lisible mais génériqueCanal vénitien à l'aube, reflets, brume, oiseaux ; identité forteCR
Coût de renduBudgets GPU bornés, mais priorité de rendu inverséeRéflexion qui re-rend la ville à chaque image ; niveau de qualité désormais effectifÉgal
PersistanceIndexedDB, enregistrement, relecture visuelle, import/export JSONAucune session enregistrée ; seuls les réglages sont en localStorageRJ
Personnalisation28 paramètres d'effets, règles, presets, panneaux HUD déplaçables9 réglages de menu, 2 presets d'émotionsRJ
Pédagogie et jeuIndicateurs de style « safe », frise des choix, textes d'émotion sourcés, canon de gameplay écritClassement des enchaînements, légende des couleurs, fin de phraseRJ
Lisibilité et langueInterface en ASCII sans accents, par règle du canonFrançais accentué, voiles de contraste, 3 tailles de texteCR
Saisie sans pianoSouris, toucher, clavier AZERTYSouris et toucherRJ
Démarragenpm ci puis Vite ; fonctionne hors ligneServeur statique immédiat, mais three.js exige le réseauÉgal
Forces et faiblesses

Ce que chacun fait mieux, et ce qui le fragilise

RainbowJourney

Forces

  • Architecture typée et testée : un changement casse un test avant de casser le jeu.
  • Chaîne MIDI mûrie au contact du vrai matériel : relais avant analyse, décision de relâchement liée à l'attaque, désarmement en relecture.
  • Produit profond : enregistrement et relecture, éditeur d'effets, règles, presets, panneaux HUD persistants.
  • Vision de jeu formalisée dans un canon : aucune punition, scores de style en pourcentage, hologramme de rivière future.
  • Textes d'émotion prudents, avec degré de certitude (« souvent », « tendance », « parfois »).

Faiblesses

  • Défauts de chemin chaud toujours présents : React notifié à chaque tick, effet de bord dans un getter, priorité de rendu inversée.
  • Fantômes peu parlants sur le clavier : le même point pour toutes les émotions.
  • Monde visuel générique, loin de la synesthésie spectaculaire du prompt.
  • Dette de validation : 15 éléments du pack HUD « à retester », dont 3 partiels ; Playwright non rejoué sur cette tranche.
  • Deux fichiers centraux très chargés : runtime.ts (691 lignes) et Journey.tsx (467).
  • Interface sans accents, et plus de 15 documents à tenir à jour.

Chromatic River

Forces

  • Idée centrale rendue dans l'espace : les suggestions flottent sur l'eau devant le bateau, avec un glyphe par famille d'intervalle.
  • Identité visuelle forte et cohérente : reflets HDR, brume, lumière d'aube.
  • Théorie pure et vérifiable : classement monotone, diversité des familles, octave distincte, palette OKLCH à clarté constante.
  • Fontaine qui part de la touche jouée et converge dans le canal selon la hauteur.
  • Organisation par contrat d'interface et paquets à fichiers exclusifs : parallélisation propre, audit croisé, PR.

Faiblesses

  • Aucun test dans le dépôt : chaque régression se découvre à l'écran.
  • Pas de types : le contrat entre modules n'est vérifié par aucun outil.
  • Pas d'enregistrement ni de relecture, pas d'éditeur d'effets, pas de presets exportables.
  • MIDI jamais essayé sur le DP1 réel.
  • Décor hérité du template sans lien avec la musique (oiseaux, gondolier), qui consomme du budget de rendu.
  • Dépendance au CDN : pas de jeu hors ligne, pas de version verrouillée par un lockfile.
Défauts vérifiés

État constaté dans le code, pas dans les documents

ProjetDéfautConséquenceÉtat
RJtick() appelle notify() à chaque tick de 25 msLes caches sont invalidés même sans changement ; Journey recalcule suggestions et couleurs du piano environ 60 fois par seconde, sur le thread partagé avec three.jsPrésent
RJLe getter harmony modifie l'état pendant le rendu ReactLa stabilisation des accords à 40 ms ne tient que grâce au défaut précédent : corriger l'un sans l'autre casse la détectionPrésent
RJTraces parcourues de la plus ancienne à la plus récentePassé à 10 segments par note pour un plafond de 1 024 : au-delà de 102 traces visibles, les notes les plus récentes perdent leur rubanAggravé
RJSélection de l'entrée MIDI non persistéeResélection manuelle à chaque rechargementConnu, en TODO
CROctave traitée comme un unisson, note de départ jamais affichée, fantômes sans hiérarchieLe cœur pédagogique du prompt était fauxCorrigé, vérifié
CRFontaine en nuages blancs près de la caméraCanal masqué, couleur de la note perdueCorrigé, vérifié
CRAucun Panic MIDI, sortie toujours sur le premier portNotes bloquées possibles, risque de boucle vers le pianoCorrigé, sur doublure
CRAnnonce de ports qui déclenche un Panic à chaque foisBrancher n'importe quel périphérique coupe les notes relayées en coursÀ trancher
Synthèse

Quoi extraire, dans quel sens, et pourquoi

Effort estimé sur le socle RainbowJourney : S pour quelques heures, M pour une journée, L pour plusieurs jours. Les modules de théorie de Chromatic River n'importent pas three.js, ce qui les rend portables en TypeScript et testables immédiatement avec Vitest.

ÉlémentSensPourquoiEffort
scoreCandidatesCR → RJClassement pur, monotone, avec diversité de familles ; remplace l'heuristique de suggestions() et fournit rank et strongS
Palette OKLCHCR → RJClarté constante sur les 12 classes de hauteur : répond au « progressif mais homogène » du promptS
Atlas de 13 glyphesCR → RJRemplace le point générique ghost-dot ; distingue stable, tension et ouverture d'un coup d'œilM
Bouées fantômes 3DCR → RJPorte les suggestions dans le monde ; prolonge directement l'« hologramme de rivière future » du canon RJM
Fontaine depuis la toucheCR → RJProjection de la touche avec distance minimale de 8 m et taille plafonnée : lien visuel touche → rivière sans saturationM
Canal vénitien comme décorCR → RJRJ gère déjà des décors ; la scène de CR, impérative, se greffe à côté de World.tsx sans réécrire le mondeL
Méthode par contratCR → RJDécouper les prochains lots en paquets à fichiers exclusifs, avec audit croisé avant fusionS
Tests VitestRJ → CRSi CR restait autonome : ses modules ES purs sont testables tels quelsM
Enregistrement et relectureRJ → CRSi CR restait autonome : revoir la route parcourue est une demande explicite du promptL
Styles « safe », frise, textes sourcésRJ → CRSi CR restait autonome : la couche pédagogique la plus aboutie des deuxM
Clavier AZERTYRJ → CRJouer sans piano ni sourisS
Feuille de route combinée

Dans quel ordre, et pourquoi cet ordre

  1. 1

    Assainir le chemin chaud de RainbowJourney

    Ne notifier React que sur un vrai changement, déplacer la stabilisation des accords dans tick(), rendre les traces de la plus récente à la plus ancienne. À faire en premier : chaque élément porté ensuite ajoute du rendu sur ce thread.

  2. 2

    Porter la théorie de Chromatic River, avec tests

    Classement des candidats et palette OKLCH en TypeScript, avec en tests les assertions déjà écrites pour CR : octave dans les deux sens, monotonie du score, diversité des familles.

  3. 3

    Fantômes lisibles sur le clavier

    Atlas de glyphes et hiérarchie forte / filigrane sur les touches. C'est le gain le plus visible pour l'utilisateur, à coût faible.

  4. 4

    Suggestions et fontaine dans le monde

    Bouées 3D, fontaine depuis la touche, puis la première variante d'hologramme de rivière du canon.

  5. 5

    Décor canal vénitien

    Ajouté comme second décor, avec des niveaux de qualité qui pilotent réellement la résolution de réflexion.

  6. 6

    Retest sur le DP1 et mesure

    Relancer Playwright et le protocole matériel, puis mesurer les FPS par niveau de qualité : aucun des deux projets n'a de mesure fiable aujourd'hui.

À trancher avant l'étape 2 : le canon de RainbowJourney impose une interface en ASCII sans accents, tandis que Chromatic River est en français accentué. Porter des libellés de CR exige de choisir l'une des deux conventions pour le projet combiné.