# Guide IA — faire composer un morceau pour Piano Electro Ce document sert à **demander des morceaux à une IA** (ChatGPT, Claude, Gemini…) puis à les rejouer dans Piano Electro. L'IA ne produit pas d'audio : elle écrit une **partition JSON** que l'application transforme en musique, avec ton piano et **tes bruitages vocaux**. - 👤 **Section 1** : mode d'emploi pour toi. - 🤖 **Section 2** : le bloc à copier-coller à l'IA. - 📐 **Section 3** : la spécification complète du format. --- ## 1. Mode d'emploi (3 étapes) 1. Dans l'app, panneau **🤖 Composer avec une IA**, clique sur **📋 Copier le prompt pour l'IA**. Le prompt inclut automatiquement **la liste de tes bruitages déjà chargés** (ex. « C4 = voix *ah* ») pour que l'IA compose avec eux. 2. Colle-le dans ChatGPT, puis demande ton morceau : > *« Compose-moi une valse mélancolique en La mineur, environ 45 secondes. »* > *« Fais un motif électro répétitif à 124 BPM sur 32 temps. »* > *« Une berceuse très simple, main droite seule, 12 notes. »* 3. Copie sa réponse, colle-la dans la grande zone de texte, puis **✓ Vérifier** et **▶ Charger et lire**. **Pas besoin de nettoyer la réponse** : l'import tolère le texte de politesse autour, les blocs ```json et les virgules finales. Colle tel quel. ### Que fait le bouton « Vérifier » ? Il valide le JSON et affiche : nombre de notes, durée réelle, ambitus, polyphonie maximale, usage de la pédale, **quelles notes vont déclencher tes bruitages**, et les anomalies (notes hors clavier, notes jamais relâchées, samples embarqués). --- ## 2. Prompt à copier-coller à l'IA > Le bouton **📋 Copier le prompt pour l'IA** copie exactement ce texte, enrichi de tes > samples du moment. Le voici pour référence : ```text Tu composes un morceau pour « Piano Electro », une application de piano web. Réponds UNIQUEMENT par un objet JSON valide (aucun texte avant/après, pas de bloc de code). FORMAT ATTENDU (« partition ») : { "format": "piano-electro.song", "version": 1, "name": "Titre du morceau", "bpm": 100, "settings": { "wave": "epiano", "reverb": 0.3 }, "notes": [ { "n": "C2", "beat": 0, "dur": 2, "v": 0.9, "inst": "bass" }, { "n": "C4", "beat": 0, "dur": 1, "v": 0.8, "inst": "piano" }, { "n": ["C4", "E4", "G4"], "beat": 2, "dur": 2, "v": 0.7 } ], "sustain": [ { "beat": 0, "on": true }, { "beat": 16, "on": false } ] } RÈGLES - "n" : nom de note ("C4", "F#3", "Bb2") ou liste de noms pour un accord. C4 = do central. - "beat" : position en temps, 1 = une noire. 0 = début du morceau. Les décimales sont permises (0.5 = croche). - "dur" : durée en temps (0.25 = double croche, 1 = noire, 2 = blanche, 4 = ronde). - "v" : vélocité de 0.05 à 1.0 (nuance). Varie-la, sinon le jeu sonne mécanique. - "inst" : instrument de la note — "bass" (basse synthé), "piano" (e-piano), ou omis (= automatique : les notes graves passent en basse selon le point de split du clavier). Mets "bass" explicitement pour une ligne de basse, "piano" pour la mélodie et les accords. - "bpm" : tempo. "sustain" est optionnel (pédale : "on": true puis false). - "settings.wave" : "epiano" (défaut), "triangle", "sawtooth", "square" ou "sine". - "settings.bass" : { "wave": "sub" | "saw" | "pluck", "gain": 0-2 } — timbre de la basse. "sub" = ronde et profonde, "saw" = mordante, "pluck" = courte et pincée. - Registre utile : C1 (24) à C6 (84). Basse : C1–B2. Accords : C3–B3. Mélodie : C4–C6. - Les notes peuvent se superposer librement (polyphonie) : mets le même "beat" pour un accord, ou des "beat" décalés pour un arpège. - Vise 30 à 200 entrées dans "notes" pour un morceau de 30 s à 2 min. - N'invente aucun autre champ. N'ajoute ni commentaire ni virgule finale : le JSON doit être parsable tel quel. MUSICALEMENT - Choisis une tonalité et reste cohérent (ex. Am : A B C D E F G). - Structure le morceau : intro / thème / variation / fin. Fais respirer avec des silences. - Écris une VRAIE ligne de basse ("inst": "bass") : la fondamentale de l'accord sur les temps forts, des notes longues (dur 1 à 4), une seule note à la fois (pas d'accord à la basse), et des vélocités entre 0.7 et 1. Elle doit soutenir l'harmonie, pas doubler la mélodie. - Sépare les rôles : basse (C1–B2), accords main gauche (C3–B3), mélodie (C4–C6). - Termine sur une note ou un accord tenu (dur >= 2). ``` --- ## 3. Spécification du format Deux formes sont acceptées à l'import. La **partition** est celle destinée à l'IA et aux humains ; les **événements** sont ce que l'application produit quand tu enregistres en jouant. Si les deux sont présents, `notes` gagne. ### 3.1 Partition (recommandée pour l'IA) ```json { "format": "piano-electro.song", "version": 1, "name": "Petite valse", "bpm": 96, "settings": { "wave": "epiano", "reverb": 0.35, "octave": 48, "master": 0.8 }, "notes": [ { "n": "A3", "beat": 0, "dur": 1, "v": 0.85 }, { "n": ["C4", "E4"], "beat": 1, "dur": 1, "v": 0.6 }, { "n": "B3", "beat": 2, "dur": 0.5, "v": 0.7 }, { "n": 72, "beat": 3, "dur": 2, "v": 1.0 } ], "sustain": [ { "beat": 0, "on": true }, { "beat": 8, "on": false } ] } ``` | Champ | Obligatoire | Détail | |---|---|---| | `format` | non (recommandé) | `"piano-electro.song"` | | `name` | non | titre affiché ; `title` est aussi accepté | | `bpm` | non | tempo, défaut **100**. `1 beat = 60/bpm` secondes | | `notes[].n` | **oui** | `"C4"`, `"F#3"`, `"Bb2"`, un numéro MIDI (`60`), ou un **tableau** pour un accord. Alias : `note`, `midi` | | `notes[].beat` | non | position en temps, défaut `0`. Alias : `b`, `t` | | `notes[].dur` | non | durée en temps, défaut `1`. Alias : `d`, `len`, `duration` | | `notes[].v` | non | vélocité `0.05`–`1`, défaut `0.85`. Alias : `vel`, `velocity` | | `notes[].inst` | non | `"bass"`, `"piano"`, `"sample"` ou omis (= `"auto"`). Alias : `instrument`, `track`. Voir §4 | | `sustain[]` | non | `{ "beat": n, "on": true/false }` | | `settings` | non | `wave`, `reverb` (0–1), `master` (0–1), `octave` (note MIDI de la 1ʳᵉ touche du clavier ordinateur), `bass` | | `settings.bass` | non | `{ "on": true, "split": 60, "wave": "sub"\|"saw"\|"pluck", "gain": 0-2 }` | **Noms de notes** : `C D E F G A B` + `#` (dièse) ou `b` (bémol) + numéro d'octave. `C4 = 60` (do central), `A4 = 69` (la 440 Hz). Les altérations `♯`/`♭` passent aussi. | Note | MIDI | | Note | MIDI | |---|---|---|---|---| | C2 | 36 | | C4 | 60 | | C3 | 48 | | C5 | 72 | | A3 | 57 | | C6 | 84 | **Conversion temps → secondes** : à 96 BPM, un temps vaut `60/96 = 0.625 s`. Une note `{"beat": 4, "dur": 2}` démarre donc à 2,5 s et dure 1,25 s. ### 3.2 Événements (format natif, produit par l'enregistrement) ```json { "format": "piano-electro.song", "version": 1, "name": "Impro", "duration": 2.19, "settings": { "wave": "epiano", "octave": 48, "master": 0.8, "reverb": 0.25 }, "events": [ { "t": 0, "type": "on", "midi": 60, "v": 0.9 }, { "t": 0.2693, "type": "off", "midi": 60 }, { "t": 0.6, "type": "sustain", "on": true } ], "samples": [ { "midi": 60, "name": "voix C4", "params": { "gain": 1, "pitch": 0 }, "audio": "data:audio/webm;codecs=opus;base64,…" } ] } ``` - `t` : secondes depuis le début (horloge audio, précision ~1 ms) - `type` : `on` | `off` | `sustain` - `midi` : numéro MIDI (un nom de note est aussi toléré à l'import) - `samples` : **optionnel** — l'audio des bruitages en base64. Présent, le fichier est autonome : l'app propose d'installer ces samples sur le clavier à l'ouverture. Absent, le morceau se rejoue avec les samples déjà chargés, et au synthé pour les autres touches. --- ## 4. Basse, piano, bruitage : qui joue quoi ? Le clavier est **splité** : par défaut, les notes **sous C4** sont jouées par une **basse synthétique**, les autres par l'e-piano. Le point de split, le timbre (`sub` / `saw` / `pluck`) et le niveau se règlent dans la barre violette « 🎸 Basse » de l'app. Les touches de la zone de basse sont teintées et soulignées de violet. Ordre de décision pour chaque note : | `inst` | Résultat | |---|---| | absent ou `"auto"` | **sample** si la touche en porte un, sinon **basse** si la note est sous le split, sinon **piano** | | `"bass"` | **basse forcée** (même sur une touche samplée) | | `"piano"` | **e-piano forcé** | | `"sample"` | sample si disponible, sinon retour à la règle auto | Écrire une basse depuis une IA : ```json { "bpm": 100, "settings": { "bass": { "wave": "saw", "gain": 1.1 } }, "notes": [ { "n": "A1", "beat": 0, "dur": 2, "v": 0.95, "inst": "bass" }, { "n": "E2", "beat": 2, "dur": 1.5, "v": 0.85, "inst": "bass" }, { "n": ["A3","C4","E4"], "beat": 0, "dur": 4, "v": 0.55, "inst": "piano" }, { "n": "A4", "beat": 0.5, "dur": 0.5, "v": 0.9, "inst": "piano" } ] } ``` Comme la basse est un instrument distinct, `"inst": "bass"` fonctionne **à n'importe quelle hauteur** : une basse écrite en C4 sonnera « basse » et non piano. C'est utile pour des lignes de basse aiguës ou des solos de basse. > **Le clavier s'élargit tout seul.** Si un morceau descend à A1 ou monte à C6, l'affichage > s'étend automatiquement au chargement pour que **toutes les notes jouées soient visibles** > (jusqu'à 6 octaves). L'étendue est aussi réglable à la main dans la barre du haut. --- ## 5. Composer *avec* les bruitages C'est là que l'app devient intéressante : une touche qui porte un sample ne joue pas de piano, elle joue **ton enregistrement**, transposé selon la note. - **Sample sur quelques touches** → dis à l'IA de les utiliser comme accents rythmiques (percussion vocale, cris, onomatopées) et de garder le reste du clavier pour la mélodie. Le prompt copié depuis l'app contient déjà la liste exacte. - **Sample « étendu sur tout le clavier »** (option chromatique) → *tout* le morceau est joué avec ta voix. Demande alors une ligne mélodique claire et peu de polyphonie : le résultat est une mélodie chantée par ton propre échantillon. Exemple de demande : > *« C4 et D4 portent des bruitages de bouche. Fais un groove de 16 temps à 110 BPM qui les > utilise comme kick et snare, avec une basse en C2–G2 et un accord tenu toutes les 4 temps. »* --- ## 6. Erreurs fréquentes | Message | Cause | Correction | |---|---|---| | `JSON invalide : Unexpected token` | JSON réellement cassé (guillemet ou accolade manquante) | redemander le JSON à l'IA en précisant « JSON strictement valide » | | `Il faut soit un tableau "notes", soit "events"` | champ mal nommé (`melody`, `sequence`…) | renommer en `notes` | | `notes[3] : note inconnue « H4 »` | notation allemande | `H` → `B`, et `B` → `Bb` | | `notes[7] : "beat" ou "dur" invalide` | `dur: 0`, ou une chaîne `"1/4"` | mettre un nombre > 0 (`0.25`) | | ℹ️ *notes hors du clavier affiché* | le morceau dépasse l'étendue visible | rien à faire : le clavier s'élargit au chargement (ou règle « Étendue » à la main) | | Le morceau sonne plat | vélocités toutes identiques | demander « varie les vélocités entre 0.4 et 1 » | | Tout sonne comme ma voix | un sample est en mode chromatique | décocher *« Étendre sur tout le clavier »* dans l'éditeur du sample | | La basse sonne comme un piano | `inst` absent et notes au-dessus du split | ajouter `"inst": "bass"`, ou remonter le point de split | | Pas de basse du tout | case « 🎸 Basse » décochée | la recocher dans la barre violette | | La basse sature | `settings.bass.gain` trop haut, ou basse + réverb forte | baisser « Niveau basse », ou passer en timbre `pluck` | --- ## 7. S'inspirer de la bibliothèque Le dossier `songs/` contient 11 morceaux complets au même format (basse + accords + mélodie). Ce sont de bons modèles à montrer à une IA : > *« Voici un morceau existant [coller le contenu de `songs/07-aeronef.json`]. Écris-moi une > pièce dans le même esprit mais en mineur et plus lente. »* Tu peux aussi les charger depuis le panneau **📚 Bibliothèque**, puis copier le JSON depuis la zone de sortie pour le faire retravailler. --- ## 8. Exemple minimal complet À coller directement dans la zone d'import pour tester (do majeur, 4 temps) : ```json { "format": "piano-electro.song", "name": "Test 4 temps", "bpm": 90, "settings": { "wave": "epiano", "reverb": 0.3 }, "notes": [ { "n": ["C3", "G3"], "beat": 0, "dur": 4, "v": 0.5 }, { "n": "C4", "beat": 0, "dur": 0.5, "v": 0.9 }, { "n": "E4", "beat": 0.5, "dur": 0.5, "v": 0.7 }, { "n": "G4", "beat": 1, "dur": 0.5, "v": 0.8 }, { "n": "E4", "beat": 1.5, "dur": 0.5, "v": 0.6 }, { "n": "F4", "beat": 2, "dur": 1, "v": 0.85 }, { "n": "D4", "beat": 3, "dur": 0.5, "v": 0.7 }, { "n": ["C4", "E4", "G4"], "beat": 3.5, "dur": 2, "v": 0.95 } ], "sustain": [ { "beat": 3.5, "on": true }, { "beat": 6, "on": false } ] } ```