Skip to content

Commit e1e6413

Browse files
Generate music
1 parent 93ba792 commit e1e6413

6 files changed

Lines changed: 552 additions & 29 deletions

File tree

README.md

Lines changed: 151 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,58 +1,180 @@
11
## Cellcosmos
22

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.
44

55
### Objectif
66

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:
88

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é
1213

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
1415

15-
### Structure
16+
#### Explorateur fondamental
1617

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
2222

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
24104

25105
```bash
26-
python -m pip install -r requirements-build.txt
27106
python -m multilingualprogramming scripts/compile_wasm.ml
28107
```
29108

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
31114

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`
33116

34117
```powershell
35118
$env:MULTILINGUAL_DEV_PATH="..\multilingual"
36119
python -m multilingualprogramming scripts/compile_wasm.ml
37120
```
38121

39-
Le build genere :
122+
### Déploiement
40123

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:
46125

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
48129

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`).
50131

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
52133

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 »
54174

55-
Le projet distingue maintenant deux niveaux :
175+
### Ressources
56176

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)

public/index.html

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,9 +63,14 @@ <h1>Cellcosmos</h1>
6363
<div class="actions">
6464
<button type="button" id="btn-download">T&eacute;l&eacute;charger PNG</button>
6565
<button type="button" id="btn-sound">▶ Son</button>
66+
<button type="button" id="btn-sequencer">▶ S&eacute;quenceur</button>
6667
<button type="button" id="btn-share" class="accent-btn">Copier le lien</button>
6768
<button type="button" id="btn-reset">R&eacute;initialiser</button>
6869
</div>
70+
71+
<div id="seq-status" class="seq-status" hidden>
72+
<span class="muted">Tempo&nbsp;</span><span id="seq-tempo"></span><span class="muted"> BPM &nbsp;·&nbsp; Gamme&nbsp;</span><span id="seq-gamme"></span><span class="muted"> &nbsp;·&nbsp; Rang&nbsp;</span><span id="seq-row"></span>
73+
</div>
6974
</div>
7075

7176
<aside class="sidebar">

public/style.css

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -599,3 +599,11 @@ input[type="color"] {
599599
padding: 14px;
600600
}
601601
}
602+
603+
.seq-status {
604+
padding: 10px 18px;
605+
font-family: "IBM Plex Mono", monospace;
606+
font-size: 0.82rem;
607+
color: var(--muted);
608+
border-top: 1px solid var(--border);
609+
}

0 commit comments

Comments
 (0)