Skip to content

feat(axes): profils modaux pour Krumhansl-Kessler — validés, optionnels - #22

Merged
klodynlov merged 1 commit into
mainfrom
feat/profils-modaux
Jul 27, 2026
Merged

feat(axes): profils modaux pour Krumhansl-Kessler — validés, optionnels#22
klodynlov merged 1 commit into
mainfrom
feat/profils-modaux

Conversation

@klodynlov

Copy link
Copy Markdown
Owner

KK ne connaît que majeur et mineur, et lit une pièce mixolydienne à la sous-dominante — 3/22 sur le corpus de contrôle, l'erreur étant à chaque fois la même. Deux profils comblent le trou.

Ce qu'ils sont

Construits, et dits comme tels : ceux de Krumhansl et Kessler sont mesurés sur des auditeurs, ceux-ci ne le sont pas. Chaque mode est son parent dont le degré caractéristique est échangé avec son voisin chromatique — le dorien un mineur qui monte sa sixte, le mixolydien un majeur qui descend sa septième — le reste du profil parent laissé intact, faute de quoi on inventerait des poids que rien n'étaye.

Dorien et mixolydien seulement : les deux modes dont make_corpus écrit la vérité terrain, donc les deux qu'on sait valider. En livrer d'autres reproduirait exactement le défaut qu'on reproche à KK.

estimate_key(hist, MODAL_PROFILES) les utilise. Le défaut ne bouge pas.

Ce qu'ils valent

Deux graines de contrôle fraîches (23 et 31, 311 morceaux non modulants), à histogramme rigoureusement identique :

tonique juste graine 23 graine 31
brut 0.743 0.667
brut+modes 0.809 0.730

Par mode, cumul des deux graines — ce qui est acheté, et le prix :

mode écrit brut brut+modes
dorien 45/58 58/58
mixolydien 9/54 21/54
mineur 69/102 69/102
majeur 96/97 91/97

Le dorien est réglé, le mixolydien à moitié, et cinq pièces en majeur sur 97 se font voler la réponse. Solde +6.5 points de tonique. Le mode suit la tonique : sur brut+modes, toute erreur de mode est déjà une erreur de tonique, jamais l'inverse.

Deux résultats nuls, du même lot. Sur les loops isolés : 0.400 avant, 0.400 après — quatre mesures ne contiennent pas de quoi trancher, un meilleur profil n'y peut rien. Sur l'histogramme du moteur : le gain existe mais reste inutile (0.566 → 0.605), parce que c'est l'histogramme qui plafonne, pas le vocabulaire.

Pourquoi ce n'est pas branché

Le mode retourné traverse sept axes, dont deux en déduisent une gamme, et les poids publiés ont été calibrés avec l'estimateur actuel. La bascule a été essayée pour en chiffrer le coût (défaut modal + PARENT_MODE dans les axes 9 et 14), et le propre gate du dépôt dit qu'elle ne casse rien :

  • scripts/check.sh → CHECK OK ;
  • un seul axe bouge de plus de 0.02, vers le haut : 11_modulation_count 0.604 → 0.650 ;
  • 08_key_stability +0.012, 14_bass_melodic +0.003, 13_tonal_contrast −0.003 ;
  • validation croisée 0.944 → 0.938, dans le bruit (± 0.10).

Elle est donc documentée et défendable — mais elle demande sa propre PR, avec les poids recalibrés et les chiffres du README repris derrière. Dis-moi si tu la veux.

Divers

  • Le harnais passe à quatre estimateurs (brut, brut+modes, pipeline, pipeline+modes) et note le mode là où il est comparable : un estimateur sans dorien n'est jugé que sur la tonique, et face à une étiquette de pack — qui ne dit que « m » — on compare les modes parents. Répondre « dorien » sur un loop étiqueté Dm n'est pas une erreur, c'est peut-être plus précis que l'étiquette.
  • 8 tests sur le contrat des profils, dont la garantie que le défaut reste maj/min.
  • 235 passed, 40 subtests passed · scripts/check.sh → CHECK OK.

🤖 Generated with Claude Code

KK ne connaît que majeur et mineur, et lit une pièce mixolydienne à la
sous-dominante. Deux profils comblent le trou, construits et non mesurés
sur des auditeurs comme les originaux : chaque mode est son parent dont
le degré caractéristique est échangé avec son voisin chromatique — le
dorien un mineur qui monte sa sixte, le mixolydien un majeur qui descend
sa septième, le reste du profil parent intact. Dorien et mixolydien
seulement : les deux modes dont make_corpus écrit la vérité terrain, donc
les deux qu'on sait valider.

`estimate_key(hist, MODAL_PROFILES)` les utilise ; le défaut ne bouge pas.

Validé sur deux graines de contrôle fraîches (23 et 31, 311 morceaux non
modulants), à histogramme identique :

  tonique juste   graine 23   graine 31
  brut               0.743       0.667
  brut+modes         0.809       0.730

Par mode, cumul des deux graines : dorien 45/58 → 58/58, mixolydien 9/54
→ 21/54, mineur 69/102 inchangé, majeur 96/97 → 91/97 — le prix. Le mode
suit la tonique : toute erreur de mode est déjà une erreur de tonique.

Deux résultats nuls du même lot : sur les loops isolés les profils ne
changent rien (0.400 avant et après — il n'y a pas de quoi trancher dans
quatre mesures), et sur l'histogramme du moteur le gain existe mais reste
inutile (0.566 → 0.605), parce que c'est l'histogramme qui plafonne.

Pas branché par défaut : le mode traverse sept axes, dont deux en
déduisent une gamme, et les poids publiés ont été calibrés avec
l'estimateur actuel. La bascule a été essayée pour en chiffrer le coût —
défaut modal + PARENT_MODE dans les axes 9 et 14 : check.sh → CHECK OK,
un seul axe bouge de plus de 0.02 et vers le haut (11_modulation_count
0.604 → 0.650), l'axe 8 gagne 0.012, la validation croisée 0.944 → 0.938
(dans le bruit). Documentée et défendable, elle demande sa propre PR avec
les poids recalibrés.

Le harnais de mesure passe à quatre estimateurs (brut, brut+modes,
pipeline, pipeline+modes) et note le mode là où il est comparable : un
estimateur sans dorien n'est jugé que sur la tonique, et face à une
étiquette de pack — qui ne dit que « m » — on compare les modes parents.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@klodynlov
klodynlov merged commit 6cca8c3 into main Jul 27, 2026
10 checks passed
@klodynlov
klodynlov deleted the feat/profils-modaux branch July 27, 2026 16:25
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant