# Morphosynthèse 2.2 · Cyclonium

13 octobre 2026. Un volume mobile, un plan de coupe fixe, des contours écoutés par projection sur X et Y.

## Utilisation

Ouvrir `index.html` ou la page autonome **morphosynthese.2.2.html**. L'écoute en direct utilise AudioWorklet : utiliser l'adresse HTTPS de l'atelier ou un serveur local si le navigateur refuse cette API depuis un fichier. Le dessin, la géométrie et l'export WAV ne dépendent pas de l'ouverture du son en direct.

- **Dessiner une forme** : tracer, puis relâcher. Le trait est fermé automatiquement. Les croisements sont acceptés suivant la règle pair–impair.
- **Reprendre le trait** : retrouve le dernier dessin, même après une construction impossible. Il est mémorisé localement lorsque le stockage du navigateur est disponible. On peut le prolonger, relancer la construction ou l'effacer.
- Glisser sur le volume pour le tourner. La molette ou un geste à deux doigts règlent la profondeur. L'inertie peut être conservée avec un amortissement nul. Les flèches et Page précédente/suivante offrent les mêmes manipulations au clavier.
- Pour les curseurs, **éloigner le pointeur verticalement pendant le glissement horizontal affine le réglage**. Maj affine encore d'un facteur dix. Les champs numériques permettent une valeur exacte.
- **Arrêter le mouvement** fige le volume, mais le son continue sur la coupe courante.
- **Masquer devant le plan de coupe** retire du rendu la partie située en avant de z = 0. Cette option ne transforme pas le maillage exporté.

## Changements de V2

Les noms du projet, les structures de données et les fonctions sont en français. Les fonctions ont des commentaires de rôle ; les algorithmes principaux précisent leurs unités, leurs invariants et leurs limites. Les noms imposés par JavaScript, Web Audio, WebGL et les formats standard gardent leur écriture officielle.

Les silhouettes croisées ne sont plus rejetées d'emblée et leur aire algébrique peut être nulle. Un dernier trait est conservé. L'éclairage directionnel et l'opacité ont été renforcés, avec une coupe visuelle optionnelle. Un galbe de Poisson remplace par défaut le galbe fondé sur la distance ; le mode historique reste disponible. Les mobiles visuels et leur ralentissement ont été retirés. Les réglages sonores passent en tête, avec seulement le contrôle de fréquence ou de vitesse correspondant au mode choisi. Une prise sonore, vidéo muette ou audiovisuelle peut être enregistrée en direct.

## Géométrie et croisements

Le domaine rempli est déterminé par parité : traverser un segment change l'appartenance. Cela reproduit l'alternance de régions proposée dans le rapport. L'interprétation s'effectue directement sur une grille, sans décomposer préalablement le trait en polygones indépendants.

Dans la situation générique d'une unique courbe fermée avec C croisements doubles transversaux, sans segment superposé ni point multiple, le nombre de régions bornées est C + 1. Des contacts tangents, passages multiples au même point ou segments retracés sortent de ce décompte. Le remplissage pair–impair reste la convention de cet atelier.

Les lobes qui ne se touchent qu'en un point ne sont pas délibérément soudés en un sommet commun : ce serait un contact non régulier pour une surface. À la résolution finie utilisée, un contact étroit peut être séparé ou rapproché différemment. Les détails sous la maille ne sont pas conservés de façon garantie. Le dessin en huit de nos tests produit deux composantes fermées.

### Galbe V2

Dans le domaine 2D du dessin, on approxime l'équation :

**−Δu = 4**, avec **u = 0 sur le bord**.

Le volume est l'intérieur de la surface **z² = épaisseur² × u(x,y)**. Pour un disque idéal de rayon R, la solution continue est u = R² − x² − y² : on retrouve un ellipsoïde lisse. C'est un modèle de construction, pas une simulation dynamique de membrane ou de pression.

