|
1 | 1 | ## Cellcosmos |
2 | 2 |
|
3 | | -Cellcosmos est un explorateur d'automates cellulaires elementaires ecrit avec `multilingualprogramming` en francais et compile en WebAssembly. |
| 3 | +Cellcosmos est un explorateur interactif d'automates cellulaires élémentaires écrit en multilingual (syntaxe française) et compilé en WebAssembly. |
4 | 4 |
|
5 | 5 | ### Objectif |
6 | 6 |
|
7 | | -Le projet a pour but de montrer qu'un programme scientifique et visuel peut etre : |
| 7 | +Le projet démontre qu'un programme scientifique et visuel complexe peut être: |
8 | 8 |
|
9 | | -- defini dans des sources multilingual francaises simples |
10 | | -- compile en WASM pour un usage direct dans le navigateur |
11 | | -- deploye comme site statique sans serveur applicatif |
| 9 | +- Défini dans des sources multilingual françaises simples et lisibles |
| 10 | +- Compilé en WASM pour utilisation directe dans le navigateur |
| 11 | +- Déployé comme site statique sans serveur applicatif |
| 12 | +- Enrichi avec des interactions Web audio et du rendu canvas avancé |
12 | 13 |
|
13 | | -L'application permet d'explorer les 256 regles elementaires, de modifier leur rendu visuel, et d'observer immediatement les motifs generes. |
| 14 | +### Fonctionnalités |
14 | 15 |
|
15 | | -### Structure |
| 16 | +#### Explorateur fondamental |
16 | 17 |
|
17 | | -- `src/automate_elementaire_canonique.ml`: source canonique complete de l'automate |
18 | | -- `src/automate_elementaire_wasm.ml`: sous-ensemble WASM-compatible pour le site |
19 | | -- `src/main.ml`: point d'entree du bundle WASM |
20 | | -- `scripts/compile_wasm.ml`: pipeline de build en source multilingual |
21 | | -- `public/`: site statique deploye sur GitHub Pages |
| 18 | +- **Règles**: Explore les 256 règles élémentaires (Wolfram, 1983) |
| 19 | +- **Contrôles**: Slider, entrée numérique, presets notables (30, 90, 110, 150, 184, 254) |
| 20 | +- **Diagramme de règle**: Visualisation des 8 motifs d'entrée et leurs sorties |
| 21 | +- **Galerie**: Aperçu préchargé des 256 règles compilées |
22 | 22 |
|
23 | | -### Build local |
| 23 | +#### Rendu visuel avancé |
| 24 | + |
| 25 | +- **Formes de cellules**: Rectangle, cercle, ellipse, triangle |
| 26 | +- **Textures**: Solide, points, hachures croisées, dégradé radial, bruit procédural |
| 27 | +- **Dégradés de couleurs**: Palette globale multiples arrêts de couleur + dégradés par point d'origine |
| 28 | +- **Modes de fusion**: Normal (source-over), Écran, Multiplier, Superposer, Éclaircir, Assombrir, Différence, Esquiver |
| 29 | +- **Opacité des couches**: Contrôle fine de la transparence (0.0–1.0) |
| 30 | +- **Thèmes**: Mode clair et sombre avec persistance localStorage |
| 31 | + |
| 32 | +#### Paramètres d'évolution |
| 33 | + |
| 34 | +- **Semis initiaux**: Haut, centre, bas, aléatoire, points personnalisés, couches multiples |
| 35 | +- **Probabilité**: Transitions avec chance configurable (0.0–1.0) |
| 36 | +- **Direction**: Évolution LTR (gauche→droite) ou RTL (droite→gauche) |
| 37 | +- **Frontière**: Bord circulaire ou tronqué |
| 38 | + |
| 39 | +#### Son ambiant |
| 40 | + |
| 41 | +- **Drone continu**: Fréquence fondamentale dérivée du numéro de règle (110–~3520 Hz) |
| 42 | +- **Timbre**: Classe Wolfram → forme d'onde (sinusoïde, triangle, dent de scie, carré) |
| 43 | +- **Filtre dynamique**: Fréquence de coupure modulée par la densité de cellules vivantes (200–3200 Hz) |
| 44 | +- **Reverb**: Délai avec boucle de rétroaction simulant une ambiance spatieuse |
| 45 | + |
| 46 | +#### Musique générative (séquenceur) |
| 47 | + |
| 48 | +- **Matériau source**: Les colonnes de la grille de l'automate deviennent des notes musicales |
| 49 | +- **Tempo**: Dérivé du taux d'évolution (60–180 BPM) |
| 50 | +- **Gammes**: Mappées à partir de la classe Wolfram |
| 51 | + - Classe 1 → Pentatonique (5 notes, reposant) |
| 52 | + - Classe 2 → Diatonique (7 notes, mélodieux) |
| 53 | + - Classe 3 → Chromatique (12 notes, riche) |
| 54 | + - Classe 4 → Ton entier (6 notes, suspendu) |
| 55 | +- **Octave**: Déterminé par la longueur de course maximale de cellules vivantes |
| 56 | +- **Stéréo**: Panning dérivé du centre de gravité du motif |
| 57 | +- **Articulation**: Durée des notes fonction de la densité de cellules |
| 58 | + |
| 59 | +### Architecture |
| 60 | + |
| 61 | +Le projet distingue trois niveaux: |
| 62 | + |
| 63 | +#### 1. Source canonique (`src/automate_elementaire_canonique.ml`) |
| 64 | + |
| 65 | +Implémentation complète et bien documentée en multilingual: |
| 66 | + |
| 67 | +- Lecture de configuration (JSON) |
| 68 | +- Construction de grille et évolution bidirectionnelle |
| 69 | +- Semis multicouches avec probabilités |
| 70 | +- Analyse des motifs (symétrie, densité, transitions, centre de gravité) |
| 71 | +- Synthèse sonore et configuration musicale |
| 72 | +- Validation esthétique |
| 73 | + |
| 74 | +#### 2. Module WASM (`src/automate_elementaire_wasm.ml`) |
| 75 | + |
| 76 | +Sous-ensemble compilé en WebAssembly, exposant: |
| 77 | + |
| 78 | +- **Primitives de transition**: `cellule_suivante`, `classe_wolfram`, `sortie_motif` |
| 79 | +- **Données**: `note_regle`, `etiquette_note_regle` |
| 80 | +- **Codes énumérés**: Formes, textures, modes de fusion |
| 81 | +- **Audio (drone)**: Paramètres dérivés du numéro de règle seul |
| 82 | +- **Musique générative**: Mappages de statistiques de grille vers paramètres musicaux |
| 83 | + |
| 84 | +#### 3. Frontend statique (`public/ui.js`, `public/index.html`, `public/style.css`) |
| 85 | + |
| 86 | +Interface dynamique et moteur de rendu: |
| 87 | + |
| 88 | +- Analyse de grille en JavaScript (vitesse d'évolution, symétrie, centre de gravité) |
| 89 | +- Moteur audio Web utilisant OscillatorNode, BiquadFilterNode, DelayNode, StereoPannerNode |
| 90 | +- Rendu canvas 2D avec textures, dégradés, motifs cachés |
| 91 | +- Compositing avec `OffscreenCanvas` et modes de fusion CSS |
| 92 | +- Sérialisation d'état via URL (query parameters) |
| 93 | +- Gestion de thème via CSS custom properties et localStorage |
| 94 | + |
| 95 | +### Compilation et build |
| 96 | + |
| 97 | +#### Prérequis |
| 98 | + |
| 99 | +```bash |
| 100 | +pip install -r requirements-build.txt |
| 101 | +``` |
| 102 | + |
| 103 | +#### Build local |
24 | 104 |
|
25 | 105 | ```bash |
26 | | -python -m pip install -r requirements-build.txt |
27 | 106 | python -m multilingualprogramming scripts/compile_wasm.ml |
28 | 107 | ``` |
29 | 108 |
|
30 | | -Depuis la racine du depot. |
| 109 | +Depuis la racine du dépôt. Cela génère: |
| 110 | + |
| 111 | +- `public/cellcosmos.wasm` — binaire WebAssembly |
| 112 | +- `public/cellcosmos.wat` — texte WebAssembly (pour inspection) |
| 113 | +- `public/main.ml`, `public/automate_elementaire_*.ml` — copies des sources |
31 | 114 |
|
32 | | -Pour tester explicitement une copie locale du depot `multilingual` au lieu de la version epinglee : |
| 115 | +#### Développement avec une branche locale de `multilingual` |
33 | 116 |
|
34 | 117 | ```powershell |
35 | 118 | $env:MULTILINGUAL_DEV_PATH="..\multilingual" |
36 | 119 | python -m multilingualprogramming scripts/compile_wasm.ml |
37 | 120 | ``` |
38 | 121 |
|
39 | | -Le build genere : |
| 122 | +### Déploiement |
40 | 123 |
|
41 | | -- `public/cellcosmos.wasm` |
42 | | -- `public/cellcosmos.wat` |
43 | | -- `public/main.ml` |
44 | | -- `public/automate_elementaire_canonique.ml` |
45 | | -- `public/automate_elementaire_wasm.ml` |
| 124 | +Le workflow GitHub Actions [`deploy.yml`](.github/workflows/deploy.yml) automatise: |
46 | 125 |
|
47 | | -### Deployment |
| 126 | +1. Compilation du source français vers WASM (avec version épinglée dans `requirements-build.txt`) |
| 127 | +2. Vérification des exports WASM attendus |
| 128 | +3. Déploiement de `public/` sur GitHub Pages |
48 | 129 |
|
49 | | -Le workflow [deploy.yml](/c:/Users/john.samuel/Documents/Research/Workspace/cellcosmos/.github/workflows/deploy.yml) compile le source francais vers WASM avec la version epinglee dans `requirements-build.txt`, verifie les exports attendus, puis deploye `public/` sur GitHub Pages. |
| 130 | +Un workflow planifié vérifie aussi la compatibilité amont (`multilingual:main`). |
50 | 131 |
|
51 | | -Un workflow planifie surveille aussi la compatibilite avec la version epinglee, la derniere version publiee et la branche `main` du depot amont `johnsamuelwrites/multilingual`. |
| 132 | +### Exports WASM |
52 | 133 |
|
53 | | -### Architecture |
| 134 | +La validation des exports (dans `ui.js:validateWasmExports`) teste: |
| 135 | + |
| 136 | +**Primitives CA**: |
| 137 | +- `cellule_suivante(rule, left, center, right)` → 0 ou 1 |
| 138 | +- `classe_wolfram(rule)` → 1, 2, 3, ou 4 |
| 139 | +- `sortie_motif(rule, pattern_index)` → 0 ou 1 |
| 140 | + |
| 141 | +**Métadonnées**: |
| 142 | +- `note_regle(rule)` → 0–6 (ID de règle notable) |
| 143 | +- `etiquette_note_regle(rule)` → chaîne étiquette |
| 144 | + |
| 145 | +**Énumérés**: |
| 146 | +- `forme_code_*()` → 0–3 (rect, circle, ellipse, triangle) |
| 147 | +- `texture_code_*()` → 0–4 (solide, points, hachures, dégradé, bruit) |
| 148 | +- `fusion_code_*()` → 0–7 (8 modes de fusion) |
| 149 | + |
| 150 | +**Audio (drone)**: |
| 151 | +- `frequence_fondamentale(rule)` → Hz |
| 152 | +- `forme_onde_synthese(rule)` → 1–4 (code forme d'onde) |
| 153 | +- `desaccord_oscillateur_secondaire(rule)` → cents |
| 154 | +- `calcul_densite_densites_cellulaires(total, vivantes)` → 0.0–1.0 |
| 155 | +- `frequence_cutoff_filtre_sonore(densite, base_freq)` → Hz |
| 156 | +- `temps_delai_reverb(rule)` → secondes |
| 157 | + |
| 158 | +**Musique générative**: |
| 159 | +- `tempo_depuis_vitesse(vitesse_sur_1000)` → BPM |
| 160 | +- `gamme_depuis_classe(classe)` → 0–3 (code gamme) |
| 161 | +- `reverb_depuis_symetrie(symetrie_sur_1000)` → 0–1000 |
| 162 | +- `pan_depuis_centre(centre_sur_1000)` → -500 à +500 |
| 163 | +- `octave_depuis_course(course_max, colonnes)` → 3–5 |
| 164 | +- `note_depuis_colonne(col, largeur, gamme_len)` → indice gamme |
| 165 | +- `duree_note_depuis_densite(densite_sur_1000)` → ms |
| 166 | + |
| 167 | +### Utilisation |
| 168 | + |
| 169 | +1. Ouvrir `public/index.html` via un serveur HTTP local (`python -m http.server`, `npx serve`, etc.) |
| 170 | +2. Ajuster la règle, les paramètres de rendu, et l'état initial |
| 171 | +3. Cliquer sur « ▶ Son » pour activer le drone ambiant |
| 172 | +4. Cliquer sur « ▶ Séquenceur » pour activer la musique générative |
| 173 | +5. Partager un lien encodant tous les paramètres via « Copier le lien » |
54 | 174 |
|
55 | | -Le projet distingue maintenant deux niveaux : |
| 175 | +### Ressources |
56 | 176 |
|
57 | | -- la source canonique, qui capture l'objectif complet du projet original : lecture de configuration, generation par lots, semis multicouches, couleurs, formes et evolution probabiliste |
58 | | -- le module WASM-compatible, plus compact, utilise par l'interface statique pour calculer rapidement les transitions dans le navigateur |
| 177 | +- **Règles Wolfram**: [A New Kind of Science](https://www.wolframalpha.com/input/?i=wolfram+rule+30) |
| 178 | +- **Automates cellulaires**: [Wikipedia - Elementary CA](https://en.wikipedia.org/wiki/Elementary_cellular_automaton) |
| 179 | +- **Multilingual Programming**: [Dépôt principal](https://github.com/multilingualprogramming/multilingual) |
| 180 | +- **Web Audio API**: [MDN Documentation](https://developer.mozilla.org/en-US/docs/Web/API/Web_Audio_API) |
0 commit comments