diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..c9f514b --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,120 @@ +# Journal des versions — _chordlab + +Historique des ajouts, modifications et corrections. Les versions les plus récentes figurent en haut. + +Conventions : +**Ajouté** (nouvelle fonctionnalité) · **Modifié** (comportement existant changé) · **Corrigé** (bug) · **Retiré** (fonctionnalité supprimée) · **Documentation** + +--- + +## [2.4] — dispositions clavier QWERTY et AZERTY + +### Ajouté +- **Sélecteur de disposition clavier QWERTY / AZERTY**, placé sous le clavier de l'application. Jusqu'ici la correspondance des touches était figée en QWERTY : sur un clavier AZERTY, les deux touches concernées par la divergence sont précisément **A→Q (Do) et W→Z (Do dièse)**, ce qui rendait le jeu au clavier physique impraticable. Les dix autres touches (S E D F T G Y H U J) sont communes aux deux dispositions. +- **Détection au démarrage** d'après la langue du navigateur : AZERTY si la langue commence par `fr`, QWERTY sinon. Il s'agit d'une heuristique, le sélecteur permet de la corriger en un clic. +- La disposition retenue est **enregistrée dans les sessions `.json`** et restaurée au chargement. +- La ligne d'aide sous le clavier affiche les lettres de la disposition active. + +### Modifié +- La table de correspondance unique est remplacée par deux tables commutables ; les gestionnaires d'événements clavier lisent la disposition courante à chaque frappe. + +### Documentation +- Manuels FR et EN : section « Raccourcis clavier » complétée, figure 12 montrant les deux dispositions côte à côte avec les touches divergentes mises en évidence. +- Tutoriel Markdown et README mis à jour. + +--- + +## [2.3] — correctif basse slash + +### Corrigé +- **Le sélecteur « basse / » restait sans effet en Key Mode.** La basse jouait systématiquement la fondamentale, quel que soit le choix (tierce, quinte, septième). Le calcul du renversement reconstruisait l'accord à partir du type et des tensions ; or en Key Mode l'accord provient de l'harmonisation diatonique et ne passe pas par ce chemin. Le bug était invisible hors Key Mode, ce qui le rendait intermittent selon la configuration. + *Correction :* `slashInterval()` et `bassNoteFor()` remplacés par `slashIntervalFrom()` et `bassFromRaw()`, qui dérivent la note de basse des **notes réelles de l'accord** — valable dans les deux modes. +- **Basse forcée sur la fondamentale dans les progressions générées.** Le chargement d'un preset et le bouton *✦ suggérer* écrivaient la basse en dur, ignorant le sélecteur ainsi que le nom slash (`C/E`) dans le libellé du slot. +- Le nom d'accord slash s'affiche désormais correctement partout, y compris en Key Mode (`C/E`, `Dm/F`, `G7*/F`). + +### Comportement à connaître +- Demander la **septième** sur une triade (accord sans septième) fait retomber la basse sur la fondamentale plutôt que d'inventer une note. Activer la tension `m7` ou `M7` pour l'obtenir. + +--- + +## [2.2] — simplification de la basse + +### Retiré +- **Les 10 rythmiques de basse** introduites en 2.1 (sélecteur *rythme B*, affichage LCD associé, moteur `renderBassEvents`, persistance en session). La basse revient à une **note tenue** sur toute la durée de l'accord. + +### Conservé +- Les durées libres de 1 à 16 temps par slot (voir 2.1). Les sessions `.json` enregistrées en 2.1 se rechargent sans erreur : le champ de rythme éventuel est ignoré. + +--- + +## [2.1] — rythmiques de basse et durées libres + +### Ajouté +- **10 rythmiques de basse** : tenue, noires, croches, contretemps, octaves alternées, fondamentale–quinte, boogie, tresillo 3–3–2, pompe, aléatoire probabiliste. Rendues à l'identique en audition, MIDI live et export `.mid`, avec bornage de chaque frappe à la fin du slot. +- **Durée de slot réglable de 1 à 16 temps** au pas de 1, via des boutons `−` / `+`. Rend possibles les accords de 3, 5 ou 7 temps et les mesures asymétriques. + +### Modifié +- Le badge de durée cyclique (4 → 8 → 2 → 1 temps) est remplacé par les boutons `−` / `+`. +- Chargement de session : les durées sont bornées entre 1 et 16 pour garantir la compatibilité ascendante. + +--- + +## [2.0] — refonte harmonique + +### Ajouté +- **Types d'accords portés de 4 à 8**, tous en boutons directs : Dim, Min, Maj, Aug, Sus2, Sus4, power chord (5), m♭6. +- **Tensions étendues** : ♭9, ♯9, 11, ♯11, 13 s'ajoutent aux 6, m7, M7, 9. +- **Altérations** : ♭5 et ♯5 (qui *remplacent* la quinte au lieu de s'y ajouter), et `no3` pour retirer la tierce. +- **Drop voicings** appliqués après la rotation : close, drop 2, drop 3, drop 2+4, spread. +- **Accords slash** : basse sur la fondamentale, la tierce, la quinte ou la septième, avec détection de l'intervalle correct selon le type d'accord et affichage `C/E` sur le LCD. +- **Voice-leading** : `VL AUTO` re-voice chaque accord ajouté pour minimiser le déplacement des voix ; le bouton `⇄ voice-leading` optimise toute la progression d'un coup. +- **Suggestion harmonique** (`✦ suggérer`) : propose l'accord suivant via une table d'harmonie fonctionnelle, dans la tonalité courante. +- **Key Mode porté à 8 gammes** : majeur, mineur naturel, mineur harmonique, dorien, phrygien, lydien, mixolydien, locrien. Harmonisation diatonique jusqu'à la 13e. +- **Modes de performance** : block, strum ↑/↓, harp, arpèges ↑/↓/↕/aléatoire, à 1/8, 1/16 ou 1/32. Rendus dans l'audio, le MIDI live **et** l'export `.mid` (rendu désactivable). +- **Humanisation** optionnelle des vélocités (±10) et du timing (±15 ms). +- **Durée individuelle par slot** et réordonnancement des slots (`‹` / `›`). +- **Sauvegarde et chargement de session** en fichier `.json` (réglages complets + progression). Aucun stockage navigateur : le fichier est l'unique persistance. +- Preset supplémentaire : cycle des quintes. + +### Modifié +- Les types d'accords passent de la sélection multiple avec combinaisons implicites à une **sélection unique** : Aug et Sus2 deviennent des boutons dédiés au lieu de résulter d'une combinaison. +- Le moteur de rendu est unifié : une fonction `renderEvents()` unique alimente l'audio, le MIDI live et l'export, ce qui garantit que les trois sorties sont identiques. +- Nommage des accords enrichi (`Cdim7`, `Cø7`, `C7(♭9)`, `Cadd9`, `Cmaj7(♯11)`…). + +### Corrigé +- Nommage des accords `add9`, `add11` et `add13` : ils s'écrivaient entre parenthèses comme des tensions alors qu'aucune septième n'était présente. + +--- + +## [1.0] — version initiale + +### Ajouté +- Construction d'accords par description : clavier une octave pour la fondamentale, 4 types (Dim, Min, Maj, Sus) et 4 extensions empilables (6, m7, M7, 9). +- Combinaisons implicites : `Dim + Maj` = augmenté, `Min + Sus` = sus2. +- **Knob de voicing rotatif ±8** : chaque cran remonte la note la plus grave d'une octave (ou descend la plus aiguë). +- **Key Mode** sur deux gammes (majeur, mineur naturel) avec grisage des touches hors tonalité. +- Moteur de basse sur canal MIDI séparé (−1 / −2 octaves). +- Rack de progression avec ajout (`ADD` / barre espace), lecture, boucle et BPM réglable. +- 7 presets de cadences générés dans la tonalité choisie. +- **Sortie Web MIDI live** avec canaux distincts pour les accords et la basse. +- **Export `.mid`** : writer MIDI maison, format 1, PPQ 480, tempo intégré, une ou deux pistes. +- Synthé de pré-écoute intégré (Web Audio : deux dents de scie désaccordées, filtre passe-bas ; onde triangle pour la basse). + +--- + +## Documentation + +| Version | Élément | +|---|---| +| 2.3 | Manuel visuel traduit en anglais (`tuto_en.html`), sélecteur de langue entre les deux manuels, liens vers les manuels ajoutés dans le pied de page de l'application | +| 2.2 | Manuel visuel HTML (`tuto.html`) : 10 sections et 12 figures SVG (cartographie de l'interface, rotation du voicing, drop voicings, Key Mode, anatomie d'un slot, voice-leading, modes de performance en piano-roll, routage MIDI, flux d'export, raccourcis) | +| 2.0 | `README.md`, tutoriel d'utilisation Markdown, tutoriel de déploiement Coolify (dépôt Git → build pack statique → Traefik, procédure de mise à jour et table de dépannage) | + +--- + +## Notes techniques transversales + +- **Aucune dépendance externe** depuis la version 1.0 : JavaScript natif, Web Audio API, Web MIDI API, FileReader. Un seul fichier HTML. +- **Aucun stockage navigateur** (ni `localStorage`, ni `sessionStorage`) : l'état ne persiste que par les fichiers de session `.json` exportés. +- **Web MIDI exige un contexte sécurisé** (`https://` ou `localhost`). En `file://`, l'audio et l'export fonctionnent mais la sortie MIDI live est bloquée par le navigateur. Safari ne supporte pas Web MIDI. +- Canaux MIDI par défaut : accords sur le canal 3, basse sur le canal 5. diff --git a/README.md b/README.md index d7e45b2..2569224 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # _chordlab ORC·v2 -Générateur d'accords et de progressions harmoniques dans le navigateur, inspiré de la logique du **Telepathic Instruments Orchid ORC-1** (implémentation indépendante, étendue). Un seul fichier HTML, zéro dépendance, zéro backend. +Générateur d'accords et de progressions harmoniques dans le navigateur. Un seul fichier HTML, zéro dépendance, zéro backend. > Construis un accord avec un doigt, façonne son voicing, chaîne une progression, envoie-la en MIDI live vers ton studio dawless ou exporte-la en `.mid` pour ton DAW. @@ -9,7 +9,7 @@ Générateur d'accords et de progressions harmoniques dans le navigateur, inspir ## Fonctionnalités **Construction d'accords** -- Clavier une octave pour la fondamentale (souris, tactile ou clavier PC) +- Clavier une octave pour la fondamentale (souris, tactile ou clavier PC, dispositions **QWERTY et AZERTY**) - 8 types d'accords : Dim · Min · Maj · Aug · Sus2 · Sus4 · 5 (power chord) · m♭6 - 12 modificateurs empilables : 6 · m7 · M7 · 9 · ♭9 · ♯9 · 11 · ♯11 · 13 · ♭5 · ♯5 · no3 - Nommage automatique (Cm7, Cdim7, Cø7, C7(♭9)…) affiché sur le LCD @@ -65,8 +65,10 @@ Modifiables dans le panneau **MIDI out (live)**. L'export `.mid` reprend les mê ``` chordlab/ ├── index.html # l'application complète -├── tuto.html # manuel visuel (accessible à /tuto.html) +├── tuto.html # manuel visuel FR (accessible à /tuto.html) +├── tuto_en.html # manuel visuel EN (accessible à /tuto_en.html) ├── README.md +├── CHANGELOG.md # journal des versions └── docs/ ├── TUTORIEL_UTILISATION.md # guide utilisateur complet └── TUTORIEL_DEPLOIEMENT_COOLIFY.md # mise en ligne + mises à jour @@ -86,12 +88,12 @@ chordlab/ ## Notes de conception -- Le moteur de voicing reproduit le principe du dial de l'Orchid : chaque cran fait une **rotation** de l'accord (la note la plus grave remonte d'une octave, ou l'inverse), sur ±8 crans. +- Le moteur de voicing procède par **rotation** : chaque cran remonte la note la plus grave d'une octave (ou descend la plus aiguë), sur ±8 crans. - Les combinaisons classiques tombent naturellement : `DIM + 6 = dim7`, `DIM + m7 = ø7` (demi-diminué), `MAJ + m7 + ♯9 = accord Hendrix`. -- Empiler `m7 + M7` affiche `WTF?` sur le LCD — clin d'œil assumé à l'Orchid. +- Empiler `m7 + M7` affiche `WTF?` sur le LCD : la combinaison est musicalement contradictoire, mais rien ne l'interdit. - Le voice-leading minimise la somme des déplacements de voix entre deux accords en testant les rotations de voicing candidates. - Aucune donnée n'est stockée dans le navigateur : la persistance passe exclusivement par les fichiers `.json` de session. ## Licence & crédit -Projet personnel underscorelab / leradiologue. La logique d'accords s'inspire du concept de l'Orchid ORC-1 de Telepathic Instruments, sans réutiliser ni code, ni sons, ni assets de l'instrument original. +Projet personnel underscorelab / leradiologue. Code original, sans dépendance ni asset tiers. diff --git a/TUTORIEL_UTILISATION.md b/TUTORIEL_UTILISATION.md index 4968dca..626bb99 100644 --- a/TUTORIEL_UTILISATION.md +++ b/TUTORIEL_UTILISATION.md @@ -28,7 +28,7 @@ Le **LCD** est votre référence permanente : il affiche le nom de l'accord cour ## 2. Jouer un accord -Le principe fondamental, hérité de l'Orchid : **vous ne jouez jamais les notes de l'accord, vous le décrivez**. +Le principe fondamental : **vous ne jouez jamais les notes de l'accord, vous le décrivez**. 1. **Type** — un seul actif à la fois (LED allumée). MAJ est sélectionné au démarrage. 2. **Fondamentale** — cliquez une touche du clavier, ou utilisez le clavier PC : `A W S E D F T G Y H U J` = C C# D D# E F F# G G# A A# B. @@ -210,9 +210,12 @@ L'application ne stocke rien dans le navigateur : le fichier `.json` est l'uniqu ## 11. Raccourcis clavier +Un sélecteur **QWERTY / AZERTY** se trouve sous le clavier de l'application. Seules deux touches diffèrent entre les deux dispositions, mais ce sont le Do et le Do dièse. La disposition est choisie au démarrage d'après la langue du navigateur, modifiable d'un clic, et conservée dans les sessions `.json`. + | Touche | Action | |---|---| -| A W S E D F T G Y H U J | fondamentales C → B | +| A W S E D F T G Y H U J | fondamentales C → B (QWERTY) | +| Q Z S E D F T G Y H U J | fondamentales C → B (AZERTY) | | Espace | ADD (ajouter l'accord courant à la progression) | | ← / → | voicing −1 / +1 | | ↑ ↓ ← → (knob focalisé) | voicing fin | diff --git a/index.html b/index.html index dfabc17..c5f350f 100644 --- a/index.html +++ b/index.html @@ -136,7 +136,18 @@ } .bkey:active,.bkey.pressed{background:#3A362C} .bkey.outkey{background:#4B4739} - .kbd-hint{font-size:.55rem;color:var(--silk-light);opacity:.4;margin-top:.5rem;letter-spacing:.08em} + .kbd-hint{font-size:.55rem;color:var(--silk-light);opacity:.4;letter-spacing:.08em} + .kbd-foot{display:flex;align-items:center;justify-content:space-between;gap:.6rem;margin-top:.5rem;flex-wrap:wrap} + .seg{display:inline-flex;border:1px solid #4A4436;border-radius:6px;overflow:hidden;flex:none} + .segbtn{ + background:var(--module-2);border:none; + color:var(--silk-light);font-family:var(--mono); + font-size:.55rem;letter-spacing:.1em; + padding:.28rem .5rem;cursor:pointer;opacity:.5; + } + .segbtn + .segbtn{border-left:1px solid #4A4436} + .segbtn.on{background:#4A4436;color:var(--led-on);opacity:1} + .segbtn:focus-visible{outline:2px solid var(--led-on);outline-offset:-2px} /* ---------- Colonne voicing ---------- */ .side{display:flex;flex-direction:column;gap:.65rem} @@ -220,6 +231,15 @@ } footer{margin-top:1rem;font-size:.55rem;opacity:.5;letter-spacing:.1em;text-align:right} + footer .doclink{ + color:var(--silk);text-decoration:none; + border-bottom:1px solid rgba(64,58,47,.45); + padding-bottom:1px; + } + footer .doclink:hover,footer .doclink:focus-visible{ + color:var(--accent);border-bottom-color:var(--accent);outline:none; + } + footer .docsep{margin:0 .35rem;opacity:.5} @media (max-width:900px){ .deck{grid-template-columns:1fr} @@ -234,7 +254,7 @@