Le calcul utilise une relaxation sur une grille XY, au plus 500 passages, puis une extraction par tétraèdres sur 36 mailles par axe. Les conditions au bord sont approchées à partir de la distance aux segments. Le champ d'extraction est rescalé par un facteur positif à l'intérieur pour retrouver la distance signée à z = 0 ; la silhouette ne se dilate donc pas à cause d'une mauvaise extrapolation du galbe extérieur. La facettisation, les coins du dessin et les très faibles épaisseurs peuvent rester visibles : ce n'est pas une surface analytique exacte ni l'algorithme original de Teddy.

Le mode historique emploie **z² = épaisseur² × d(x,y)**, où d est la distance signée au contour, et une résolution de 28. Les tests comparent ses sommets et facettes à ceux de V1.

Les coupes fermées sont rééchantillonnées en 512 positions à pas de longueur d'arc constant. Leurs coordonnées ne sont pas normalisées en amplitude. L'orientation des boucles est harmonisée et une corrélation approchée ajuste leur origine pour limiter les changements brusques du signal. Lors d'une division ou fusion des boucles, l'identification par proximité reste heuristique.

## Lecture sonore

Deux modes :

- **Fréquence imposée** : un tour dure 1/f seconde. La taille modifie principalement l'amplitude et la forme modifie le timbre.
- **Vitesse constante** : f = v/L, où L est le périmètre du contour dans les unités du modèle. Agrandir le volume agrandit L et abaisse donc la fréquence à vitesse égale.

X alimente le canal gauche, Y le canal droit. Le centrage optionnel retire leur moyenne. Les voix sont moyennées quand plusieurs contours sont lus, sans normaliser séparément la taille de chaque boucle. Le lecteur conserve sa phase entre les messages et utilise des transitions de forme de 25 ms ainsi qu'un fondu des apparitions et disparitions.

Le calcul interne emploie les nombres JavaScript à double précision ; les tables et les sorties audio utilisent des flottants 32 bits. Ce n'est pas un générateur métrologique : interpolation linéaire, géométrie discrète et éventuel repliement spectral restent présents. La limite appliquée à la fondamentale ne supprime pas le repliement des harmoniques.

## Enregistrer et exporter

**Enregistrer en direct** propose Son, Vidéo muette et Son et vidéo. Cliquer Démarrer, manipuler l'instrument, puis Terminer. Aucun microphone n'est utilisé. La vidéo contient le volume et les contours, sans les commandes de la page. Son format dépend des capacités MediaRecorder du navigateur : WebM ou MP4/M4A. La vidéo vise 30 images par seconde, à la taille de la zone de travail au début de la prise. La cadence réelle dépend du navigateur et du matériel.

La **Recette de la prise**, disponible après l'arrêt, fournit un JSON associé : état initial, nom du fichier, paramètres, silhouettes et poses échantillonnés à environ 10 Hz. Ce journal garde une trace exploitable mais ne constitue pas un rejeu exact échantillon par échantillon. Les blocs de la prise sont conservés en mémoire jusqu'à l'arrêt. Le navigateur peut suspendre ou ralentir une page placée en arrière-plan.

Autres exports :

- **Sauvegarder** : recette d'instrument JSON V2 avec provenance, silhouette, méthode de galbe, poses, paramètres et contours sélectionnés. Recharger accepte aussi V1 et utilise alors le galbe historique. La remise en écoute se fait sur la pose sauvegardée, sans relancer automatiquement l'inertie.
- **WAV · coupe actuelle** : quatre secondes de la coupe figée, stéréo 48 kHz, flottant 32 bits, recette incluse dans un bloc RIFF INFO/ICMT. Ce bouton ne capture pas les mouvements en direct.
- **Image PNG** : vue sans interface.
- **Volume OBJ** : volume complet, dans sa pose courante.
- **Contours JSON V2** : toutes les boucles et leurs métadonnées.

## Sources et réutilisation

| Fichier | Rôle |
| --- | --- |
| `geometrie.js` | Silhouettes, galbe, maillage, transformations et coupes |
| `formats-instrument.js` | Adaptation des recettes V1 vers le vocabulaire V2 |
| `lecteur-contours.js` | Lecture stéréo sans DOM ni dépendance à Web Audio |
| `rendu-volume.js` | Surface éclairée et coupe visuelle WebGL |
| `atelier.js` | Gestes, contrôles, AudioWorklet, exports et enregistrement |
| `interface.css` | Présentation et adaptation aux petits écrans |
| `lecteur-instrument.mjs` ou `.js` | Module ES autonome regroupant adaptation et lecture |
| `morphosynthese.2.2.html` | Page autonome contenant les mêmes sources lisibles |

La page utilise des scripts classiques pour rester autonome. Le lecteur réutilisable est fourni aussi en module ES :

```js
import { creerLecteurInstrument } from './lecteur-instrument.js';

// recette : objet issu du JSON d'instrument, version 1 ou 2.
const lecteur = creerLecteurInstrument(recette, {
    frequenceEchantillonnage: 48000
});
const stereo = [0, 0];

// À appeler une fois par échantillon dans le moteur audio consommateur.
lecteur.echantillonSuivant(stereo);
```

Le module fournit aussi `LecteurContours` et `adapterInstrument`. La sortie est géométrique : appliquer le gain d'écoute choisi dans l'atelier consommateur. Une extension `.js` identique est fournie pour les serveurs déjà configurés pour JavaScript. L'ancien `trajectory-voice.mjs` reste accessible sur le site pour les consommateurs V1 ; il ne prend pas en charge les nouvelles recettes V2.

Dans le débogueur de la page, `etat`, `maillage`, `tables` et les fonctions du projet restent inspectables. Les tables ne sont pas l'état d'un réseau élastique : cette première brique sépare encore géométrie, observation et lecture.

### Reconstruction et vérification

Depuis le dossier extrait :

```text
node tests-moteur.cjs
node tests-interface.cjs
python construire.py
```

Aucune bibliothèque externe n'est nécessaire au fonctionnement de l'application ou à sa reconstruction. Node sert aux tests, Python à l'assemblage de la page autonome et du ZIP.

Les tests vérifient la fermeture des maillages, les coupes multiples, le dessin en huit, le remplissage du pentagramme, la compatibilité géométrique V1, 240 passages par seconde à 240 Hz, la continuité de phase, les imports, l'écriture du worklet et les échanges d'enregistrement. Le test d'interface utilise des doubles du DOM et des API multimédias. **Le rendu sur GPU et l'encodage audio/vidéo n'ont pas été vérifiés dans un navigateur pour cette livraison.**

Le fichier `tests-reference-geometrie-v1.js` est une copie historique non francisée, conservée uniquement comme référence de non-régression.

## Suites pour la refonte

Les propositions du rapport sont conservées, sans les confondre avec les fonctionnalités réalisées ici :

1. **Réseau déformable** : les sommets et arêtes du maillage deviennent supports de masses, ressorts et muscles. Séparer la géométrie initiale, l'état dynamique, les lois et l'adaptateur de coupe. Pour une pression, ajouter les facettes orientées et un volume fermé contrôlé ; pour la plasticité, faire évoluer explicitement les références de repos.
2. **Images sur surface** : porter des coordonnées de texture par coin de facette, de façon à autoriser les coutures sans scinder les nœuds physiques. Une image périodique sur un rectangle convient à un tore paramétré ; elle ne résout pas à elle seule les singularités d'un habillage sphérique. Pour une sphère, choisir un atlas à plusieurs cartes, une projection adaptée ou une texture procédurale 3D. L'image et son adaptateur de domaine restent deux objets distincts.
3. **Topologies et opérations de volumes** : la coupe par un plan n'exige pas une surface de topologie sphérique. Une surface fermée de genre quelconque donne génériquement des cycles, avec des exceptions aux tangences et singularités ; une surface ouverte peut aussi donner des chemins ouverts. Union, intersection et différence peuvent agir sur des champs implicites avant extraction du maillage. Il faudra gérer la résolution et les contacts plutôt que supposer toute union régulière.
4. **Synthèse subjectile en flux** : distinguer une boucle périodique d'une trajectoire produite à la volée. Le mobile de surface porterait une facette, une position barycentrique, une direction tangente et une vitesse. Une première loi possible transporte la direction d'une facette à l'autre en dépliant les triangles autour de leur arête commune ; il faut définir séparément le passage par un sommet et les bords. L'observation devient un flux de positions/valeurs, sans fermeture imposée ni table périodique obligatoire.

Ces pistes prolongent les réseaux, lois et adaptateurs de Cyclonium. Elles n'ajoutent pas d'emblée un modeleur complet dans le noyau sonore.

## Version 2.1 — volumes Orange galactique

Le bouton **Recharger** accepte désormais les recettes V2 avec `geometrie.methode: "maillage-explicite-v1"`. Elles contiennent les `sommets` (triplets), les `facettes` (triplets d'indices) et, éventuellement, une `fabrication` documentant la provenance. Le maillage est conservé tel quel, sans gonflement depuis une silhouette. La sauvegarde et les métadonnées audio le préservent également.

Le contrôle refuse les coordonnées non finies, les indices invalides, les triangles dégénérés, les sommets isolés et les arêtes ouvertes ou orientées de manière incohérente. Ce contrôle ne certifie pas l'absence de toute auto-intersection. Limites : 80 000 sommets, 160 000 triangles, coordonnées entre −4 et 4, recette de moins de 40 Mo.

Les réglages d'épaisseur et de galbe ne s'appliquent pas au maillage importé. Dessiner une nouvelle silhouette ou choisir une forme de démonstration revient au gonflement de silhouette. La taille, la pose, les coupes et le lecteur restent disponibles. Les anciennes recettes V1/V2 restent prises en charge.

La page autonome actualisée est `morphosynthese.2.1.html` et les sources sont dans `morphosynthese-sources-v2.1.zip`. Les fichiers antérieurs restent disponibles avec leurs noms d'origine.

## Import OBJ — version 2.2, 16 octobre 2026

Utiliser Importer / Recharger et choisir un .obj. Les réglages OBJ permettent de choisir Z ou Y vertical, de centrer et redimensionner uniformément le modèle (activé par défaut), et de souder les sommets exactement confondus (désactivé par défaut).

Le lecteur prend en charge les faces triangulaires et polygonales simples, les indices positifs ou négatifs et les notations v/vt/vn. Les polygones sont triangulés par découpage d'oreilles dans un plan de projection ; pour une face fortement non plane, la trianguler dans l'éditeur avant export. Les coordonnées non finies et les arêtes incidentes à plus de deux triangles sont refusées. Les faces dégénérées et sommets isolés sont retirés et comptabilisés. Les incohérences d'orientation sont signalées, sans réparation automatique.

Les surfaces ouvertes sont admises. Seuls les contours de coupe fermés deviennent des trajectoires sonores. Aucun rebouchage n'est effectué. Limites : 80 Mo, 400 000 sommets, 800 000 triangles. Les grands scans peuvent ralentir l'interface, particulièrement sur mobile.

Seule la géométrie statique est importée : pas de matériaux, textures, armature, animation ni paramètres physiques. Les normales sont recalculées. La normalisation et le changement d'axes sont enregistrés dans les métadonnées d'import ; les métadonnées de fabrication absentes ne sont pas inventées. Un export JSON permet ensuite de conserver le modèle et sa configuration dans Cyclonium.

Tests : polygone concave, indices relatifs, changement d'axes, normalisation, erreurs, aller-retour OBJ et JSON, et les deux portraits de 1997. Ces portraits privés ne sont pas inclus dans les sources distribuées. Le navigateur et Blender 5.2.3 RC n'ont pas été exécutés pour cette vérification.
