한국어 · English · 日本語 · 中文 · Français · Español
Si vous avez collaboré ou contribué à ce projet, ou si vous souhaitez le faire, merci de me contacter personnellement. Ce projet est un logiciel dont le code source est ouvert afin que chacun puisse l’utiliser gratuitement. Pour un usage personnel et non commercial, vous pouvez l’utiliser tel quel sans frais. Toutefois, les droits d’auteur et la propriété appartiennent à l’auteur original, aux collaborateurs et aux contributeurs : sans l’autorisation de l’auteur original, vous ne pouvez ni le modifier, ni en extraire une partie pour l’intégrer à votre propre programme (y compris pour votre seul usage personnel), ni revendiquer ce programme comme le vôtre, ni le distribuer ou le vendre ailleurs. Il n’est pas non plus permis de publier des modifications sur un fork GitHub. L’utilisation par des organisations telles qu’écoles, instituts privés, clubs, églises, organisations religieuses ou entreprises n’est pas automatiquement gratuite ; merci de me contacter au préalable. Les conditions détaillées figurent dans le fichier LICENSE.
Chordity est une page web qui, à partir d’un fichier de chanson, écrit les accords de chaque mesure et fait battre un métronome exactement sur les temps du morceau.
Au moment où l’accord change, un piano joue cet accord, ce qui vous permet de vérifier à l’oreille tout en jouant. Aucune installation, aucune inscription ni aucune connexion Internet n’est nécessaire. Vos fichiers audio ne quittent jamais votre ordinateur.
Les résultats peuvent être erronés. Les principes d’analyse, les raisons des décisions prises et la manière de vérifier et de corriger les résultats sont expliqués dans la page d’aide. Vous pouvez aussi l’ouvrir en cliquant sur le texte d’information tout en bas de l’application.
Chordity: per-measure chord recognition, a beat-locked metronome and synthesized piano chord playback in a single offline HTML file. No libraries, no uploads.

chordity.html dans un navigateur comme Chrome, Edge, Safari ou Firefox.Tout fichier que le navigateur sait lire convient : MP3, WAV, M4A, FLAC, OGG, etc.
| Ce que vous voyez | Signification |
|---|---|
| Cadre surligné en jaune | L’accord qui sonne en ce moment. Il s’étend du temps où cet accord est frappé jusqu’à l’endroit où apparaît l’accord suivant (si un accord gris tenu se prolonge sur la mesure suivante, jusque-là ; en cas de retour à la ligne, un morceau par ligne). Quand l’accord change, il rebondit comme un ressort vers l’accord suivant |
| Remplissage orange dans le cadre | La part de cet accord déjà jouée (barre de progression). Le bord du remplissage correspond à la position de lecture actuelle et atteint la barre oblique d’un temps au moment où ce temps commence |
| Nom d’accord agrandi | Le nom de l’accord qui sonne (accord nouvellement frappé). Il grossit d’un coup à son arrivée, puis reprend lentement sa taille normale quand on passe à l’accord suivant. Il ne grossit que jusqu’à ne pas toucher le nom suivant |
Barre oblique / |
Un temps. La barre oblique qui devient plus foncée est le temps en cours |
| Barre oblique épaisse | Un temps où l’accord est frappé de nouveau (temps portant un accord en noir). On voit ainsi sur quel rythme les accords sont joués. Aux emplacements des accords gris et de N.C., la barre oblique est normale |
C Am G7 |
Noms d’accords. Placé juste au-dessus d’une barre oblique, l’accord change sur ce temps |
G/B |
Accord de G dont la note la plus grave est B |
| Petits caractères, noms d’accords sur deux lignes (haut/bas) | Quand une mesure contient beaucoup d’accords et qu’un nom touche l’accord suivant, la taille du texte est réduite ; si cela ne suffit toujours pas, les noms de cette mesure sont placés en alternance sur deux lignes, en haut et en bas (le bord gauche du nom correspond au temps où l’accord est frappé). Sur un écran étroit, si le nom long du dernier temps d’une mesure ne tient même pas sur deux lignes, les parties les moins importantes sont retirées et … est ajouté (Bm7/F♯ → Bm7…). Le nom complet s’affiche au survol de la souris ou, pendant la lecture, dans la case de l’accord actuel en haut |
| Accord gris | L’accord de la mesure précédente est tenu sans être frappé de nouveau. Même pour un accord identique, s’il est frappé de nouveau sur le premier temps de la mesure, il est écrit en noir |
N.C. |
Passage sans accord (quand on n’entend que la batterie ou quand c’est silencieux) |
| Mesure 0 | Le passage où la chanson commence au milieu d’une mesure (anacrouse) |
Indication comme 2박 au-dessus d’une mesure |
Seule cette mesure a un nombre de temps différent (ici « 2 temps ») |
Étiquette noire E 장조로 |
La tonalité change à partir de ce temps (modulation). La case de tonalité en haut l’indique aussi, par exemple E♭ 장조 → E 장조. Sur la première mesure du morceau, la tonalité et la mesure de départ sont affichées sans particule (C 장조 4/4, comme l’armure et la signature rythmique d’une partition). Le coréen ajoute après une valeur nouvelle la particule 로/으로 (« vers ») ; 장조 signifie « majeur » |
Étiquette noire 3/4으로 |
La mesure (signature rythmique) change à partir de cette mesure (changement de mesure). La case de mesure en haut l’indique aussi, par exemple 4/4 → 3/4 → 4/4 |
Pastille blanche 72 132로 |
Le tempo à partir de ce temps (BPM, arrondi), sur la ligne sous les barres obliques. Sur le temps où commence le morceau, le tempo de départ est affiché en chiffres seuls ; là où le tempo change brusquement, la particule coréenne 로/으로 (« vers ») est ajoutée au nouveau tempo |
Cadre hexagonal blanc 여기까지 63 |
Passage où le tempo change progressivement (ligne sous les barres obliques ; 여기까지 signifie « jusqu’ici »). La longueur couverte par le cadre est le passage du changement ; lorsque la position de lecture se trouve dans le cadre, il se remplit de la couleur du surligneur à mesure de l’avancée et affiche le tempo actuel, comme 현재 67 (« actuel 67 »). Une fois rempli jusqu’au bout, il pâlit en blanc et la pastille blanche du temps suivant la fin du cadre (le tempo d’arrivée) s’allume brièvement |
| Tempo (case du haut et barre de lecture) | Le tempo à la position de lecture. Si le tempo change progressivement, il suit le mouvement : 120, 119, 118… La barre de lecture reste fixée en haut de l’écran même en faisant défiler, et est donc toujours visible |
Noms du type 8B, 9A avec de petits caractères |
Noms d’accords lorsque la notation Camelot est choisie (voir « Afficher en Camelot » ci-dessous) |
Chiffres romains comme I, vi, V7/ii |
Noms d’accords lorsque la notation en chiffres romains est choisie (voir « Afficher en chiffres romains » ci-dessous) |
| Voyants ronds | Indiquent le numéro du temps en cours. Le plus grand rond est le premier temps de la mesure |
| « Suivant G » (« 다음 G ») en haut | L’accord qui va arriver |
| Boutons métronome et jeu des accords | Chaque appui active ou désactive la fonction |
| Curseurs musique, clic, accords | Règlent séparément le volume de l’enregistrement original, du métronome et des accords de piano |
Dans la plupart des cas, tout se cale automatiquement, mais selon les chansons, chacun peut compter les temps différemment. Ouvrez Les temps ne tombent pas juste ? Corriger (« 박이 안 맞나요? 보정하기 ») et essayez les boutons ci-dessous. Le changement est immédiat.
| Si vous entendez ceci | Utilisez ce bouton |
|---|---|
| Le clic tombe entre les temps | Décaler d’½ temps (« ½박 옮기기 ») |
| Les clics sont trop serrés | Moitié ÷2 (« 절반으로 ÷2 ») |
| Les clics sont trop espacés | Deux fois plus vite ×2 (« 두 배 빠르게 ×2 ») |
| Le morceau a un feeling en 6/8 mais il y a trop de clics | Grouper par trois ÷3 (« 셋씩 묶기 ÷3 ») |
| Le début des mesures est décalé d’un temps | Avancer d’un temps, retarder d’un temps (« 한 박 앞당기기 », « 한 박 늦추기 ») |
| Le clic semble très légèrement en avance ou en retard | Synchronisation du clic (« 클릭 타이밍 ») |
| Vous voulez remettre la correction des temps à l’état initial | Annuler la correction des temps (« 박 보정 되돌리기 ») |
| Vous voulez remettre les réglages comme le type d’accords à l’état initial | Réglages par défaut (« 설정 기본값으로 ») |
Ce que vous avez modifié s’affiche dans la même case, sous En vigueur (« 적용 중 »), réparti entre « Correction des temps » (« 박 보정 ») et « Réglages » (« 설정 »). Même lorsque la case est repliée, un résumé reste visible à côté du titre.
Pour afficher des accords plus simples, choisissez « Basique » (« 기본 ») dans Type d’accords (« 코드 종류 ») ; pour voir aussi les accords qui changent à l’intérieur d’un temps, choisissez « Par ½ temps » (« ½박 단위 »). En mode ½ temps, le métronome ajoute aussi un petit « tic » aigu entre les temps (à la place des croches) et joue « tic-tic-tac-tic-tac-tic-tac-tic » (« 띡-틱-딱-틱-딱-틱-딱-틱 »).
La barre Notation des accords (« 코드 표기 ») juste au-dessus de la grille permet de voir un même accord de trois façons. Le changement est immédiat et s’applique à la fois à la grille, aux accords actuel et suivant et à la grille en texte ; la façon choisie est conservée à la prochaine ouverture. Au clavier, placez le focus sur la barre et changez avec ← et →.
| Bouton | Exemple | Utile quand |
|---|---|---|
| Noms de notes (« 음이름 ») | E♭, B♭/D, Cm7 | Vous voulez jouer directement en lisant les accords, ou échanger des accords entre musiciens |
| Camelot (« 카멜롯 ») | 5B, 6B, 3A⁷ | Vous cherchez des tonalités et des accords qui s’accordent bien, ou choisissez un point de mixage DJ |
| Chiffres romains (« 로마 숫자 ») | I, V⁶, ii⁷/IV | Vous analysez la progression harmonique d’un morceau, ou le transposez dans une autre tonalité |
Les trois images ci-dessous montrent les mêmes 11 mesures en E♭ majeur dans chacune des notations.

C’est la notation d’accords la plus familière. La fondamentale est écrite en grand, les qualités comme m, sus ou dim un peu plus petit, et les extensions comme 7 ou maj7 en exposant, si bien que même les accords complexes se lisent d’un coup d’œil.
B♭/D de la deuxième mesure signifie qu’il faut jouer un accord de B♭ avec D comme note la plus grave. Les accords dont la basse est la septième, comme le B♭7/A♭ de la sixième mesure, sont aussi écrits tels quels.N.C.. Même pour un accord identique, s’il est frappé de nouveau sur le premier temps de la mesure, il est écrit en noir.
Les accords sont écrits avec les numéros de la roue Camelot qu’utilisent les DJ pour enchaîner les morceaux. Les tonalités sont placées sur les positions 1 à 12 dans l’ordre du cycle des quintes, avec B pour la famille majeure et A pour la famille mineure. Les tonalités et accords dont les numéros sont identiques ou ne diffèrent que d’un sonnent bien ensemble.
3A⁷ (B♭m7) de la quatrième mesure est éloigné, car c’est un accord emprunté brièvement pour aller vers le IV, A♭maj7 (4B).E♭ 장조(5B) (E♭ majeur).B♭/D → 6B). Le jeu des accords, lui, joue bien la note de basse.
Il s’agit de l’analyse harmonique en chiffres romains utilisée dans les traités d’harmonie. Au lieu des noms de notes, chaque accord est écrit selon le degré de la tonalité sur lequel il est bâti, ce qui révèle la charpente sur laquelle se déplace le morceau. Une même progression apparaît avec les mêmes chiffres quelle que soit la tonalité, ce qui facilite la transposition ou la comparaison des progressions de plusieurs morceaux.
I – V⁶ – vi forment une progression où la basse descend note par note, E♭ → D → C. Le ii⁷/IV – V⁷/IV – IVᴹ⁷ qui suit emprunte brièvement le ii–V de A♭ majeur pour aller vers le IV (A♭maj7), et le ii⁷ – V⁷ – I final est la cadence la plus élémentaire.V⁶ de la deuxième mesure a la tierce (D) à la basse, et le V⁴₂ de la sixième mesure a la septième (A♭) à la basse.| Notation | Signification |
|---|---|
| I, IV, V (majuscules) | Accords de la famille de l’accord parfait majeur. Le chiffre indique le degré de la tonalité sur lequel l’accord est bâti |
| i, ii, vi (minuscules) | Accords de la famille de l’accord parfait mineur |
| °, ø, +, M | Accord diminué (°), septième demi-diminuée (ø), accord augmenté (+), septième majeure (M7) |
| 7 | Accord de septième |
| 6, ⁶₄ | Renversements de l’accord de trois sons. 6 si la basse est la tierce, ⁶₄ si c’est la quinte |
| ⁶₅, ⁴₃, ⁴₂ | Renversements de l’accord de septième, quand la basse est la tierce, la quinte ou la septième |
| V/x, vii°/x, ii/x | Accord utilisé brièvement pour aller vers x (accord secondaire). V7/vi est la septième de dominante qui mène à vi |
| ♭VI, ♭VII, etc. | Degrés hors de la gamme de la tonalité, par exemple des accords empruntés au mode mineur de même tonique (accords d’emprunt) |
Si vous activez le Jeu des accords (« 코드 연주 »), le piano joue l’accord au moment où il change. En l’écoutant superposé à l’enregistrement original, vous pouvez vérifier immédiatement à l’oreille si l’accord écrit est juste, et cela sert aussi de guide quand vous jouez. Le piano s’accorde automatiquement sur la hauteur du morceau, si bien qu’il ne sonne pas faux par rapport à l’original.
| Touche | Action |
|---|---|
| Space | Lecture, pause |
| M | Activer, désactiver le métronome |
| P | Activer, désactiver le jeu des accords |
| ← → | Mesure précédente, mesure suivante |
| Home | Retour au début |
Cliquer sur une mesure vous y amène ; cliquer sur la forme d’onde en haut ou la faire glisser vous amène aussi à l’endroit voulu. Les raccourcis fonctionnent même lorsque le clavier est en mode de saisie coréenne.
Les chansons aux temps bien marqués, comme la pop, le rock, les ballades, la dance, le hip-hop, la K-pop ou la pop acoustique avec batterie, fonctionnent bien. Les chansons dont le tempo change fortement en cours de route, les mesures irrégulières comme 5/4 ou 7/4, les accords dont la basse est hors de l’accord comme F/G, et les power chords du rock (E5) sont aussi reconnus. Les morceaux riches en tensions et en walking bass comme le jazz, ceux que l’on ressent par unités de deux temps comme la bossa-nova (les mesures sont écrites avec une longueur double), le metal à distorsion très forte, et les morceaux dont les temps peuvent se compter de deux façons comme le reggae peuvent donner des erreurs. Dans ce cas, utilisez les boutons de correction ci-dessus.

Ce programme n’utilise aucun modèle d’intelligence artificielle préentraîné. Il fonctionne grâce au traitement du signal et à des modèles probabilistes qui traduisent en formules les propriétés physiques du son et les règles de la musique. On peut donc expliquer chaque décision une par une, et vous pouvez en consulter directement les justifications dans Informations d’analyse (« 분석 정보 ») en bas de l’écran.
Le son est une vibration de l’air, et un fichier audio est une suite de nombres mesurant cette vibration des dizaines de milliers de fois par seconde. Comme il est difficile de savoir quelles notes sonnent en regardant seulement ces nombres, on découpe le son en tranches très courtes et l’on calcule pour chacune quelles hauteurs y sont mélangées et dans quelle proportion (le spectre). En alignant ces tranches dans l’ordre du temps, on obtient une image du son (le spectrogramme) dont l’axe horizontal est le temps et l’axe vertical la hauteur. Toute l’analyse qui suit consiste à lire cette image.
Il y a là un compromis inévitable. Des tranches courtes indiquent précisément quand un son s’est produit mais rendent flou quelle note c’est ; des tranches longues font l’inverse. On utilise donc des tranches courtes pour trouver les temps et des tranches longues pour trouver les accords. Pour les notes de basse les plus graves, l’écart de fréquence entre deux demi-tons est très petit, si bien qu’il faut les tranches les plus longues.
Quand on frappe une batterie ou qu’on enfonce une touche, l’énergie sonore augmente brusquement à cet instant. On appelle cet instant une attaque (onset). Si l’on additionne uniquement les parties du spectrogramme qui ont augmenté par rapport à l’instant précédent, on obtient une courbe qui présente un pic à chaque attaque.
Les temps sont la charpente de ces attaques qui se répètent à intervalles réguliers. On fait d’abord glisser la courbe dans le temps pour la superposer à elle-même (autocorrélation) et l’on cherche l’intervalle qui se superpose le mieux, c’est-à-dire le tempo. Ensuite, on cherche en une seule fois, sur tout le morceau, la suite de temps qui « passe par le plus grand nombre possible d’attaques fortes sans que l’intervalle s’écarte beaucoup du tempo » (programmation dynamique). Comme on optimise l’ensemble d’un coup au lieu de fixer chaque temps séparément, la suite ne se rompt pas même si quelques temps faibles s’y mêlent, et elle suit le tempo même s’il fluctue légèrement au fil du jeu. Ici, la référence de « l’intervalle régulier » n’est pas le tempo de tout le morceau, mais un tempo local calculé sur quelques secondes. Ainsi, on ne se laisse pas entraîner là où le rythme se complique brièvement, comme dans un fill, tout en suivant le morceau lorsqu’il ralentit ou accélère réellement.
Trouver une suite régulière ne suffit pas. Il existe deux erreurs courantes.
Prendre le contretemps pour le temps. Si la charleston remplit fortement l’espace entre les temps, la suite peut être décalée d’un demi-temps. Or la musique a des règles : les entrées de grosse caisse, de caisse claire et de basse, ainsi que les changements d’accord, se concentrent pour la plupart sur les temps. On compare donc la force de ces événements à la position des temps trouvés et à la position décalée d’un demi-temps ; si la position décalée est nettement plus forte, on décale toute la suite d’un demi-temps.
Prendre un tempo double ou moitié. Dans une ballade lente avec des arpèges serrés en croches, il est facile de prendre chaque croche pour un temps. On sépare alors les temps en deux groupes, un sur deux. Si les vrais temps portent la grosse caisse et la caisse claire et qu’entre eux il n’y a que le clavier, un groupe ressort bien plus fort que l’autre. On écarte alors le groupe faible et l’on divise le tempo par deux. À l’inverse, si une caisse claire tombe régulièrement au milieu de chaque intervalle entre les temps, le tempo a été pris trop lent et on le double. Le doublement, qui produit immédiatement un clic à contretemps en cas d’erreur, n’est appliqué que sous des conditions beaucoup plus strictes.
Dans les enregistrements réels, la charleston et le clavier remplissent les contretemps, et l’écart de force entre les deux groupes peut être faible. On regarde donc aussi dans quel groupe tombent la grosse caisse et la caisse claire. Au bon tempo, la grosse caisse (temps 1 et 3) et la caisse claire (temps 2 et 4) tombent dans des groupes différents ; si le tempo a été doublé, elles tombent toutes deux dans le même groupe (les vrais temps). Pour diviser le tempo par deux, on ne retire pas un temps sur deux, mais on refait le suivi depuis le début avec le nouveau tempo. En effet, si le suivi au niveau des croches glisse d’une seule case quelque part au milieu du morceau, tous les temps filtrés après cet endroit se retrouvent décalés d’un demi-temps.
Deux formes de tempo moitié pour les morceaux rapides. Les morceaux rapides autour de 160 à 180 BPM sont facilement saisis un niveau plus lent, c’est-à-dire à la moitié du tempo. La forme diffère alors selon l’endroit où se posent les temps lents. Si les temps lents se posent sur la caisse claire (temps 2 et 4), une caisse claire tombe régulièrement sur chaque temps et la grosse caisse entre les temps. C’est une forme impossible pour un morceau lent au bon tempo, où la grosse caisse tombe sur les temps (1 et 3) et la caisse claire un temps sur deux. Si les temps lents se posent sur la grosse caisse (sensation half-time), la caisse claire tombe aussi souvent entre les temps que sur les temps. Dans les deux cas, on ne double que si l’estimation du tempo propose le tempo double comme candidat de force presque égale. Si l’on laisse les temps lents posés sur la caisse claire, le premier temps de la mesure est aussi décalé, et deux accords se mélangent dans un même temps, ce qui fait apparaître beaucoup d’accords de septième et d’accords barrés.
La division par deux est elle aussi vérifiée une fois de plus. Si l’on a pris les croches pour des temps, le milieu de chaque intervalle est une position de double croche, où les frappes graves comme la grosse caisse ou la basse sont rares. Si des sons graves tombent souvent entre les temps, on considère donc que les temps sont les bons et l’on ne divise pas. Lorsqu’on veut diviser sur la seule base de l’écart de force entre groupes pairs et impairs, si la caisse claire se concentre dans le groupe opposé à la grosse caisse (backbeat), les temps sont également les bons et l’on ne divise pas.
La façon de reconnaître la « caisse claire » est physique. Quand le timbre sous la caisse claire vibre, il produit un bruit qui augmente simultanément des fréquences moyennes jusqu’aux très aiguës. Les notes d’un clavier n’augmentent que sur quelques hauteurs, et la charleston uniquement dans les aigus. En mesurant « les fréquences moyennes et aiguës ont-elles augmenté en même temps » par le produit de ces deux valeurs, on peut isoler la caisse claire, car il suffit que l’une des deux soit faible pour que le produit soit faible.
Pour grouper les temps en mesures, il faut savoir où se trouve le premier temps de la mesure. Le premier temps laisse des traces : l’accord change, la note de basse change, la grosse caisse frappe fort, le volume augmente parfois. On attribue à chaque temps un score selon ces traces et l’on cherche le groupement au score le plus élevé tout en respectant la règle « les mesures se répètent généralement avec la même longueur ». C’est aussi de cette façon qu’on détermine si une mesure à 4 temps ou à 3 temps correspond le mieux aux traces. Si la sensation d’un temps divisé en trois est forte, on considère une mesure composée comme 6/8 ou 12/8.
Dans les morceaux où la batterie joue un backbeat, la forme paire/impaire grosse caisse sur les temps 1 et 3, caisse claire sur les temps 2 et 4 sert aussi de trace du premier temps. Dans un riff syncopé où l’accord change une croche avant le premier temps de la mesure, la trace du changement d’accord est tirée un temps en avant, mais la forme paire/impaire de la batterie reste la même, de sorte que la mesure n’est pas décalée d’un temps. Par ailleurs, les mesures à 3, 5 et 7 temps ne sont choisies que si les traces du premier temps se répètent réellement à cette longueur. Il s’agit d’éviter que, dans un morceau court, quelques rares grandes traces ne fassent croire à une mesure à 7 temps.
Une même note à des octaves différentes (un do grave et un do aigu) joue le même rôle dans un accord. Si l’on replie donc toutes les notes dans 12 cases — do, do♯, ré … si —, on obtient l’empreinte des notes qui sonnent à cet instant (le chroma). Pour un accord de C, les cases do, mi et sol ressortent.
Les vrais instruments ne produisent jamais une seule note. Quand on joue un do, des harmoniques sonnent avec lui : le do une octave au-dessus, le sol au-dessus, encore un do, un mi… Par exemple, l’harmonique issue du mi d’un accord de C remplit la case si, si bien qu’une comparaison qui ignore les harmoniques prend un C pour un Cmaj7. On construit donc les empreintes des accords en y incluant les harmoniques avant de comparer.
La basse (la note la plus grave) est examinée séparément. Si l’accord est C mais que la basse est mi, on écrit C/E.
La note de référence varie légèrement d’un enregistrement à l’autre. Pour bien des morceaux, le la n’est pas exactement à 440 Hz. On mesure donc d’abord de combien les notes de tout le morceau sont en moyenne trop hautes ou trop basses, on corrige d’autant, puis on les place dans les 12 cases.
Si l’on se contente de choisir pour chaque temps l’accord le plus ressemblant, les notes de passage de la mélodie font clignoter les accords à chaque temps. On introduit donc deux principes de bon sens sous forme de probabilités : les accords ne changent pas souvent, et s’ils changent, c’est le plus souvent sur le premier temps de la mesure et rarement entre les temps. En pesant ensemble ces règles et la ressemblance du son, on choisit en une fois la suite d’accords la plus plausible pour tout le morceau (modèle de Markov caché et algorithme de Viterbi). On estime aussi la tonalité du morceau et l’on donne un léger bonus aux accords qui lui conviennent.
Ce métronome ne bat pas à intervalle fixe comme « 97 tic-tac par minute », mais à l’instant de chacun des temps trouvés. Il suit donc le jeu même si celui-ci accélère ou ralentit légèrement.
La synchronisation est aussi précise. Si l’on déclenche le clic par un minuteur qui dit « joue maintenant ! », il arrive avec des dizaines de ms de retard quand l’ordinateur est occupé. On programme donc le clic 0.2 seconde à l’avance sur l’horloge du périphérique audio qui lit la musique. Comme la musique et le clic utilisent la même horloge et le même chemin de sortie, ils s’emboîtent à l’échantillon près ; même sur un périphérique dont la sortie a du retard, les deux arrivent en retard ensemble et ne se décalent pas l’un par rapport à l’autre.
Intégrer des sons de piano enregistrés alourdirait le fichier et exigerait des fichiers externes. Le son de piano est donc fabriqué directement à partir des lois physiques. Une corde de piano n’est pas une corde idéale mais un fil d’acier rigide, si bien que ses harmoniques sonnent légèrement plus haut que des multiples entiers exacts (inharmonicité). Le marteau frappe la corde à environ 1/7 de sa longueur, de sorte que les harmoniques qui ne bougent pas à cet endroit sonnent faiblement. Une note est produite par deux ou trois cordes à la fois ; comme leurs hauteurs diffèrent très légèrement, le son ondule lentement (battements) et décroît en deux étapes : rapidement au début, puis il persiste longtemps. Plus une harmonique est aiguë, plus elle disparaît vite, si bien que le son s’adoucit progressivement. En empilant ces propriétés sous forme de formules, on synthétise chaque note.
Un accord est joué en deux parties : une note de basse à la main gauche et l’harmonie à la main droite. Pour la main droite, on choisit le renversement qui demande le moins de déplacement depuis l’accord précédent, afin que le son ne saute pas d’un accord à l’autre. Le piano est accordé sur la note de référence du morceau trouvée par l’analyse, et il est programmé sur la même horloge audio que le métronome pour sonner exactement au moment où l’accord change.
La tonalité d’un morceau se révèle par « les notes principalement utilisées ». Un morceau en E♭ majeur utilise surtout E♭, F, G, A♭, B♭, C, D ; s’il passe en E majeur, il utilise E, F♯, G♯, A, B, C♯, D♯. On compare donc, à chaque temps, la distribution des notes des quelques mesures avant et après avec la distribution typique des 24 tonalités, et l’on introduit la règle la tonalité ne change pas souvent sous forme de probabilité pour trouver le parcours tonal le plus plausible de tout le morceau. Les accords d’une autre tonalité qui ne font que passer une ou deux mesures (par exemple E7 → Am dans un morceau en C majeur) ne sont pas comptés comme modulations. Le passage entre tonalités relatives majeure et mineure qui utilisent les mêmes notes (C majeur et A mineur) n’est pas non plus compté comme modulation, puisque l’armure ne change pas.
La position de la modulation est affinée au temps près. Si l’on passe par l’accord de dominante de la nouvelle tonalité (par exemple le B7 de E majeur), on considère, selon l’usage qui consiste à changer l’armure sur la partition, que la modulation se situe à l’endroit où apparaît le nouvel accord de tonique. L’écriture ♯/♭ des noms d’accords suit également la tonalité en vigueur à cet endroit. Dans une section en E majeur, on écrit G♯m7 et non A♭m7.
flowchart TD
F["Fichier audio"] --> D["Décodage par le navigateur<br/>PCM, fréquence d'échantillonnage du périphérique"]
D --> PB["Tampon de lecture"]
D --> MO["Mixage mono"]
MO --> R22["Rééchantillonnage à latence nulle<br/>22,050 Hz"]
R22 --> R11["Rééchantillonnage à latence nulle<br/>11,025 Hz"]
R22 --> RF["Caractéristiques rythmiques<br/>flux spectral par bande, volume"]
R11 --> HF["Caractéristiques harmoniques<br/>STFT de pics, accordage, chroma"]
RF --> TP["Estimation du tempo<br/>score en peigne d'autocorrélation × distribution de préférence"]
TP --> DP["Suivi des temps par DP<br/>affinage, nettoyage, prolongement"]
DP --> PC["Vérification de la phase des temps"]
HF --> PC
PC --> LC["Vérification du niveau métrique<br/>double, moitié, 4:3, 3:2"]
LC --> A[("Résultat d'analyse A")]
HF --> A
A --> BT["buildTimeline<br/>opérations de correction, HMM de mesure et de premier temps, HMM d'accords"]
U["Corrections de l'utilisateur, réglages"] --> BT
BT --> TL[("Chronologie TL")]
TL --> CH["Écran de la grille d'accords"]
TL --> SC["Ordonnanceur du métronome"]
TL --> PS["Jeu des accords<br/>disposition des voix, synthèse de piano"]
PB --> OUT["Limiteur, sortie AudioContext"]
SC --> OUT
PS --> OUT
L’analyse se divise en une étape lourde et une étape légère.
analyze() n’est exécutée qu’une seule fois, à l’ouverture du fichier. Elle comprend tout le traitement du signal et le suivi automatique des temps. Elle prend généralement quelques secondes, et rend la main à l’affichage toutes les 32 ms pour que l’indicateur de progression ne se fige pas.buildTimeline() est exécutée chaque fois qu’on modifie un bouton de correction ou un réglage. Elle recalcule la mesure, les mesures et les accords ; même pour un morceau de 5 minutes, cela prend environ 40 ms, si bien que le changement s’applique dès l’appui.| Étape | Rôle | Valeurs principales |
|---|---|---|
| Transformée de Fourier à court terme | Transformer le signal à 22,050 Hz en spectre tranche par tranche | Fenêtre de 1024 points (46.4 ms), pas de 256 points (11.6 ms, 86.13 trames par seconde) |
| Compression logarithmique | Rendre visibles même les variations des sons faibles | log(1 + 1000·|X|) |
| Filtre maximum | Comparer au spectre d’il y a deux trames élargi de ±1 case en fréquence | Évite de prendre un vibrato ou un glissement de hauteur pour une attaque |
| Flux par bande | Moyenne, par bande, des seules augmentations | Graves 21–200 Hz (grosse caisse, basse), médiums 200–2,500 Hz (fût de caisse claire, clavier), aigus 2.5–10 kHz (charleston, timbre de caisse claire) |
| Enveloppe d’attaques | Division par l’écart type de chaque bande, puis somme | Les aigus ont un poids de moitié (réduit l’influence de la charleston à contretemps) |
| Volume | RMS par trame | Sert à déterminer les passages sonores et à afficher la forme d’onde |
| Étape | Rôle | Valeurs principales |
|---|---|---|
| STFT de pics pour les aigus | Pics spectraux pour les notes de l’accord | Fenêtre de 2048 points (186 ms), 110–4,200 Hz, au plus 36 par trame |
| STFT de pics pour la basse | Pour la note de basse et l’accordage | Fenêtre de 4096 points (372 ms), 32–1,400 Hz, au plus 24 par trame |
| Conditions de pic | Seulement les sommets nets | Au moins −45 dB par rapport au maximum de la trame, au moins 2 fois la moyenne des ±6 cases voisines |
| Interpolation parabolique logarithmique | Fréquence et amplitude plus précises que l’espacement des cases | Utilise l’amplitude logarithmique du pic et des cases voisines |
| Estimation de la note de référence | Moyenne sur le cercle de la « partie fractionnaire en demi-tons » de tous les pics | Ex. : +18 cent → A4 = 444.6 Hz |
| Chroma | Accumulation des hauteurs corrigées dans les 12 cases | Poids d’autant plus grand que la hauteur est proche du centre du demi-ton (cos²). MIDI 48–96 pour les aigus, 28–57 pour la basse |
| Courbe de changement harmonique | Distance cosinus entre les chromas des 4 trames avant et après | Sert à la vérification de la phase des temps |
AudioBufferSourceNode est démarré 60 ms après l’heure audio actuelle.| Bouton | Opération interne | Effet |
|---|---|---|
| Décaler d’½ temps (« ½박 옮기기 ») | half |
Crée une nouvelle liste de temps aux points milieu des temps voisins, puis la recale sur les pics d’attaque. Les temps qui débordent avant le début de la musique sont écartés |
| Deux fois plus vite ×2 (« 두 배 빠르게 ×2 ») | x2 |
Ajoute un point milieu entre chaque paire de temps |
| Moitié ÷2 (« 절반으로 ÷2 »), grouper par trois ÷3 (« 셋씩 묶기 ÷3 ») | d2, d3 |
Conserve un temps sur 2 (sur 3). La position conservée est celle dont la somme des accentuations est la plus grande |
| Avancer, retarder d’un temps (« 한 박 앞당기기 », « 늦추기 ») | downShift ∓1 |
Fait tourner d’un cran le numéro de position dans la mesure |
| Mesure (« 박자 ») | meter |
Résout de nouveau le HMM du premier temps avec le nombre de temps indiqué |
Les corrections sont enregistrées comme un historique d’opérations sur la liste des temps et sont réappliquées à chaque fois depuis le début, dans l’ordre. « Annuler la correction des temps » (« 박 보정 되돌리기 ») vide cet historique. Le type d’accords (« 코드 종류 »), le mode de jeu des accords (« 코드 연주 »), l’accentuation du premier temps (« 첫 박 강조 »), le défilement automatique (« 자동 스크롤 ») et la synchronisation du clic (« 클릭 타이밍 ») sont des réglages enregistrés dans le navigateur et non dans le morceau ; on les réinitialise séparément avec « Réglages par défaut » (« 설정 기본값으로 »). « En vigueur » (« 적용 중 ») n’affiche, pour les deux, que ce qui diffère des valeurs par défaut.
| Étape | Rôle |
|---|---|
| Intervalles d’accords | Pour chaque événement d’accord d’une mesure, le moteur transmet les notes constitutives (0 = C) et la note de basse à jouer. Si la notation de basse est désactivée, la basse est la fondamentale. |
| Liste des frappes | Elle est établie selon le moment de jeu choisi. « En suivant le morceau » (« 곡 따라 ») joue là où l’accord change et, même pour un accord identique, sur le premier temps d’une mesure où l’original le frappe de nouveau (lettres noires dans la grille), et laisse résonner là où l’accord est tenu (gris). « À chaque changement d’accord » (« 코드가 바뀔 때 ») ne joue qu’une fois un même accord prolongé sur plusieurs mesures, « Rejouer à chaque mesure » (« 마디마다 다시 ») rejoue sur le premier temps de chaque mesure, et « À chaque temps » (« 박마다 ») joue sur tous les temps. Sur N.C., rien n’est joué et l’accord précédent s’arrête aussi. |
| Disposition des voix | La basse se situe entre D2 et C♯3 ; la main droite place toutes les notes constitutives en position serrée, en choisissant le renversement le plus proche du centre de la disposition précédente. |
| Synthèse et cache | Les notes utilisées dans le morceau sont synthétisées à l’avance, une par une, dans leur ordre d’apparition (une fois par note). Elles sont recréées si la note de référence du morceau change. |
| Programmation | Le même ordonnanceur que le métronome programme les frappes 0.2 seconde à l’avance sur l’horloge audio. La correction de synchronisation du clic ne s’applique pas ; on joue à l’heure de la musique telle quelle. |
| Fin du son | À l’instant où l’intervalle de l’accord se termine (frappe suivante ou N.C.), le son décroît avec une constante de temps de 70 ms, comme lorsque l’étouffoir retombe. |
| Redémarrage | Si l’on lance la lecture ou se déplace au milieu d’un accord, l’accord en cours est joué immédiatement une fois. |
| Mixage | La musique, le clic et les accords ont chacun leur propre volume ; on mêle au piano un peu de réverbération de pièce de 1.6 seconde, puis on applique un gain de correction fixe (+6.4 dB). Les trois sons passent par un limiteur (−1 dBFS) juste avant la sortie et sont mélangés sans écrêtage. |
Le métronome et le jeu des accords se resynchronisent aussi séparément. Activer ou désactiver le métronome ou modifier la synchronisation du clic n’interrompt pas l’accord de piano en train de sonner.
Notations
| Symbole | Signification |
|---|---|
| $F = 22050/256 \approx 86.13$ | Fréquence des trames rythmiques (trames/seconde) |
| $X(t,k)$ | Valeur de la STFT pour la trame $t$ et la case de fréquence $k$ |
| $\tau$ | Période du temps (en trames) |
| $b_i$ | Instant du $i$-ième temps (secondes) |
| $m$ | Numéro de note MIDI (réel) ; se distingue du nombre de temps par mesure selon le contexte |
Si l’on réduit par le PGCD le rapport des fréquences d’échantillonnage de sortie et d’entrée pour écrire $L/D = f_\text{out}/f_\text{in}$, la position d’entrée du $n$-ième échantillon de sortie est $nD/L = i_n + \phi_n$ ( $i_n$ partie entière, $\phi_n$ partie fractionnaire).
y[n] = \sum_{j=0}^{2W-1} x[\,i_n - W + 1 + j\,]\; h(\phi_n + W - 1 - j)
h(u) = 2f_c\,\mathrm{sinc}(2f_c u)\,w\!\left(\frac{u}{W+1}\right),\qquad
w(r) = 0.42 + 0.5\cos\,\pi r + 0.08\cos\, 2\pi r
f_c = 0.46\,\min\!\left(1, \frac{f_\text{out}}{f_\text{in}}\right),\qquad W = \left\lceil \frac{10}{2f_c} \right\rceil
Comme $h$ est une fonction paire (symétrique), sa phase est nulle, c’est-à-dire que sa latence est nulle. La phase $\phi_n$ est précalculée dans une table d’au plus 4,096 niveaux, et la position d’entrée est mise à jour par un accumulateur entier ( $D = qL + r$ ), si bien que les erreurs de virgule flottante ne s’accumulent pas.
Un signal réel de $N$ points est calculé avec une seule FFT complexe de $N/2$ points. En posant $z[m] = x[2m] + i\,x[2m+1]$ et $Z = \mathrm{FFT}_{N/2}(z)$ :
X[k] = \underbrace{\tfrac12\left(Z[k] + \overline{Z[N/2-k]}\right)}_{F_e[k]}
+ e^{-2\pi i k/N}\,\underbrace{\tfrac{-i}{2}\left(Z[k] - \overline{Z[N/2-k]}\right)}_{F_o[k]},\qquad 0 \le k \le N/2
Les indices de $Z$ sont considérés de période $N/2$ ( $Z[N/2] = Z[0]$ ).
Y(t,k) = \ln\!\left(1 + \lambda \cdot \tfrac{4}{N}\,|X(t,k)|\right),\qquad \lambda = 1000
\Delta(t,k) = \max\!\Big(0,\; Y(t,k) - \max_{|\nu|\le 1} Y(t-2,\,k+\nu)\Big)
f_b(t-1) = \frac{1}{|B_b|}\sum_{k \in B_b} \Delta(t,k),\qquad b \in \{\text{low}, \text{mid}, \text{high}\}
La valeur est enregistrée en $t-1$, au milieu des deux trames comparées ( $t$, $t-2$ ). L’enveloppe d’attaques utilisée pour le suivi des temps est la suivante.
O(t) = \frac{f_\text{low}(t)}{\sigma_\text{low}} + \frac{f_\text{mid}(t)}{\sigma_\text{mid}} + \frac12\,\frac{f_\text{high}(t)}{\sigma_\text{high}}
On normalise par le volume sur une fenêtre de ±3 secondes, puis on soustrait la moyenne.
E(t) = \frac{O(t)}{\sqrt{\frac{1}{|W_t|}\sum_{s \in W_t} O(s)^2} + \epsilon} - \bar E,\qquad W_t = [\,t - 3F,\ t + 3F\,]
L’autocorrélation est divisée par la longueur de recouvrement, normalisée par $r(0)$ puis lissée par $[\tfrac14, \tfrac12, \tfrac14]$ ; on la note $\tilde r$.
r(\ell) = \frac{1}{n-\ell}\sum_{t=0}^{n-\ell-1} E(t)\,E(t+\ell)
Pour chaque BPM candidat $v$, on considère ensemble les retards de 1 à 4 fois la période du temps $\tau_v = 60F/v$.
J(v) = \pi(v)\cdot\max\!\Big(0,\ \sum_{k=1}^{4} c_k \max_{|\delta| \le \delta_k} \tilde r(k\tau_v + \delta)\Big),\qquad c = \left(1, \tfrac12, 0.33, \tfrac14\right)
\pi(v) = \exp\!\left(-\frac12 \log_2^2\, \frac{v}{110}\right),\qquad
\delta_1 = 0.5,\quad \delta_{k\ge 2} = 0.5 + 0.004\,k\tau_v
On balaie $v \in [40, 240]$ par pas de 0.25 et l’on obtient un BPM décimal par interpolation parabolique sur trois points autour du maximum.
Le score local, obtenu en lissant les attaques par une gaussienne de largeur $\sigma = \tau/32$, et le score cumulé sont les suivants.
\ell(t) = \frac{1}{\sigma_O}\sum_{i} O(t+i)\,e^{-\frac12\left(\frac{32 i}{\tau}\right)^2}
C(t) = \ell(t) + \max_{\tau(t)/2 \,\le\, d \,\le\, 2\tau(t)}\Big[\,C(t-d) - \alpha \ln^2\,\frac{d}{\tau(t)}\,\Big],\qquad \alpha = \mathrm{clip}\!\left(2000\,T^2,\ 100,\ 1600\right)
$T = \tau/F$ est la période du temps (en secondes). Comme $\alpha\ln^2(d/\tau) \approx 2000\,(\Delta t)^2$ ( $\Delta t$ étant l’écart d’intervalle en secondes), la pénalité est fondée sur le temps absolu, indépendamment du tempo. La valeur fixe 100 de la méthode originale est fondée sur un pourcentage ; dans un morceau lent, un même pourcentage représente beaucoup plus de ms, et les temps se laissaient entraîner par les syncopes.
La période locale du temps $\tau(t)$ est obtenue par l’autocorrélation $r_w$ sur des fenêtres de 8 secondes (pas de 1 seconde) ; on filtre les fluctuations momentanées comme les fills par la médiane de 7 fenêtres, puis on interpole linéairement à chaque trame.
\tau_w = \arg\max_{\ell \in [0.85\tau,\ 1.15\tau]} \Big( r_w(\ell) + \tfrac12\, r_w(2\ell) \Big),\qquad
\tau(t) = \mathrm{clip}\!\Big(\mathrm{interp}_t\big(\mathrm{median}_{7}\,\tau_w\big),\ 0.85\tau,\ 1.15\tau\Big)
Le point de départ du retour arrière est le dernier maximum local de $C$ qui dépasse la moitié de la médiane de ces maxima. Au début et à la fin du chemin, les temps dont le score local lissé n’atteint pas la moitié du RMS global sont supprimés.
Grille de l’introduction (1.10.4). Dans une introduction peu instrumentée, l’accent anticipé en fin de mesure (basse ou cymbale sur la croche après le quatrième temps) est bien plus fort que les attaques entre les temps ; la programmation dynamique peut alors prendre cet accent pour un temps et dériver vers des temps plus lents de quelques % que le corps du morceau, si bien que les barres de mesure se décalent d’environ un demi-temps. Dans les 48 premiers temps du morceau, si la grille prolongée à rebours de façon régulière à partir d’un temps, avec la période des 8 temps qui le suivent, s’écarte de plus d’un quart de temps des temps actuels, on compare donc les deux grilles. Le critère est la mesure dans laquelle les attaques, depuis le premier son jusqu’à ce temps, tombent sur des positions de croche (temps et contretemps) ; on ne remplace les temps de l’introduction par la grille prolongée à rebours que si celle-ci est meilleure de plus de 0.15 (moyenne pondérée par les attaques, gaussienne de 30 ms de largeur). Les barres de mesure sont alors aussi prolongées à rebours avec la phase du corps du morceau. Si l’introduction est réellement à un autre tempo ou en tempo libre, les temps d’origine correspondent mieux aux attaques et restent inchangés. L’introduction de 「マリーゴールド」 (du premier son à 0.55 s jusqu’à l’entrée du groupe à 7.34 s) était saisie avec un intervalle de 0.596 s, en anacrouse de 3 temps + barres de mesure à 2.55 et 4.94 s ; elle est devenue trois mesures complètes avec un intervalle de 0.566 s (0.55, 2.82 et 5.08 s). Ces barres de mesure coïncident à 5 ms près avec les débuts de répétition du riff d’introduction, toutes les 2.26 s (4 temps). Sur les 1000 morceaux de GTZAN, cette règle ne s’est déclenchée que pour un seul morceau de reggae, et le score est inchangé.
Décalage local de l’introduction (1.11.7). Même pour un morceau produit à tempo fixe, s’il commence sans batterie, au piano par exemple, une note anticipée d’une double croche dans l’introduction peut être plus forte que les attaques entre les temps, et la programmation dynamique peut la prendre pour un temps. Dans ce cas, le nombre total de temps de l’introduction est juste, si bien que la condition « écart de plus d’un quart de temps » ci-dessus ne se déclenche pas ; mais les temps sont avancés d’environ 1/4 de temps pendant presque toute l’introduction, les intervalles sont irréguliers et les intervalles d’accords sont aussi décalés. Ainsi, si à partir d’un certain temps les 8 temps suivants ont un tempo régulier (intervalles à ±3 % de la période) et que, en prolongeant cette grille à rebours de façon régulière, certains temps actuels s’en écartent de plus de 0.15 temps, on compare les deux grilles selon la mesure dans laquelle les attaques de l’introduction tombent sur des positions de double croche. On ne remplace les temps de l’introduction par cette grille que si la grille prolongée à rebours correspond mieux et qu’il existe des indices d’un morceau produit à tempo fixe (au moins 30 pics d’attaque dans l’introduction, correspondance à la double croche de la grille prolongée d’au moins 0.85).
On interpole paraboliquement autour du maximum d’attaque $j$ situé à $\pm 2$ trames.
\hat t = j + \frac12\cdot\frac{O(j-1) - O(j+1)}{O(j-1) - 2O(j) + O(j+1)},\qquad b = \frac{\hat t}{F} + t_\text{cal},\quad t_\text{cal} = 6.5\ \text{ms}
| Pour les temps dont la force est inférieure à 0.35 fois la médiane, la position est déterminée par une régression linéaire sur les 4 voisins de chaque côté, avec le poids $1/(1+ | j-i | )$. Pour un passage sonore $[t_s, t_e]$ et un intervalle entre temps $p$, les temps sont tronqués à $[\,t_s - p/4,\ t_e + p/4\,]$, puis prolongés avec le même intervalle vers l’avant tant que $b_0 - p \ge \max(0, t_s - p/4)$ et vers l’arrière tant que $b_\text{last} + p \le t_e - p/2$. |
La courbe de changement harmonique $\nu$ est construite à partir du chroma $\hat c$ compressé par racine carrée puis normalisé en L2.
\nu(t) = \left(1 - \cos\!\Big(\sum_{d=0}^{3}\hat c_{t+d},\ \sum_{d=1}^{4}\hat c_{t-d}\Big)\right)\cdot \min\!\left(1, \sqrt{\frac{\min(e_t, e_{t-1})}{e_{70\%}}}\right)
La courbe d’accentuation des temps est la somme pondérée de quatre courbes normalisées par leur moyenne $\mu$ sur les passages sonores.
S(t) = 1.0\,\frac{f_\text{low}}{\mu_\text{low}} + 0.7\,\frac{f_\text{mid}}{\mu_\text{mid}} + 0.2\,\frac{f_\text{high}}{\mu_\text{high}} + 0.8\,\frac{\nu}{\mu_\nu}
\text{on} = \frac1N\sum_i \max_{|\delta|\le 2} S(b_i + \delta),\qquad
\text{off} = \frac1N\sum_i \max_{|\delta|\le 2} S\!\left(\tfrac{b_i + b_{i+1}}{2} + \delta\right)
Si $\text{off} > 1.1\cdot\text{on}$ , tous les temps sont décalés d’un demi-temps (lorsqu’il y a au moins 8 temps).
On définit la courbe de grosse caisse $K$ et la courbe de caisse claire $S_n$ . $S_n$ étant la moyenne géométrique des médiums et des aigus, elle n’augmente que lorsque les deux bandes montent simultanément.
K(t) = \frac{f_\text{low}(t)}{\sigma_\text{low}},\qquad
S_n(t) = \sqrt{\frac{f_\text{mid}(t)}{\sigma_\text{mid}}\cdot\frac{f_\text{high}(t)}{\sigma_\text{high}}}
Pour chaque temps, on calcule $p_i = K + S_n + \tfrac12 S$ (maximum sur ±2 trames) et l’on examine le rapport des moyennes des temps pairs et impairs.
r_2 = \frac{\max(\bar p_\text{even}, \bar p_\text{odd})}{\min(\bar p_\text{even}, \bar p_\text{odd})}
| Correction | Condition | Action |
|---|---|---|
| Moitié | ( $r_2 \ge 2.4$ et $s_{S_n} > -0.1$ , ou biais du même côté) et $\kappa \ge 2$, BPM ≥ 110, BPM/2 ≥ 55 | Refaire le suivi depuis le début avec la période $2\tau$ |
| Double | BPM ≤ 100, 2·BPM ≤ 210, $\sigma \ge 1.3$, $\kappa \ge 2$ | Ajouter les points milieu et les caler sur les attaques |
| Double (type backbeat) | BPM ≤ 100, 2·BPM ≤ 200, $c_2 \ge 0.8$, $\sigma \le 0.8$, $\kappa \le 0.95$, $\lvert d_{S_n}\rvert \le 0.25$ | Idem |
| Double (type half-time) | BPM ≤ 100, 2·BPM ≤ 210, $c_2 \ge 0.85$, $\sigma \ge 0.9$, $1 \le \kappa \le 10$ | Idem |
\sigma = \frac{\sum S_n(\text{mid})}{\sum S_n(\text{beat})},\qquad
\kappa = \frac{\sum K(\text{beat})}{\sum K(\text{mid})},\qquad
d_{S_n} = \frac{S_{n,\text{even}} - S_{n,\text{odd}}}{S_{n,\text{even}} + S_{n,\text{odd}}}
mid désigne le point milieu entre deux temps, et $c_2$ le score du candidat de tempo égal au double du tempo actuel (±8 %) divisé par le score du premier candidat. Le type backbeat correspond au cas où les temps lents se posent sur la caisse claire : une caisse claire régulière sur chaque temps ( $d_{S_n} \approx 0$ ) et la grosse caisse entre les temps ; le type half-time correspond à la grosse caisse sur les temps et à une caisse claire également entre les temps. Le $\kappa \le 10$ du type half-time sert à exclure les morceaux de piano sans batterie, où il n’y a presque aucune frappe grave entre les temps. Pour la correction de moitié, $\kappa \ge 2$ vérifie que l’intervalle entre les temps est une position de double croche (où les frappes graves sont rares), et $s_{S_n} > -0.1$ vérifie qu’il ne s’agit pas d’un backbeat (1.10.0).
Le biais du même côté est un biais mesuré entre temps pairs et impairs en prenant comme + le côté où la grosse caisse est la plus forte.
s_X = \mathrm{sgn}(K_\text{even} - K_\text{odd})\cdot\frac{X_\text{even} - X_\text{odd}}{X_\text{even} + X_\text{odd}},\qquad
\text{same side} \iff s_K \ge 0.15\ \land\ s_{S_n} \ge 0.15\ \land\ s_\nu > 0\ \land\ r_2 \ge 1.3
Aux bons temps, la caisse claire tombe du côté opposé à la grosse caisse à cause du backbeat, donc $s_{S_n} < 0$ (de −0.28 à −0.61 sur les morceaux synthétiques) ; si le tempo a été doublé, les deux tombent du côté des vrais temps, donc $s_{S_n} > 0$ .
La correction de doublement est beaucoup plus stricte parce que le risque est asymétrique. Diviser à tort par deux ne fait que raréfier les clics, alors que doubler à tort place à contretemps tous les clics ajoutés.
À partir du profil $P(\varphi)$ , moyenne des maxima d’attaque pour chaque phase de l’intervalle de temps divisé en 24 parts :
\text{triple} \iff \min\!\big(P(\tfrac13), P(\tfrac23)\big) > 1.15\,P(\tfrac12)\ \ \land\ \ \tfrac12\big(P(\tfrac13) + P(\tfrac23)\big) > 1.1\,\mathrm{median}(P)
Vérification du niveau métrique 4:3 (1.11.5). Un morceau lent en 4/4 aux doubles croches serrées peut sembler avoir des attaques qui se répètent toutes les trois doubles croches (croche pointée) ; à cause de la distribution de préférence de tempo (centrée sur 110 BPM), c’est alors 4/3 du tempo réel (par exemple 92 BPM au lieu de 69 BPM) qui est choisi, et le morceau peut être écrit en 12/8 avec un temps divisé en trois. Si la détermination de la subdivision donne une division ternaire, on refait le suivi des temps avec le tempo $b’$ qui maximise le score en peigne $C$ avant multiplication par la distribution de préférence, au voisinage (±4 %) des 3/4 du tempo actuel $b$ , et l’on ne change que si toutes les conditions suivantes sont remplies.
\frac{C(b')}{C(b)} \ge 0.93,\qquad
\frac{C(b')\,\pi(b')}{C(b)\,\pi(b)} \ge 0.85,\qquad
\frac{P'(\tfrac12)}{\tfrac12\big(P'(\tfrac13) + P'(\tfrac23)\big)} \ge 1.4,\qquad
G = \rho(8) + \rho(16) - \rho(12) - \rho(24) \ge 0,\qquad
\pi(x) = e^{-\frac12\log_2^2(x/110)}
La première condition signifie que, sans la distribution de préférence, le tempo lent explique la périodicité des attaques presque aussi bien ou mieux que le tempo actuel ; la deuxième, que les deux candidats étaient presque à égalité même dans l’estimation initiale du tempo, distribution de préférence comprise. $P’$ est le profil de subdivision mesuré avec les nouveaux temps : les nouveaux temps doivent se diviser nettement en deux croches et non en triolet. $\rho(L)$ est l’autocorrélation au retard $L$ de la suite des changements harmoniques, construite à partir de la distance entre chromas aigus et graves des 4 cases avant et après, sur la grille qui divise le temps actuel en trois (doubles croches) ; $G$ est donc positif si l’harmonie change toutes les 8 ou 16 cases (demi-mesure ou mesure en 4/4), et négatif si elle change toutes les 6 ou 12 cases (demi-mesure ou mesure en 12/8), car elle se répète alors aux retards 12 et 24. Le nouveau tempo doit être compris entre 50 et 140 BPM. Si les temps ressaisis ne suivent que la grosse caisse et se collent au contretemps (la caisse claire au milieu entre les temps est plus forte que sur les temps et la grosse caisse plus forte sur les temps : $S_n(\text{beat})/S_n(\text{mid}) < 0.9$ et $K(\text{beat})/K(\text{mid}) > 1$), on les décale d’un demi-temps. Au départ, seule la première condition existait, mais 8 morceaux d’accompagnement de guitare et morceaux très rapides se sont dégradés ; on a donc resserré en ajoutant successivement la troisième puis la deuxième condition, et la quatrième est une marge de sécurité qui ne réduit pas le nombre de morceaux modifiés (validation 1.11.5 en 4-6).
Vérification du niveau métrique 3:2 (1.11.6). À l’inverse, un morceau aux croches régulières (accompagnement de guitare seule, rock en croches, etc.) peut sembler avoir des accents qui se répètent toutes les trois croches (noire pointée) ; il est alors saisi aux 2/3 du tempo réel et peut être écrit en 12/8 ou 6/8. Pour les morceaux non modifiés par la vérification 4:3, on refait le suivi avec le tempo $b’’$ qui maximise $C$ au voisinage (±4 %) des 3/2 du tempo actuel $b$ , et l’on ne change que si toutes les conditions suivantes sont remplies.
\frac{C(b'')}{C(b)} \ge 0.93,\qquad
\frac{P''(\tfrac12)}{\tfrac12\big(P''(\tfrac13) + P''(\tfrac23)\big)} \ge 1.4,\qquad
G \ge 0.05,\qquad
\frac{\bar S(\text{beat})}{\bar S(\text{mid})} \ge 1.05,\qquad
90 \le b'' \le 240
$G$ est le même indicateur que pour la vérification 4:3 (ici, les cases qui divisent le temps actuel en trois sont des croches, donc il est positif si l’harmonie change toutes les 8 ou 16 cases, soit une ou deux mesures en 4/4). La quatrième condition exige que l’accentuation $S$ à la position des temps ressaisis soit plus forte de plus de 5 % qu’au milieu entre les temps ; elle écarte les cas où le tempo est juste mais où les temps se sont collés au contretemps. La règle de décalage d’un demi-temps est la même que pour la vérification 4:3. Les cas où le nouveau tempo est inférieur à 90 BPM (tempo actuel inférieur à 60 BPM) ne sont pas examinés, car il s’agit le plus souvent de vraies ballades lentes en triolets. Au départ, on n’avait que la plage et la condition sur $G$ , mais il y avait 22 morceaux dégradés pour 26 améliorés ; on a donc resserré en ajoutant successivement les conditions de rapport de scores, de rapport d’accentuation et de division en croches jusqu’à ce qu’aucun morceau ne se dégrade, puis, un morceau ayant vu son caractère majeur/mineur se dégrader dans la notation des accords, on a relevé la borne inférieure du tempo à 90 BPM (validation 1.11.6 en 4-6).
| Avec les amplitudes logarithmiques $L_-, L_0, L_+ = \ln | X(k-1) | , \ln | X(k) | , \ln | X(k+1) | $ : |
\delta = \frac12\cdot\frac{L_- - L_+}{L_- - 2L_0 + L_+},\qquad
\hat f = (k + \delta)\frac{f_s}{N},\qquad
\hat A = \frac{4}{N}\exp\!\left(L_0 - \tfrac14(L_- - L_+)\,\delta\right),\qquad
m = 69 + 12\log_2\,\frac{\hat f}{440}
L’écart de la note de référence (en demi-tons) est la moyenne circulaire des parties fractionnaires $d_j = m_j - \mathrm{round}(m_j)$ (pics MIDI 40–90 de la STFT de basse, poids $\sqrt{A_j}$ ).
\theta = \frac{1}{2\pi}\mathrm{atan2}\!\Big(\sum_j \sqrt{A_j}\sin\, 2\pi d_j,\ \sum_j \sqrt{A_j}\cos\, 2\pi d_j\Big),\qquad
A4 = 440 \cdot 2^{\theta/12}\ \text{Hz}
Le chroma est accumulé avec la hauteur corrigée $\tilde m = m - \theta$ . $w(\cdot)$ est la fenêtre de registre propre aux aigus et à la basse.
C(t, q) = \sum_{j:\ \mathrm{round}(\tilde m_j) \bmod 12 = q} A_j\, w(\tilde m_j)\, \cos^2\!\big(\pi(\tilde m_j - \mathrm{round}(\tilde m_j))\big)
Les trames de l’intervalle de temps $[t_0, t_1)$ sont moyennées avec une pondération centrale.
\bar C(q) = \frac{\sum_j \omega_j\,C(j, q)}{\sum_j \omega_j},\qquad \omega_j = 0.1 + \sin(\pi u_j),\quad u_j = \frac{j h - t_0}{t_1 - t_0}
La suppression des composantes permanentes du chroma de basse et l’estimation de la tonalité sont les suivantes. $\vec{K}_\text{mode}$ désigne les profils majeur et mineur de Krumhansl–Kessler, et $\mathrm{rot}_t$ la rotation vers la tonique $t$ .
B'_s(q) = \max\!\Big(0,\ B_s(q) - \tfrac12\mathrm{median}_i B_i(q)\Big)
(\hat t, \widehat{\text{mode}}) = \arg\max_{t,\ \text{mode}}\ \mathrm{corr}\!\big(\vec{h},\ \mathrm{rot}_t(\vec{K}_\text{mode})\big),\qquad
h_q = \sum_i \sqrt{\frac{T_i(q)}{\sum_{q'} T_i(q')}} + \frac12\sqrt{\frac{B_i(q)}{\sum_{q'} B_i(q')}}
Avec les décalages d’harmoniques $d = (0, 12, 19, 24, 28, 31)$ demi-tons et les poids $0.6^{h-1}$ , on additionne les notes constitutives et une fuite de basse ( $\rho = 0.25$ ).
\tilde T(q) = \sum_{p \in \text{chord}}\ \sum_{h=1}^{6} 0.6^{h-1}\,[\,q \equiv p + d_h\,] \;+\; \rho\sum_{h=1}^{6} 0.6^{h-1}\,[\,q \equiv p_\text{bass} + d_h\,]\pmod{12}
T = \frac{(\tilde T/\max\tilde T)^{\gamma}}{\left\|(\tilde T/\max\tilde T)^{\gamma}\right\|_2},\qquad \gamma = 0.45
L’observation $o_s$ est construite de la même façon à partir du chroma des aigus (normalisation par le maximum, puissance $\gamma$ , normalisation L2). Le score d’émission de l’accord $c$ est le suivant.
e_s(c) = \beta\,\langle o_s, T_c\rangle + \pi_q + \pi_\text{inv} + \kappa\,[\,c \subset \text{key}\,]
+ \eta\,g_s\Big(\ln\big(0.06 + \hat b_s(p_\text{bass})\big) - \ln\big(0.06 + \tfrac{1}{12}\big)\Big)
$\beta = 30$, $\kappa = 0.6$, $\eta = 1.5$ ; $\hat b_s$ est le chroma de basse de somme 1, et $g_s = \min!\big(1, E^\text{bass}s / (0.5\,E^\text{bass}{60\%})\big)$ un coefficient qui réduit le terme de basse quand la basse est faible. Le score de l’absence d’accord (N) augmente d’autant plus que le chroma est plat et que le son est faible.
e_s(\mathrm{N}) = \beta\left(\frac{1}{\sqrt{12}}\sum_q o_s(q) - 0.12\right) + Q_s,\qquad
Q_s = \begin{cases} 12 & r_s < 0.02 \\ 6\,(0.08 - r_s)/0.06 & r_s < 0.08 \\ 0 & \text{otherwise}\end{cases}
$r_s$ est l’énergie des aigus du créneau divisée par le 60e centile global. Les scores a priori $\pi_q$ et les scores a priori de renversement $\pi_\text{inv}$ sont donnés ci-dessous.
| Qualité | maj | min | 7 | maj7 | m7 | sus4 | sus2 | dim | aug | m7♭5 | dim7 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| $\pi_q$ | 0 | 0 | −0.4 | −0.6 | −0.4 | −1.2 | −1.4 | −1.3 | −1.8 | −1.2 | −1.6 |
| Basse | Fondamentale | Tierce | Quinte | Septième |
|---|---|---|---|---|
| $\pi_\text{inv}$ | 0 | −0.7 | −1.0 | −1.0 |
Les renversements ne sont prévus que pour maj, min, 7, maj7 et m7. Le nombre d’états par vocabulaire est de 73 en basique, 241 en standard et 289 en étendu (N compris).
Atténuer la mélodie chantée (1.11.0). La première cause d’erreur sur les accords est la mélodie chantée qui se mêle à la bande harmonique et fait lire un accord voisin partageant beaucoup de notes communes (C ↔ Am, G7 ↔ Gm7, etc.). Les enregistrements de musique populaire placent généralement la voix au centre et l’accompagnement écarté à gauche et à droite ; dans le signal latéral $S = (L - R)/2$ , obtenu en soustrayant la droite de la gauche, la voix est presque effacée et l’accompagnement subsiste. On construit donc un second chroma des aigus à partir du signal latéral et on l’ajoute au chroma des aigus utilisé pour la décision finale des accords ($C_\text{treble} = C_M + C_S$). La basse étant aussi au centre, les harmoniques de la note de basse disparaissent du signal latéral ; on restaure donc à demi-poids la composante aiguë des notes fortes du chroma de basse de l’intervalle. Ce chroma mélangé ne sert qu’à choisir la fondamentale et la branche majeure/mineure ; si la fondamentale et la branche choisies sont les mêmes que celles de l’accord lu sur le chroma non mélangé, les noms de septième et de renversement sont pris du côté non mélangé. Il n’est pas utilisé pour les temps, le premier temps, la mesure ni l’estimation de la tonalité. Pour les fichiers mono ou dont les deux canaux sont presque identiques (énergie latérale/centrale inférieure à −30 dB), aucun signal latéral n’est construit et le résultat est inchangé. Pour les fichiers stéréo, le temps d’analyse augmente.
Aligner les répétitions (1.11.0). Dans les chansons populaires, la même progression d’accords se répète, comme dans les couplets 1 et 2 et le refrain, et seules la mélodie et les fills changent à chaque fois. On mesure la similarité interne au morceau, temps par temps, avec les vecteurs unitaires des chromas aigus et graves ; lorsque la diagonale moyennée sur une fenêtre de 8 temps (même position à au moins 16 temps d’écart) dépasse les 3 % supérieurs du morceau, l’endroit qui correspond le mieux à cette position devient le « partenaire de répétition » de ce temps (seulement les partenaires ayant la même position dans la mesure, jusqu’à 6 par temps). Pour les morceaux dont le dernier refrain monte d’un demi-ton ou d’un ton, on compare aussi après transposition de l’écart de tonalité. Avant le Viterbi final des accords, on fait pour chaque temps une moyenne pondérée de ses scores d’accords et de ceux de ses partenaires (1 pour lui-même, 0.7 × similarité par partenaire) ; on n’emprunte aux partenaires que le meilleur score par fondamentale, et les qualités comme majeur, mineur, 7 ou sus sont déterminées par le son du temps lui-même. Un temps qui a penché vers un accord voisin à cause d’une mélodie ponctuelle est ainsi corrigé par les autres répétitions, sans importer la qualité d’un accord joué différemment. La table de similarité ayant une taille égale au carré du nombre de temps, la méthode n’est pas utilisée pour les entrées très longues de plus de 3,000 créneaux.
Nom de la septième demi-diminuée (1.11.1). Le vocabulaire standard ne contient pas m7♭5 (l’ajouter modifierait les m7 et dim d’autres morceaux et dégraderait l’ensemble), si bien que les accords de septième demi-diminuée (ii°7 en mineur, vii°7 en majeur) étaient écrits dim. Une fois les accords et la tonalité déterminés, pour chaque intervalle écrit dim, si la septième mineure (fondamentale + 10 demi-tons) dans le chroma des aigus non mélangé vaut au moins 0.5 fois la moyenne des notes de l’accord de trois sons, seul le nom est changé en m7♭5. La fondamentale, le caractère majeur/mineur, les frontières et la tonalité restent inchangés. Sur GuitarSet, par rapport aux accords joués, la proportion d’échantillons à la qualité correcte est passée de 59.37 % à 60.28 % (+97 / −3, et +69 / −0 pour les genres de musique populaire), et la plupart des échantillons modifiés étaient des m7♭5 réellement joués par le musicien.
Comme le score de transition vaut « 0 pour rester, $-\lambda_s$ pour changer (indépendamment de l’accord d’arrivée) », le seul maximum de chaque étape suffit à obtenir la meilleure transition vers tous les états d’arrivée.
V_s(c) = e_s(c) + \max\!\Big(V_{s-1}(c),\ \max_{c'} V_{s-1}(c') - \lambda_s\Big)
| Position du créneau | Premier temps de la mesure | Temps central des mesures paires | Autres temps | Entre les temps (résolution ½ temps) | Accords provisoires (tous les temps) |
|---|---|---|---|---|---|
| $\lambda_s$ | 1.5 | 3.0 | 4.0 | 6.0 | 3.0 |
On standardise ( $Z$ ) chacune des six caractéristiques du temps $i$ et on les additionne.
z_i = 1.0\,Z(h)_i + 1.0\,Z(l)_i + 0.5\,Z(g)_i + 0.6\,Z(k)_i + 0.3\,Z(e)_i + 0.4\,Z(o)_i
| Symbole | Caractéristique |
|---|---|
| $h_i$ | Changement du chroma des aigus $1 - \langle \hat t_i, \hat t_{i-1}\rangle$ |
| $l_i$ | L’accord provisoire a-t-il changé |
| $g_i$ | Changement du chroma de basse |
| $k_i$ | Force des attaques graves à la position du temps |
| $e_i$ | Augmentation du volume (dB, positive uniquement) |
| $o_i$ | Entrée nouvelle sur l’accord de tonique |
Les états sont les positions dans la mesure $p \in {0, \dots, m-1}$ . Le score d’émission vaut $1.5\,z_i$ en $p = 0$ , $0.45\,z_i$ en $p = m/2$ pour les mesures paires ( $m \ge 4$ ), et 0 ailleurs.
P(p \to p+1) = 1 - 2\varepsilon,\qquad P(k \to 0) = \varepsilon\ \ (1 \le k \le m-2),\qquad P(m-1 \to m-1) = \varepsilon,\qquad \varepsilon = 3\times 10^{-4}
En autorisant avec une faible probabilité le raccourcissement et l’allongement des mesures, le chemin ne s’effondre pas en cas de mesure irrégulière ou de mesure tronquée. Le choix automatique de la mesure se fait par le contraste $\Delta_m$ (moyenne des $z$ des temps choisis comme premiers temps − moyenne des $z$ des autres temps). Les candidats sont 4 et 3 temps (4 et 2 en mesure composée), et l’on ne choisit l’autre que si son contraste dépasse celui de 4 temps d’au moins 0.25 (0.3 en mesure composée).
A priori pair/impair de la batterie (1.10.0). Pour chaque temps, on standardise la force de grosse caisse $K$ et la force de caisse claire $S_n$ , puis on calcule une cohérence locale : la somme, sur les 8 temps avant et après, des valeurs multipliées par $(-1)^j$ , divisée par la somme des valeurs absolues (avec le signe inversé pour la caisse claire).
c^X_i = (-1)^i\,\frac{\sum_{|j-i| \le 8} (-1)^j X_j}{\sum_{|j-i| \le 8} |X_j|} \in [-1, 1],\qquad
z_i \leftarrow z_i + \mathrm{sgn}(c^K_i)\,\min\big(|c^K_i|, |c^{-S_n}_i|\big)\quad \text{if } |c^K_i|, |c^{-S_n}_i| \ge 0.3,\ c^K_i\,c^{-S_n}_i > 0
C’est l’a priori selon lequel le premier temps est un temps de grosse caisse (temps 1 et 3) et non de caisse claire (temps 2 et 4). La distinction entre le temps 1 et le temps 3 reste déterminée par les indices harmoniques. Comme il n’est utilisé que lorsque la grosse caisse et la caisse claire alternent toutes deux nettement et en opposition, il vaut 0 là où une seule alterne, comme dans le grattage d’une guitare seule. Si cela est confirmé sur au moins 20 % des temps du morceau (présence d’une batterie), on l’ajoute aussi sur la seule base de la cohérence de la caisse claire (au moins 0.5) là où les graves sont brouillés par la basse ou des accents syncopés. Sur la pop de GTZAN, la parité indiquée par cet a priori correspondait à 99.6 % à la parité du premier temps de référence.
Renforcement du choix de la mesure (1.10.0). Les mesures à 3, 5 et 7 temps ne sont choisies que si, en plus de la condition de contraste, l’autocorrélation des indices de premier temps à cette longueur de mesure est supérieure à celle de 4 temps ; et si un backbeat de batterie est confirmé sur au moins 30 % du morceau, les candidats à 3, 5 et 7 temps sont retirés (le modèle de changement de mesure en cours de morceau reste inchangé). La décision 4 temps contre 2 temps (demi-mesure) se fait avec le $z$ d’avant l’ajout de l’a priori de batterie, afin que la grosse caisse, qui renforce également les temps 1 et 3, ne fasse pas lire une mesure en 4/4 comme du 2/4.
\rho_z(m) + \rho_z(2m) > \rho_z(4) + \rho_z(8)
Réexamen des mesures de longueur différente (1.11.4). Dans les morceaux où l’accord du premier temps de la mesure est anticipé d’un demi-temps à un temps, les changements harmoniques par temps $h, l, g$ se répartissent entre le quatrième temps et le premier, si bien que les indices de premier temps désignent facilement le troisième temps comme premier temps, que les barres de mesure se décalent d’une demi-mesure et qu’une mesure de 2 temps s’intercale. Si la résolution à mesure fixe contient des mesures de longueur différente et qu’il n’y a pas de changement de mesure en cours de morceau, on résout de nouveau avec des indices où les changements par temps sont remplacés par les distances $h^{(2)}_i, g^{(2)}_i$ entre les chromas aigus et graves des fenêtres des 2 temps précédents et des 2 temps suivants (les changements anticipés se regroupent aussi sur le premier temps).
z'_i = z_i - Z(h)_i - Z(l)_i - 0.5\,Z(g)_i + Z(h^{(2)})_i + Z(g^{(2)})_i,\qquad
h^{(2)}_i = 1 - \cos\Big(\textstyle\sum_{j=i-2}^{i-1} \hat T_j,\ \sum_{j=i}^{i+1} \hat T_j\Big)
| Le résultat de la nouvelle résolution n’est utilisé que si les trois conditions suivantes sont toutes remplies (morceaux en 4/4 dont la mesure a été choisie automatiquement et morceaux où le 4/4 a été choisi manuellement ; un déplacement du premier temps décale tel quel la grille corrigée). ① Aucune mesure de longueur différente (tout le morceau a une seule phase de mesure). ② Avec les indices d’origine $z$ comme avec les nouveaux indices $z’$ , si l’on considère tout le morceau avec une seule phase, le score de premier temps de cette phase dépasse celui des autres phases de plus de la valeur de deux mesures de longueur différente ($2\, | \ln \varepsilon | $). ③ Lorsque la même phrase se répète 4 ou 8 mesures plus loin, les cas où l’harmonie des temps à la même position choisis par la nouvelle grille est plus semblable que celle des temps choisis par la grille d’origine sont plus nombreux selon un test des signes $z \ge 3$ (une même phrase devant aussi avoir la même phase de mesure, c’est la preuve que l’inversion de phase de la résolution d’origine était fausse). Utilisée sans condition, la méthode dégradait sur GTZAN des morceaux (34), moins nombreux que ceux dont le premier temps s’améliorait (71) ; les conditions ont donc été resserrées pour qu’aucun morceau existant ne se dégrade. |
Phase du début du morceau (1.10.3). Si le morceau est jugé commencer par une anacrouse mais qu’une mesure courte s’intercale dans les deux premières mesures, et que le nombre de temps depuis le début du morceau jusqu’à la fin de cette mesure courte est un multiple de la longueur de mesure, il s’agit d’un cas où la phase du premier temps a été prise un temps trop tard puis rattrapée par une mesure courte (fausse anacrouse + fausse mesure « à 3 temps »). Dans ce cas, on recompte en mesures complètes depuis le début du morceau. Sur les 6 genres populaires de GTZAN, le nombre de mesures irrégulières passe de 711 à 695, et le F du premier temps est inchangé.
Si, sur l’horloge audio, la lecture de la musique a commencé à l’instant $t_s$ à partir de la position $o_s$ du morceau, l’heure programmée du $i$-ième clic, correction utilisateur $\delta$ comprise, la position de lecture actuelle et la position affichée à l’écran sont les suivantes.
t^\text{click}_i = t_s + (b_i + \delta - o_s),\qquad
\text{pos} = o_s + \max(0,\ t_\text{now} - t_s),\qquad
\text{pos}_\text{display} = \text{pos} - L_\text{out}
L’ordonnanceur se réveille avec une période $T_\text{tick} = 25$ ms et programme les clics tels que $b_i + \delta \le \text{pos} + H$ ( $H = 0.2$ s, 1.5 s pour un onglet en arrière-plan). Comme $H \gg T_\text{tick}$ , le clic est déjà programmé tant que le minuteur ne prend pas plus d’environ 175 ms de retard d’un coup. Le son du clic est un tampon précalculé de la forme d’onde suivante (premier temps $f$ = 1,850 Hz·$A$ = 0.9, autres temps 1,250 Hz·0.6, avec un bruit à décroissance linéaire ajouté sur les 2 premières ms). Si l’unité de changement d’accord est le ½ temps, lors de la programmation du temps $b_i$ , un petit clic (2,600 Hz, $A$ = 0.3, décroissance 8 ms, moitié de bruit) est programmé en même temps entre ce temps et le suivant, en $(b_i + b_{i+1})/2 + \delta$ . Ce son étant un demi-temps plus tard, il n’est pas en retard même dans un morceau lent, et en cas de changement de position, la programmation reprend à partir du clic qui suit le temps actuel (1.10.0).
x(t) = A\Big[\,0.75\,\big(\sin\, 2\pi f t + 0.3\sin\, 2\pi (2.02 f) t\big)\,e^{-t/16\,\text{ms}}\Big]
La fréquence fondamentale et les harmoniques inharmoniques sont déterminées à partir de la note MIDI $m$ et de l’écart de note de référence du morceau $\theta$ (en demi-tons).
f_0 = 440 \cdot 2^{(m - 69 + \theta)/12},\qquad f_k = k f_0\sqrt{1 + B k^2},\qquad B = 3.5\times 10^{-4}\cdot 2^{(m-60)/24}
L’amplitude des harmoniques est déterminée par la position de frappe du marteau $x_h = 1/7.5$ et l’atténuation des aigus due au feutre du marteau.
a_k = \frac{|\sin(\pi k x_h)|}{k^{0.8}}\cdot\frac{1}{1 + (f_k/f_b)^2},\qquad f_b = \mathrm{clip}\big(2600 + 40(m-60),\ 1800,\ 5000\big)\ \text{Hz}
Chaque harmonique est la somme d’une décroissance rapide (son immédiat) et d’une décroissance lente (son résiduel), et les harmoniques graves sont jouées ensemble par plusieurs cordes $s$ aux hauteurs $d_s$ légèrement différentes.
y(t) = \sum_{k}\ \sum_{s=1}^{S_k} \frac{a_k}{S_k}\left(0.60\,e^{-t/\tau^{F}_k} + 0.40\,e^{-t/\tau^{S}_k}\right)\sin\!\left(2\pi f_k\, 2^{d_s/1200}\, t + \varphi_k\right)
\tau^{S}_k = \max\!\left(0.12,\ \tau_1\Big(\frac{f_0}{f_k}\Big)^{0.7}\right),\qquad \tau^{F}_k = 0.15\,\tau^{S}_k,\qquad \tau_1 = \mathrm{clip}\!\left(8.5\cdot 2^{-(m-38)/16},\ 1.0,\ 8.5\right)\ \text{s}
Le nombre de cordes $S_k$ vaut, pour $k \le 6$ , 1 (m < 35), 2 (m < 47) ou 3 (sinon), et 1 pour $k > 6$ . Les écarts d’accordage entre cordes sont $d = (0, +1.0, -0.8)$ cent. On n’utilise les harmoniques que jusqu’à la 32e et jusqu’à 8 kHz, et l’on cesse de calculer une fois descendu sous −100 dB. La phase initiale $\varphi_k$ diffère d’une harmonique à l’autre, tirée d’un nombre aléatoire fixé pour chaque note, mais les différentes cordes d’une même harmonique partent avec la même phase (voir les battements en 4-2). On y ajoute un bruit de marteau de 30 ms, une rampe d’attaque de 2 ms et un fondu final de 60 ms, et l’on ajuste le tout pour que le RMS des 0.3 premières secondes vaille 0.12. La durée est de $\mathrm{clip}(5.6 - 0.07(m-38),\ 2.6,\ 5.6)$ secondes. Tout le chemin du piano est multiplié par un gain de correction fixe de +6.4 dB (×2.09). Les sinus sont produits par une récurrence de rotation au lieu de Math.sin, et leur amplitude est ramenée à 1 tous les 2,048 échantillons.
\begin{pmatrix} c_{i+1} \\ s_{i+1} \end{pmatrix} =
\begin{pmatrix} \cos\,\omega & -\sin\,\omega \\ \sin\,\omega & \cos\,\omega \end{pmatrix}
\begin{pmatrix} c_i \\ s_i \end{pmatrix},\qquad \omega = \frac{2\pi f}{f_s}
Les candidats pour la main droite sont, pour chaque renversement des notes constitutives, des dispositions serrées construites vers le haut avec la note la plus grave placée entre F3 et E4 (53 à 64).
n_\text{bass} = 38 + \big((p_\text{bass} - 38) \bmod 12\big),\qquad
\hat V = \arg\min_{V}\ \big|\bar V - \mu\big| + 2\max(0,\ V_\text{top} - 77),\qquad
\mu \leftarrow 0.7\,\bar{\hat V} + 0.3\cdot 62
$\bar V$ est la hauteur moyenne de la disposition, et $\mu$ part de D4 (62) et suit la disposition précédente tout en étant légèrement ramené vers le centre. L’intensité est de 0.62 pour la basse et de $0.5\sqrt{3/n}$ pour chaque note de la main droite ( $n$ étant le nombre de notes de la main droite), et la position stéréo vaut $\mathrm{clip}((m-60)/36,\ -0.5,\ 0.5)$ . L’instant de frappe $t_j$ est transposé sur l’horloge audio de la même manière qu’en (15), mais sans ajouter la correction de clic $\delta$ de l’utilisateur ; à partir de l’instant $t^\text{end}_j$ où l’intervalle de l’accord se termine, le volume décroît avec une constante de temps de 70 ms.
t^\text{piano}_j = t_s + (t_j - o_s),\qquad g(t) = g_0\,e^{-(t - t^\text{end}_j)/70\,\text{ms}}\quad (t \ge t^\text{end}_j)
On construit la distribution des notes $h_i$ du temps $i$ et $H_i$ , qui regroupe les ±6 temps avant et après avec une pondération triangulaire.
h_i(q) = \sqrt{\frac{T_i(q)}{\sum_{q'} T_i(q')}} + \frac12\sqrt{\frac{B_i(q)}{\sum_{q'} B_i(q')}},\qquad
H_i = \sum_{|j-i| \le 6}\Big(1 - \frac{|j-i|}{7}\Big)\,h_j
Le score de la classe d’armure $g$ (tonique majeure $g$ , mineur relatif $g+9$ ) est le plus grand des deux coefficients de corrélation avec les profils tonaux.
c_i(g) = \max\Big(\mathrm{corr}\big(H_i,\ \vec K_\text{major}(g)\big),\ \mathrm{corr}\big(H_i,\ \vec K_\text{minor}(g+9)\big)\Big),\qquad g = 0, \dots, 11
Un HMM à 12 états qui n’applique la pénalité $\Lambda$ qu’en cas de changement de tonalité est résolu en $O(T \cdot 12)$ , de la même manière que le Viterbi des accords.
V_i(g) = c_i(g) + \max\Big(V_{i-1}(g),\ \max_{g'} V_{i-1}(g') - \Lambda\Big),\qquad \Lambda = 6
Les sections de moins de 24 temps sont absorbées par la section voisine dont la somme $\sum c_i$ est la plus grande. Pour chaque section, on choisit entre le majeur et le mineur relatif celui dont la corrélation avec la distribution de toute la section est la plus grande. Les frontières sont recherchées de nouveau à ±8 temps avec les scores par temps $u_j$ , non regroupés par fenêtre.
b^\ast = \arg\max_{|b - b_0| \le 8}\ \sum_{j=b-16}^{b-1}\big(u_j(A) - u_j(B)\big) + \sum_{j=b}^{b+15}\big(u_j(B) - u_j(A)\big) + 0.5\,[\,b\ \text{is a downbeat}\,]
Si l’accord en $b^\ast$ est V, V7 ou Vsus4 de la nouvelle tonalité et que l’accord de tonique de la nouvelle tonalité (I·Imaj7 en majeur, i·im7 en mineur) suit dans les 8 temps, la frontière est déplacée à l’emplacement de cet accord de tonique. La tonalité des sections ainsi découpées sert au bonus de tonalité du score d’émission des accords (12) et à l’écriture des noms de notes.
Une fois la reconnaissance des accords terminée, la tonalité de chaque section est redéterminée à partir des accords. Pour la suite d’accords de la section (accords identiques regroupés en un seul, de durée $\ell_j$ temps) et une tonalité candidate $K$ , on choisit parmi les 24 la tonalité qui maximise le score suivant.
J(K) = \frac{\sum_j \ell_j\,[\,c_j \subset K\,]}{\sum_j \ell_j} + 0.5\,\frac{\sum_j \ell_j\,[\,c_j = \mathrm{I}_K\,]}{\sum_j \ell_j} + 0.3\min\!\Big(1, \frac{N_{V \to I}}{3}\Big) + 0.15\,[\,c_1 = \mathrm{I}_K\,] + 0.15\,[\,c_\text{last} = \mathrm{I}_K\,] + 0.4\,\frac{N_\text{phrase}(\mathrm{I}_K)}{N_\text{phrase}} + 1.2\,\mathrm{corr}\Big(\sum_i h_i,\ \vec K\Big)
Si les tonalités ainsi redéterminées sont identiques pour deux sections voisines, celles-ci sont fusionnées en une seule (1.10.0). En effet, même si les classes d’armure qui ont servi au découpage diffèrent, la tonalité redéterminée par les accords peut être la même, et sans fusion une modulation serait écrite alors que la tonalité n’a pas changé. Même si deux sections voisines se répartissent entre tonalités relatives majeure et mineure (G majeur et E mineur), elles sont fusionnées et la tonalité est redéterminée avec les accords de la section fusionnée. Cela suit l’usage qui consiste à ne pas écrire de modulation pour un passage entre tonalités relatives ; un morceau ainsi partagé est un morceau où le choix entre majeur et mineur est ambigu, si bien que dans la section fusionnée, on n’écrit le mineur que si son score dépasse de plus de 0.2 celui du majeur relatif (le majeur est fréquent en musique populaire, 1.10.0).
Filtrer les modulations quasi ex æquo (1.11.1). Lors de la redétermination de la tonalité de chaque section par les accords, si la tonalité choisie pour une section ne devance que de moins de 0.1 en $J$ la tonalité de la section voisine (ou celle de ses tonalités relatives qui obtient le meilleur score dans cette section), cette section est aussi considérée comme étant dans la tonalité voisine. Il s’agit d’éviter qu’une modulation presque sans fondement empêche la fusion des tonalités relatives et décale en chaîne les noms de tonalité de tout le morceau. En 1.11.0, l’introduction de 「고민중독」 (Gomin jungdok) se partageait entre D majeur 1.788 et G majeur 1.781, et tout le morceau était écrit B mineur → E mineur → F mineur ; avec cette règle, on revient à G majeur → A♭ majeur (la bonne réponse). Dans toutes les données testées, cet écart n’a été atteint que trois fois (0.007, 0.02, 0.036), alors que les vraies modulations devançaient de plus de 0.7.
Noms de tonalité quand m7 et accord de sixte se recouvrent (1.11.4). Dans un morceau en majeur, le vi7 (D♯m7 en F♯ majeur) a les mêmes notes que le I6 (F♯6) et ne peut donc pas être distingué par les accords ; or le score d’accord de tonique ne va qu’au mineur (i7 en D♯ mineur), si bien qu’un morceau en majeur riche en vi7 peut recevoir le nom du mineur relatif. On ne compte aussi ce m7 comme accord de tonique du majeur relatif, et l’on ne refait la comparaison, que si la tonalité choisie par les accords est mineure, que la distribution des notes de la section correspond le mieux au majeur relatif (1er sur 24 tonalités), que cet écart, $1.2\,\Delta r$ , dépasse 0.15 (1.5 fois la marge de quasi-égalité 0.1), et que le m7 sur la fondamentale de ce mineur occupe au moins 1/3 de la durée des accords de la section. On ne déplace vers aucun autre majeur. Utilisée sans condition, la règle faisait passer à faux 29 tonalités justes de GTZAN (pour 26 fausses devenues justes), d’où les conditions resserrées.
$[\,c \subset K\,]$ indique si toutes les notes de l’accord appartiennent à la gamme de la tonalité (sensible comprise pour le mineur), $\mathrm{I}K$ est l’accord de tonique (I·Imaj7 en majeur, i·im7 en mineur), $N{V \to I}$ le nombre de progressions V·V7 → I, et $N_\text{phrase}$ le nombre de premiers temps toutes les 4 mesures à partir de la première mesure complète de la section. Le poids 1.2 du dernier terme a été fixé à partir de 18 morceaux à la tonalité claire.
Affiner les noms de modulation (1.10.3). Si la première section tonale du morceau fait 8 mesures ou moins et qu’elle est dans la tonalité de sous-dominante ou de dominante de la section suivante, de même branche (majeur ou mineur), elle est fusionnée avec la tonalité suivante. En effet, si l’introduction commence sur iv ou V, le premier accord de la phrase fait attribuer une autre tonalité à la seule introduction, et une fausse modulation comme « B♭ mineur → F mineur » est écrite. Par ailleurs, dans un morceau avec modulation, les noms de tonalité sont uniformisés sur la branche de la section la plus longue. Les tonalités relatives majeure et mineure ayant les mêmes notes, ce n’est qu’un choix de nom ; mais en choisissant section par section, une modulation d’un ton vers le haut serait écrite « C mineur → F majeur », masquant ce qui a changé ; on écrit donc « C mineur → D mineur ».
Affiner les frontières de modulation (1.10.4). Les frontières de modulation étant déterminées par des fenêtres de distribution des notes, elles tendent à arriver une ou deux mesures trop tôt du côté de la nouvelle tonalité, à cause d’accords dont beaucoup de notes appartiennent aux deux tonalités (V7 de l’ancienne tonalité, etc.). Une fois tous les accords déterminés, pour chaque premier temps de mesure dans les 2 mesures qui suivent la frontière, on additionne temps par temps « la proportion de notes de l’accord appartenant à la gamme de l’ancienne tonalité − la proportion appartenant à la gamme de la nouvelle tonalité », et l’on repousse la frontière au premier temps de mesure qui laisse le plus d’accords de l’ancienne tonalité dans l’ancienne tonalité (seulement si le gain dépasse 0.5 temps). On ne la déplace jamais vers l’avant, afin de ne pas entrer en conflit avec la règle qui fait commencer la nouvelle tonalité à l’accord de tonique après passage par la dominante de la nouvelle tonalité. Par ailleurs, si le premier temps de la nouvelle tonalité est N.C., que la moitié ou plus de cette mesure est N.C. (un break) et que l’accord de tonique de la nouvelle tonalité n’est pas encore apparu, le son de cette mesure est considéré comme l’anacrouse de la phrase suivante et la nouvelle tonalité est écrite à partir du premier temps de la mesure suivante (conditions resserrées en 1.10.5 : une mesure qui marque une courte pause puis frappe tout de suite le nouvel accord de tonique passe dans la nouvelle tonalité dès cette mesure). Dans 「夜に駆ける」, le B mineur a été déplacé de la mesure 102 (G7 de C mineur), en passant par la mesure 103 (un break dont la première demi-mesure est silencieuse et ne contient que la note d’attaque du chant sans accompagnement), à la mesure 104, où l’accompagnement entre en B mineur. Dans 「고민중독」, la modulation vers A♭ majeur, placée 2 mesures trop tôt, a été déplacée à 1 mesure trop tôt (la mesure de transition vers la modulation).
La roue Camelot place les tonalités sur les numéros 1 à 12 dans l’ordre du cycle des quintes, avec B pour le majeur et A pour le mineur. Le numéro d’une tonalité majeure de tonique $t$ (C = 0), et celui de la tonalité mineure qui partage le numéro de son majeur relatif (tonique $t+3$), sont les suivants.
n_\text{major}(t) = \big((7t + 7) \bmod 12\big) + 1,\qquad n_\text{minor}(t) = n_\text{major}\big((t + 3) \bmod 12\big)
$7t \bmod 12$ indique de combien de quintes on est monté depuis C (comme $7 \cdot 7 \equiv 1 \pmod{12}$ , la tonalité située une quinte plus haut a un numéro supérieur de 1). On y ajoute 7 pour que C majeur soit 8B.
| Numéro | A (mineur) | B (majeur) |
|---|---|---|
| 1 | A♭m (G♯m) | B |
| 2 | E♭m (D♯m) | F♯ (G♭) |
| 3 | B♭m | D♭ |
| 4 | Fm | A♭ |
| 5 | Cm | E♭ |
| 6 | Gm | B♭ |
| 7 | Dm | F |
| 8 | Am | C |
| 9 | Em | G |
| 10 | Bm | D |
| 11 | F♯m | A |
| 12 | C♯m (D♭m) | E |
Un accord prend le numéro de la tonalité qui a la même fondamentale et la même tierce, et le type d’accord est conservé en indice. Les accords sus, sans tierce, sont placés du côté B.
| Type d’accord | Code Camelot | Exemple |
|---|---|---|
| Accord parfait majeur, 7, maj7, aug, sus2, sus4 | Numéro du majeur sur la fondamentale + B | C → 8B, G7 → 9B7, Fmaj7 → 7Bmaj7, Esus4 → 12Bsus4 |
| Accord parfait mineur, m7, dim, m7♭5, dim7 | Numéro du mineur sur la fondamentale + A | Am → 8A, Dm7 → 7A7, Bdim → 10Adim, Bm7♭5 → 10A7♭5 |
Les accords diatoniques du majeur $n$B se regroupent tous dans $n \pm 1$ : I·IV·V sont $n$B·$(n-1)$B·$(n+1)$B, et ii·iii·vi sont $(n-1)$A·$(n+1)$A·$n$A (après 12 vient 1).
Par rapport à la tonalité en vigueur à cet endroit (tonique $t$ , majeur ou mineur), l’intervalle de la fondamentale $r$ , $d = (r - t) \bmod 12$ , est converti en degré. Le mineur se réfère à la gamme mineure naturelle, et l’accord diminué sur la sensible est écrit vii° sans altération, selon l’usage.
| $d$ | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Majeur | I | ♭II | II | ♭III | III | IV | ♯IV | V | ♭VI | VI | ♭VII | VII |
| Mineur | I | ♭II | II | III | ♯III | IV | ♯IV | V | VI | ♯VI | VII | ♯VII |
| Règle | Contenu |
|---|---|
| Majuscules et minuscules | Les accords dont la tierce est mineure (m, m7, dim, m7♭5, dim7) sont en minuscules |
| Symboles de qualité | dim·dim7 → °, m7♭5 → ø, aug → +, maj7 → M |
| Chiffres de renversement | Accords de trois sons : état fondamental (rien), 6, ⁶₄. Accords de septième : 7, ⁶₅, ⁴₃, ⁴₂. Si la notation de basse est désactivée, état fondamental |
| Dominante secondaire | Un accord parfait majeur ou de septième de dominante hors tonalité qui se résout en descendant d’une quinte juste sur l’accord immédiatement suivant, si cet accord est un accord de trois sons x de la tonalité autre que la tonique : V/x, V7/x. En mineur, VII → III est aussi V/III |
| Accord de sensible secondaire | Un accord diminué hors tonalité qui va vers un accord de trois sons x de la tonalité situé un demi-ton plus haut : vii°/x, vii°7/x, viiø7/x |
| ii secondaire | Un accord parfait mineur, m7 ou m7♭5 hors tonalité qui enchaîne sur le V/x situé une quinte juste plus bas : ii/x, ii7/x, iiø7/x |
| Juste avant une modulation | Si le V ou V7 de la tonalité de la section suivante va vers l’accord de tonique de cette tonalité, il est noté V par rapport à la nouvelle tonalité |
Sauts de tempo. Pour chaque fenêtre de 8 secondes (pas de 1 seconde), on calcule le score de période $s_w(\ell)$ dans la plage de 0.6 à 1.65 fois la période globale du temps, et l’on choisit le parcours avec un Viterbi sur les états de tempo. Le score au voisinage du tempo d’origine (±4 %) est saturé à 1 s’il atteint au moins 60 % du maximum de la fenêtre, pour qu’on ne le quitte pas facilement ; les autres tempos sont comparés avec leur score réel, pour ne pas partir vers une fausse période comme ×2/3. Le coût de déplacement entre fenêtres est le suivant.
c(d) = \begin{cases} 0 & d \le 0.005 \\ -6 - 100\,(d - 0.005) & 0.005 < d \le 0.04 \\ -12 - 2d & d > 0.04 \end{cases},\qquad d = \left|\ln\frac{\ell_w}{\ell_{w-1}}\right|
Un tempo qui change progressivement est suivi sans coût à moins de 0.5 % par fenêtre, et un chemin qui va loin à petits pas devient plus cher qu’un saut unique. S’il n’y a aucun saut de plus de 4 % dans le chemin, on utilise tel quel la courbe de tempo local de (6) ; s’il y en a, on découpe en sections aux points de saut et l’on construit une courbe par section de la même manière (tempo central de la section ±15 %, médiane sur 7 fenêtres).
Niveau de la walking bass. Si le tempo est de 85 BPM ou moins, que le rapport sur le temps/entre les temps des attaques graves est de 2.5 ou moins et qu’il n’y a pas de backbeat (caisse claire concentrée du côté opposé à la grosse caisse, $s_{S_n} \le -0.15$), on monte d’un niveau ; les morceaux ainsi montés sont vérifiés une fois de plus à 150 BPM ou moins. Les candidats de tempo vont de 40 à 300 BPM.
Candidats de mesure. Pour les morceaux en mesure simple, on compare 4, 3, 5 et 7 temps. Une mesure autre que 4 temps n’est choisie que si son contraste de premier temps dépasse celui de 4 temps de plus de 0.25 (3 temps) ou 0.3 (5 et 7 temps), et si les mesures ajustées en les allongeant ou raccourcissant de force représentent 15 % ou moins. Sur le chemin à 4 temps, si l’indice de premier temps du troisième temps atteint au moins 85 % de celui du premier temps, on considère une mesure à 2 temps.
Power chords. Dans le score des états de power chord, on retranche une pénalité correspondant à l’excès de la somme des chromas situés 2, 3, 4 et 5 demi-tons au-dessus de la fondamentale sur 0.7 fois la fondamentale et la quinte.
e_s(c_5) \leftarrow e_s(c_5) - 6\,\max\Big(0,\ \sum_{d \in \{2,3,4,5\}} o_s(r+d) - 0.7\,\big(o_s(r) + o_s(r+7)\big)\Big)
De plus, les power chords ne sont écrits que s’ils occupent au moins 16 temps et au moins 8 % du morceau ; sinon, on les retire et l’on refait la décision. Il s’agit d’éviter que des sus4 de ballade ne soient lus çà et là comme des power chords.
Basse un ton au-dessus. On prévoit des états d’accord parfait majeur avec une basse située un ton au-dessus de la fondamentale (F/G, B♭/C, score a priori −1.6), qui ne sont acceptés que si cette note représente au moins 30 % du chroma de basse du créneau (sinon −3). En chiffres romains, la basse est considérée comme la fondamentale, ce qui donne V11 ; en Camelot, on ajoute 11 au numéro de la tonalité de la basse.
Affinage des renversements. Si la basse bouge trois fois ou plus au sein d’un même accord (walking bass), les renversements de moins de 2 temps sont fusionnés avec ce qui précède ou suit, et une basse sur la quinte est considérée comme une basse alternée avec la fondamentale et fusionnée (elle est conservée si toute la section a la quinte à la basse). La basse descendante d’un temps des ballades (V⁴₂ → iii7) est laissée telle quelle.
Changements de mesure. Les états du modèle de premier temps sont étendus à (mesure, position dans la mesure), et le passage à une autre mesure (3, 4, 5 ou 7 temps) n’est permis qu’en fin de mesure, avec une très faible probabilité $\mu = 10^{-7}$ (passée de $10^{-6}$ à $10^{-7}$ en 1.10.0 : pour ne pas lire en 3/4 les fins de morceau où les accords changent un temps en avance). On ne considère qu’il y a changement de mesure que si la nouvelle mesure dure au moins 4 mesures (une ou deux mesures ne sont que des mesures irrégulières) ; sans un tel changement, le résultat de ce modèle n’est pas utilisé, si bien que les résultats des morceaux à mesure constante ne changent pas.
Vérification des changements de mesure (1.11.4). Dans les passages où les indices de premier temps sont brouillés (refrain où la voix supérieure tient longuement et où l’harmonie bouge par la basse, etc.), le bruit peut correspondre par hasard à une autre longueur de mesure, et le dernier refrain d’un morceau en 4/4 du début à la fin peut être écrit en 5/4 ou 7/4. Pour chaque section de mesure modifiée, on mesure donc $S(m) = \max_{k \in {4, 8}} \overline{\cos}(i,\ i + k m)$ , la ressemblance des chromas aigus et graves par temps entre temps séparés d’un intervalle de phrase (4 ou 8 mesures) de longueur de mesure $m$ ; si le $S$ de la mesure principale dépasse celui de la nouvelle mesure de plus de 0.02, ce changement de mesure est écarté et l’on résout de nouveau. En effet, la musique populaire se répète par phrases de 4 ou 8 mesures, et un écart d’une ou deux mesures ne permet pas de distinguer les mesures. La vérification n’est utilisée que si la section fait au moins 16 mesures dans la mesure principale, afin de pouvoir observer deux répétitions d’une phrase de 8 mesures (sur des extraits de 30 secondes, les sections étant courtes, la moyenne des répétitions fluctuait et le premier temps se dégradait pour certains morceaux).
Affichage du tempo. Pour chaque temps, on calcule le tempo à partir de la médiane des intervalles des 4 temps avant et après, et on l’affiche dans le BPM en haut de l’écran pendant la lecture. Une indication est placée sur le premier temps du morceau avec le tempo des 16 premiers temps et, ailleurs, là où le tempo des 8 temps avant et après change brusquement de plus de 12 % et où le nouveau tempo (16 temps suivants) diffère de plus de 8 % de l’indication précédente. L’indication est placée au temps où l’écart commence à dépasser la moitié du maximum ; s’il y a un premier temps de mesure à moins de deux temps, elle y est alignée.
Tempo qui change progressivement. On cherche les passages où le tempo lissé par la médiane des intervalles des 8 temps avant et après continue de changer dans une même direction de plus de 1 % par rapport à 4 temps plus tôt, et où il a changé en tout de plus de 8 % sur au moins 16 temps (en excluant les passages qui contiennent un changement brusque). La courbe lissée réagissant en retard à la fin du passage, si dans les 16 temps suivant la fin du passage le tempo continue de changer de plus de 1 % à chaque temps, on prend la fin jusque-là. Comme le début est avancé de 4 temps et la fin repoussée, des passages voisins peuvent se chevaucher ; s’ils se chevauchent ou se touchent dans la même direction, ils sont fusionnés, et s’ils se chevauchent en directions opposées, ils sont coupés à l’extremum de tempo situé dans les temps communs, puis les conditions ci-dessus (16 temps, 8 %, aucun changement brusque) sont vérifiées de nouveau (1.10.0). Sur la grille, un cadre hexagonal s’étend du temps de début du passage jusqu’au temps qui précède immédiatement le temps de fin, et le tempo d’arrivée est placé dans une pastille blanche sur le temps de fin. Pendant la lecture, le cadre se remplit jusqu’à la position de lecture et, lorsqu’il atteint le temps d’arrivée, le remplissage pâlit pendant 0.8 seconde selon $(1-u)^2$ ($u$ étant le temps écoulé depuis l’arrivée ÷ 0.8 seconde). La pastille d’arrivée s’allume au temps d’arrivée pendant la durée suivante, puis s’éteint immédiatement ($\Delta b$ étant la durée du temps d’arrivée).
T_{\mathrm{on}} = 1.1\,\Delta b + 0.06\,\mathrm{s}
Le facteur 1.1 rend proportionnel au tempo le débordement sur le temps suivant, et les 0.06 seconde sont une rémanence fixe pour que l’instant de l’extinction ne paraisse pas coïncider avec le début du temps suivant. À 100 BPM, la rémanence est de 0.12 seconde ; elle est un peu plus longue pour les morceaux lents et un peu plus courte pour les rapides.
r_j = \left|\ln\frac{\mathrm{med}\{\Delta b_{j-8}, \dots, \Delta b_{j-1}\}}{\mathrm{med}\{\Delta b_{j}, \dots, \Delta b_{j+7}\}}\right| \ge 0.12
Tenue (gris). Lorsque l’accord du premier temps d’une mesure est identique à celui de la case précédente, on compare la force des notes de cet accord entre la moyenne sur environ 0.12 seconde juste avant le temps et le maximum sur environ 0.12 seconde juste après (toutes les notes de l’accord pour le chroma des aigus, la note de basse pour le chroma de basse). Si l’un ou l’autre fait un bond de plus de 1.2 fois, on considère l’accord comme frappé de nouveau et on l’écrit en noir ; sinon, on le considère comme tenu et on l’écrit en gris.
r = \frac{\max_{t \le \tau \le t + 0.12}\ \sum_{k \in \mathcal{C}} c_\tau(k)}{\operatorname{mean}_{t - 0.12 \le \tau < t}\ \sum_{k \in \mathcal{C}} c_\tau(k) + \epsilon} \ge 1.2
Affinage des changements sur temps faible. Si un changement d’accord a été détecté sur un temps faible (temps 2 ou 4) d’une mesure paire, mais que, sur le temps fort qui précède immédiatement, les notes propres à l’ancien accord n’ont pas été frappées de nouveau (rapport ci-dessus inférieur à 1.3) et que le score du nouvel accord sur ce temps fort n’est pas inférieur de 2.5 ou plus à celui de l’ancien, le changement est déplacé sur le temps fort précédent. Dans un accompagnement en accords brisés, la tierce (G♯) de Esus4 → E ne sonnait qu’au temps 4 et le changement était détecté un temps trop tard ; on l’écrit ainsi au temps 3, selon l’usage de la partition. Les frontières sur le premier temps de la mesure et celles où l’ancien accord est frappé de nouveau ou continue de sonner ne sont pas déplacées.
Accord d’un temps sur le premier temps de la mesure (1.11.8). Le HMM final pénalise les changements d’accord à l’intérieur d’une mesure (4.0 pour le deuxième temps), si bien qu’un accord d’un seul temps qui ne sonne que sur le premier temps peut être fusionné avec l’accord des temps suivants, même s’il l’emporte en score sur ce temps. Ainsi, lorsque le même accord $Y$ est écrit à partir du premier temps de la mesure (et qu’il ne s’agit pas d’un accord prolongé depuis la mesure précédente, le deuxième temps portant aussi le même accord), on cherche l’accord $Z$ d’une autre fondamentale qui correspond le mieux au seul premier temps, et l’on écrit $Z$ sur le premier temps si toutes les conditions suivantes sont remplies. $E_b$ est le score d’accord du temps $b$ , $r$ le rapport de force du jugement de tenue ci-dessus (maximum juste après par rapport à la moyenne juste avant le temps), et $\mathcal{C}_Z \setminus \mathcal{C}_Y$ les notes propres à $Z$ .
E_b(Z) - E_b(Y) \ge 3.5,\qquad
E_{b+1}(Y) > E_{b+1}(Z),\qquad
r_b(\mathcal{C}_Z \setminus \mathcal{C}_Y) \ge 1.2,\qquad
r_{b+1}(\mathcal{C}_Y \setminus \mathcal{C}_Z) \ge 1.2,\qquad
\mathrm{bass}(Z) \ne \mathrm{bass}(Y)
Les première et deuxième conditions signifient que $Z$ est meilleur au premier temps et $Y$ au deuxième ; les troisième et quatrième sont la preuve que les deux accords ont réellement été frappés séparément (les notes propres à $Z$ sonnent nouvellement au premier temps, et les notes propres à $Y$ sont frappées de nouveau au deuxième). Avec les seules conditions de score, on modifiait aussi les cas où la résonance de l’accord de la mesure précédente se mêle au nouvel accord et fait passer le premier temps pour un autre accord ; or, vérification faite avec les accords de référence de GuitarSet, ces cas étaient plus fréquents (validation 1.11.8 en 4-6).
Affinage des noms d’accords (1.10.0). Une fois la tonalité fixée, on affine uniquement les noms, sans toucher aux frontières. Si un m7 de la tonalité se prolonge avec sa tierce à la basse (Am7/C, Em7/G, Bm7/D), il s’agit, avec les mêmes notes, d’un accord de sixte sur la basse (C6, G6, D6) ; selon l’usage de la partition, on l’écrit comme l’accord parfait majeur sur la basse (C, G, D). On ne change que si cette note est la plus forte du chroma de basse en somme sur l’intervalle ; si le même m7 est accolé juste avant ou après avec une autre basse (Gm7/B♭ → Gm7), seule la basse a bougé au sein d’un même accord, et on le laisse tel quel. On laisse aussi tels quels les endroits où la basse a pu être mal entendue : si cette note fait moins de la moitié de la basse de l’intervalle et que les cases où elle est la plus forte à chaque temps représentent moins des 3/4 (plusieurs notes mêlées, flou), on ne change pas ; un m7 brièvement intercalé entre deux accords identiques (Em7 – F♯m7/A – Em7) est un accord de passage et n’est pas changé non plus. Un sus4 est écrit comme l’accord parfait de même fondamentale si, dans le chroma des aigus de l’intervalle, la tierce (la plus grande de la majeure et de la mineure) sonne au moins 0.7 fois autant que la quarte. Il s’agit de ne pas lire comme sus4 une quarte mêlée à la mélodie ou à une batterie à hauteur définie. Dans les intervalles connus dont la bonne réponse est sus4 (morceaux synthétiques, références jouées de GuitarSet, enregistrements réels), ce rapport n’a jamais dépassé 0.65.
Affinage des syncopes en fin de mesure (1.10.3). Si un accord détecté comme changeant sur le dernier temps d’une mesure se prolonge avec la même fondamentale jusqu’au premier temps de la mesure suivante, il s’agit souvent d’une syncope anticipée (un coup de grattage une croche en avance) ou d’une note d’approche de la basse. La partition écrivant ce type de changement sur le premier temps suivant, on déplace le changement sur ce premier temps, à moins que sur ce temps le score du nouvel accord ne devance celui de l’ancien de plus de 6.5. Ce seuil a été ajusté en confrontant 11 candidats de 4 enregistrements réels avec des grilles d’accords alignées (6 des 7 déplacements correspondent à la grille, et les 2 qui changeaient réellement sur ce temps ont été laissés tels quels).
Le son est une vibration de la pression de l’air, et la hauteur est la fréquence de cette vibration. Le tempérament égal à 12 demi-tons divise une octave (fréquence ×2) en 12 rapports égaux.
f(m) = 440 \cdot 2^{(m - 69)/12}\ \text{Hz},\qquad
m(f) = 69 + 12\log_2\,\frac{f}{440},\qquad
\text{cent}(f_1, f_2) = 1200\log_2\,\frac{f_1}{f_2}
Le fait que l’octave corresponde à une fréquence doublée justifie de replier les notes en 12 cases (chroma). La note de référence d’un enregistrement s’écarte souvent de 440 Hz, à cause de la vitesse de bande des enregistrements anciens, de l’accordage des instruments ou d’un accordage volontaire. Par exemple, +18 cent donne $440 \cdot 2^{0.18/12} \approx 444.6$ Hz.
La vibration d’une corde ou d’un tuyau produit aussi des composantes (harmoniques) aux multiples entiers $h f_0$ de la fréquence fondamentale $f_0$ . La distance d’une harmonique au son fondamental est de $12\log_2\, h$ demi-tons.
| Harmonique $h$ | Distance en demi-tons | Note tempérée la plus proche | Écart | Poids dans le gabarit |
|---|---|---|---|---|
| 1 | 0 | 0 (même note) | 0 cent | 1 |
| 2 | 12.00 | 12 (octave) | 0 cent | 0.6 |
| 3 | 19.02 | 19 (quinte au-dessus de l’octave) | +2.0 cent | 0.36 |
| 4 | 24.00 | 24 (deux octaves) | 0 cent | 0.216 |
| 5 | 27.86 | 28 (tierce majeure au-dessus de deux octaves) | −13.7 cent | 0.13 |
| 6 | 31.02 | 31 (quinte au-dessus de deux octaves) | +2.0 cent | 0.078 |
| 7 | 33.69 | 34 | −31.2 cent | Non utilisée |
La 7e harmonique s’écarte de 31 cents du tempérament égal et tomberait à tort dans une autre case ; elle a donc été retirée des gabarits. L’effet d’intégrer les harmoniques au modèle est important. Même en ne jouant que l’accord parfait de C majeur (C, E, G), la 3e harmonique de E donne B et celle de G donne D, si bien qu’en ignorant les harmoniques, on croirait voir Cmaj7 ou Cadd9. Dans l’accord parfait mineur Cm, la 5e harmonique de C produit E (tierce majeure), ce qui fait pencher l’accord vers le majeur. Les gabarits doivent contenir ces composantes pour que la comparaison soit équitable.
| Son | Bande principale | Caractéristique physique | Usage dans l’analyse |
|---|---|---|---|
| Grosse caisse | environ 40–100 Hz | Bref grondement grave dont la hauteur descend rapidement | Flux grave → temps, indices de premier temps |
| Basse | environ 41 Hz (E1)–400 Hz | Harmoniques entières, longue tenue | Chroma de basse → renversements (accords barrés) |
| Caisse claire | fût environ 150–250 Hz, bruit du timbre environ 2–10 kHz | Bruit sur une large bande | Montée simultanée des médiums et des aigus → backbeat |
| Charleston | environ 5–15 kHz | Bruit métallique | Flux aigu (poids réduit pour la détection des temps) |
| Piano, guitare, voix | fondamentale environ 80 Hz–1 kHz, harmoniques jusqu’à plusieurs kHz | Harmoniques entières | Chroma des aigus → accords |
La résolution fréquentielle d’une fenêtre de longueur $T$ est d’environ $1/T$ , et la borne inférieure théorique est $\Delta t\,\Delta f \ge 1/(4\pi)$ (égalité pour une fenêtre gaussienne). En revanche, l’écart d’un demi-ton est proportionnel à la fréquence.
\Delta f_\text{semitone}(f) = f\,(2^{1/12} - 1) \approx 0.0595\,f
Pour la note de basse la plus grave, E1 (41.2 Hz), l’écart d’un demi-ton n’est que de 2.45 Hz, si bien que pour les distinguer il faut $T \gtrsim 1/2.45 \approx 0.41$ seconde. À A2 (110 Hz), il est de 6.5 Hz, et à A4 (440 Hz) de 26.2 Hz, ce qui laisse de la marge. On utilise donc une fenêtre distincte pour chaque usage.
| Usage | Fréquence d’échantillonnage | Fenêtre | Longueur de fenêtre | Pas | Espacement des cases |
|---|---|---|---|---|---|
| Rythme (attaques) | 22,050 Hz | 1024 | 46.4 ms | 11.6 ms | 21.5 Hz |
| Aigus (accords) | 11,025 Hz | 2048 | 185.8 ms | 23.2 ms | 5.38 Hz |
| Basse, accordage | 11,025 Hz | 4096 | 371.5 ms | 46.4 ms | 2.69 Hz |
La fenêtre de basse est un peu en deçà de 0.41 seconde, mais comme il n’y a généralement qu’une seule note de basse à la fois, on compense en estimant la position du pic par interpolation parabolique logarithmique, avec une précision bien supérieure à l’espacement des cases.
Avec une fréquence d’échantillonnage $f_s$ , on ne peut pas représenter les composantes au-dessus de $f_s/2$ (fréquence de Nyquist) ; si l’on réduit l’échantillonnage tel quel, les composantes aiguës se replient vers les basses fréquences (repliement, ou aliasing). Le rééchantillonneur fait donc aussi office de filtre passe-bas coupant à 92 % de la nouvelle fréquence de Nyquist. Le signal à 22,050 Hz conserve jusqu’à environ 10.1 kHz et contient la bande de la charleston (2.5–10 kHz) ; le signal à 11,025 Hz conserve jusqu’à environ 5.07 kHz et contient la plage des pics aigus (jusqu’à 4.2 kHz). Les informations nécessaires se trouvant en dessous, on peut réduire le nombre d’échantillons et abaisser fortement la charge de calcul.
| En compressant le spectre par $\ln(1 + \lambda | X | )$ , ce sont les variations relatives plutôt que l’amplitude absolue qui ressortent, si bien qu’un grattage de guitare discret comme une grosse caisse forte sont tous deux détectés comme attaques. |
Voici les phénomènes physiques qu’imite la synthèse de piano du jeu des accords.
| Phénomène | Physique | Dans la synthèse |
|---|---|---|
| Inharmonicité | À cause de la rigidité en flexion de la corde d’acier, plus une harmonique est aiguë, plus elle est au-dessus du multiple entier. $B = \pi^3 E d^4 / (64 T L^2)$ ( $E$ module d’Young, $d$ diamètre, $T$ tension, $L$ longueur) | $f_k = k f_0\sqrt{1 + Bk^2}$, $B$ augmente dans l’aigu |
| Point de frappe | Quand le marteau frappe la corde à environ 1/7 à 1/9 de sa longueur, les harmoniques dont ce point est un nœud (point immobile) ne sonnent presque pas | $\lvert\sin(\pi k x_h)\rvert$ , $x_h = 1/7.5$ |
| Feutre du marteau | Le feutre souple, en contact bref, filtre les composantes très aiguës | $1/(1 + (f_k/f_b)^2)$ |
| Double décroissance | Les cordes d’une même note échangent de l’énergie par le chevalet : le son décroît vite au début puis persiste longtemps | Son immédiat 60 %, son résiduel 40 % |
| Battements | Les cordes d’une même note sont accordées avec de légères différences, autour de 1 cent, et le son ondule lentement | Les harmoniques graves sont synthétisées avec 2 ou 3 cordes, et les cordes d’une même harmonique partent avec la même phase pour se décaler progressivement |
| Décroissance par harmonique | Plus une harmonique est aiguë, plus elle perd vite son énergie, et le son s’assombrit avec le temps | $\tau_k \propto (f_0/f_k)^{0.7}$ |
| Tenue selon le registre | Les cordes graves, longues et lourdes, résonnent longtemps | Son résiduel de la fondamentale de 1.0 à 8.5 secondes |
outputLatency .flowchart LR
subgraph UI["Script UI"]
LD["Chargement<br/>choix du fichier, glisser-déposer, décodage"]
CT["Commandes de correction et de réglage"]
RD["Moteur de rendu<br/>grille d'accords, voyants, forme d'onde"]
PL["Lecteur et ordonnanceur"]
PN["Jeu des accords<br/>disposition des voix, cache de synthèse de piano"]
end
subgraph EN["Script moteur Engine"]
AN["analyze"]
BT["buildTimeline"]
TX["chartText"]
end
LD -->|canaux PCM| AN
AN -->|résultat d’analyse A| BT
CT -->|réglages| BT
BT -->|chronologie TL| RD
BT -->|temps, premiers temps| PL
BT -->|segments d’accords| PN
BT --> TX
PL --> AO["Limiteur, sortie AudioContext"]
PN --> AO
.
├── chordity.html toute l’application : script du moteur + script de l’interface + styles (fichier unique, environ 230 Ko)
├── information.html page d’aide (en coréen) : justification des décisions, principes et formules d’analyse, résultats de vérification (fichier unique)
├── LICENSE conditions d’utilisation
├── README.md
├── README.{en,ja,zh,fr,es}.md traductions du README : English, 日本語, 中文, Français, Español
└── docs/
├── screenshot-desktop.png
├── screenshot-mobile.png
├── notation-name.png
├── notation-camelot.png
└── notation-roman.png
Le premier <script> de chordity.html définit la variable globale Engine (également exportée via module.exports pour un usage sous Node). Ce qui suit est une description destinée au développement et à la validation de ce projet. Extraire le moteur pour l’appeler depuis votre propre programme relève de la modification et de l’utilisation partielle, ce qui n’est pas possible sans l’autorisation de l’auteur original (LICENSE, article 2, point a).
// buf: AudioBuffer (예: AudioContext.decodeAudioData 결과)
const channels = Array.from({ length: buf.numberOfChannels }, (_, c) => buf.getChannelData(c));
// 무거운 단계: 한 번만
const A = await Engine.analyze(
{ channels, sampleRate: buf.sampleRate },
(progress, stage) => console.log(Math.round(progress * 100) + '%', stage ?? '')
);
// 가벼운 단계: 설정이 바뀔 때마다
const TL = Engine.buildTimeline(A, { vocab: 'extended', res: 2, slash: true });
console.log(Engine.chartText(TL, { title: '내 노래' }));
// # 내 노래 | BPM 97.1 | 박자 4/4 | 조성 C 장조
// 1 | C . / . / . / . | G . / . / . / . | ...
// 카멜롯 표기로 내보내기: 조성은 C 장조(8B), 코드는 8B, 9A7 처럼
console.log(Engine.chartText(TL, { title: '내 노래', notation: 'camelot' }));
// 로마 숫자로 내보내기: I, V7/vi, ii65 처럼(자리바꿈 숫자는 이어서 적음)
console.log(Engine.chartText(TL, { title: '내 노래', notation: 'roman' }));
Réglages (Engine.defaultSettings())
| Clé | Valeur | Défaut | Signification |
|---|---|---|---|
ops |
Tableau de 'half', 'x2', 'd2', 'd3' |
[] |
Opérations de correction des temps appliquées dans l’ordre |
meter |
'auto' ou un entier |
'auto' |
Nombre de temps par mesure |
downShift |
Entier | 0 |
Déplacement du premier temps (positif pour retarder) |
vocab |
'basic', 'standard', 'extended' |
'standard' |
Vocabulaire d’accords |
res |
1 ou 2 |
1 |
Unité de changement d’accord (1 temps, ½ temps) |
slash |
Vrai, faux | true |
Notation de la basse (renversements) |
Principaux champs du résultat d’analyse A
| Champ | Contenu |
|---|---|
duration, sampleRate |
Durée de l’original (secondes), fréquence d’échantillonnage de l’original |
fl, fm, fh, rms, O |
Flux graves, médiums et aigus, volume, enveloppe d’attaques (en trames rythmiques) |
nov, S, drum |
Changement harmonique, accentuation des temps, courbes de grosse caisse et de caisse claire |
audible, startT, endT |
Passages sonores |
harm |
tuning (demi-tons), chromas treble et bass avec leurs pas respectifs |
tempo |
bpm, tau, candidats principaux cands |
beats |
Instants des temps automatiques (secondes) |
phase, level |
Valeurs de décision et justifications de la vérification de phase et de la vérification du niveau métrique |
level43 |
Vérification du niveau métrique 4:3·3:2 : triple (le temps semblait-il divisé en trois), applied, si divisé en trois curBpm et les valeurs de décision par candidat alts, si changé ratio (4/3 = plus lent, 2/3 = plus rapide), toBpm, flip (décalage d’un demi-temps) |
elapsed |
Durée de l’analyse (secondes) |
Principaux champs de la chronologie TL
| Champ | Contenu |
|---|---|
empty |
La grille n’a-t-elle pas pu être construite faute de temps suffisants |
beats, pos, barOfBeat |
Instants des temps, position dans la mesure (0 = premier temps), mesure à laquelle appartient le temps |
bars[] |
num, pickup, t0, t1, startBeat, nBeats, events[] |
events[] |
off, dur (en temps), tied, pcs (notes constitutives, 0 = C), bassPc (basse à jouer), label (root, base, ext, bass, text, ascii, nc, cam : Camelot code·ext·text·ascii, rn : chiffres romains acc·num·qual·fig·sus·sec·text·ascii) |
bpm |
Tempo calculé à partir de la médiane des intervalles entre temps |
meter |
m, triple, label (ex. : 4/4, 12/8), contrast, alt |
key |
Première tonalité : tonic, mode, score, name (ex. : E♭ 장조) |
keys[] |
Sections tonales : name, cam (code Camelot), tonic, mode, startBeat, barNum (numéro de mesure), beat (numéro du temps), t0 (secondes) |
| Horloge | Référence | Usage |
|---|---|---|
| Temps échantillon | Numéro d’échantillon du tampon décodé ÷ fréquence d’échantillonnage | Analyse, tous les instants de temps (secondes) |
| Horloge audio | AudioContext.currentTime |
Lecture de la musique et programmation des clics |
| Horloge d’affichage | requestAnimationFrame |
Cadre de l’accord actuel et agrandissement du nom, voyants, affichage de la position de lecture |
Les instants des temps sont calculés en temps échantillon, puis transposés sur l’horloge audio par la formule (15) de 4-1. Comme le tampon de lecture et le signal d’analyse proviennent du même résultat de décodage et que la latence du rééchantillonneur est nulle, il n’y a aucun décalage entre les deux axes temporels.
Cadre de l’accord actuel et agrandissement du nom (1.10.1). À chaque image de l’horloge d’affichage, on retrouve l’accord dans la mesure à partir du temps contenant la position de lecture et de la position dans ce temps (rapport à la durée du temps). Pendant la lecture, on soustrait la latence de sortie à la position, sans aller en deçà de l’endroit où la lecture a commencé, afin que l’accord précédent n’apparaisse pas brièvement juste après un déplacement. L’unité d’accord est un accord nouvellement frappé (en noir, ou N.C.) suivi des accords gris tenus après lui, et elle peut se prolonger au-delà de la mesure. L’écran n’est mis à jour que lorsque l’unité change. Le premier nom grossit en 0.1 seconde (transition CSS ; au départ, il rétrécit en 0.7 seconde), avec un facteur qui ne dépasse pas 1.3 (1.15 pour les mesures sur deux lignes) et qui reste inférieur à l’espace disponible jusqu’au nom suivant ÷ largeur du nom, si bien que le nom agrandi ne touche pas ses voisins. L’axe d’agrandissement est le côté gauche du nom (la position du temps reste inchangée), à 45 % de la hauteur pour une mesure sur une ligne (entre la pastille de la ligne supérieure et la barre oblique qui s’allonge pendant la lecture), et au bord supérieur pour une mesure sur deux lignes. Il y a un cadre surligné par ligne de la grille : sur chaque ligne couverte par l’unité, il s’étend de 7px avant le premier nom (ou du bord gauche de la ligne si l’unité se poursuit depuis la ligne précédente) jusqu’à 2px avant le nom de l’accord suivant (juste avant la barre de mesure en fin de mesure, avant la double barre en fin de morceau, et jusqu’au bord droit de la ligne si l’unité se poursuit sur la ligne suivante). Les deux extrémités $x$ du cadre rejoignent chacune leur cible $x^\ast$ selon un oscillateur amorti $\ddot x = \omega^2 (x^\ast - x) - 2\zeta\omega\dot x$ . L’extrémité qui avance, avec $\omega = 24\ \mathrm{rad/s},\ \zeta = 0.42$ , dépasse la cible d’environ 23 % avant de revenir ; l’extrémité opposée, avec $\omega = 16\ \mathrm{rad/s},\ \zeta = 1$ (amortissement critique), suit sans dépasser et s’arrête au bout d’environ 0.6 seconde. Comme l’extrémité qui suit ne dépasse pas, les deux extrémités ne se croisent pas même lors d’un passage à un accord court. Sur une nouvelle ligne, le cadre jaillit au début de l’accord ; sur la ligne que l’unité quitte, le cadre se rétracte dans le sens de l’avancée en pâlissant, puis disparaît quand ses deux extrémités se rejoignent. Après la fin du morceau, il se rétracte vers l’avant. Juste après un nouveau tracé de la grille (changement de notation ou de largeur d’écran) et avec le réglage de réduction des animations, le cadre et le nom se placent immédiatement. À l’intérieur du cadre, le remplissage de progression (orange) va du bord gauche du morceau de cadre jusqu’à la position de lecture. La coordonnée x de la position de lecture est obtenue en interpolant les positions des temps de la mesure (positions des barres obliques) selon la position dans le temps (rapport à la durée du temps) (1.10.2) ; si l’unité se poursuit depuis la ligne précédente, le morceau de la ligne précédente est rempli jusqu’au bout. Le remplissage est dessiné dans les coordonnées du cadre, de sorte que son bord reste sur la position de lecture même pendant le mouvement à ressort du cadre. La couleur du cadre est #ffed85 en thème clair et #4b4219 en thème sombre, celle du remplissage #ffc061 en thème clair et #5e3110 en thème sombre ; le gris des accords gris et de N.C. (#4e5662 en clair, #aab1bb en sombre) reste lisible avec un contraste d’au moins 4.5:1 partout, sur le remplissage, sur le cadre comme sur le fond de la grille. Ainsi, la couleur du texte ne change pas pendant le mouvement du cadre ni dans les mesures sur deux lignes où le nom est plus long que le cadre.
flowchart LR
M["Tampon de la musique"] --> GM["Volume de la musique"]
C["Tampon du clic"] --> GC["Volume du clic"]
P["Notes de piano<br/>vélocité et position stéréo par note"] --> PB["Bus piano"]
PB --> MK["Gain de compensation +6.4 dB"]
PB --> RV["Réverbération de salle 1.6 s"] --> W["Dosage de réverbération 0.22"] --> MK
MK --> GP["Volume des accords"]
GM --> L["Limiteur −1 dBFS"]
GC --> L
GP --> L
L --> O["Sortie"]
L’activation du métronome, l’accentuation du premier temps, le mode d’affichage des noms d’accords (noms de notes, Camelot, chiffres romains), l’activation du jeu des accords et le moment où ils sont joués, les volumes de la musique, du clic et des accords, le calage du clic, le défilement automatique, le thème, le vocabulaire d’accords, la résolution et la notation de basse sont enregistrés dans chordity-prefs-v1 de localStorage (les valeurs enregistrées sous un ancien nom sont reprises). Dans un environnement où l’enregistrement est impossible, l’application fonctionne normalement.
Voici les problèmes rencontrés pendant le développement et leurs solutions. Les chiffres ont été vérifiés par les tests de non-régression sur les morceaux synthétiques et par les tests dans un vrai navigateur (4-6).
| Problème | Cause | Solution | Résultat |
|---|---|---|---|
| Un morceau lent est détecté au double du tempo, avec un clic à chaque croche | Arpèges serrés en croches et distribution a priori favorisant 110 BPM | Correction de moitié par un test d’asymétrie pair/impair de la couche batterie | Ballade à 68 BPM : 133 → 67.1 BPM |
| Un morceau rapide est détecté à la moitié du tempo | Seule la grosse caisse est reconnue comme temps | Correction au double par un test d’alternance grosse caisse sur le temps / caisse claire entre les temps | Funk à 176 BPM : 88 → 176 BPM |
| Risque de casser un morceau de piano au bon tempo en le divisant par deux | La basse de la main gauche n’étant qu’aux temps 1 et 3, le pair/impair est asymétrique | Correction de moitié seulement à partir de 110 BPM | Piano à 72 BPM conservé |
| Une vraie ballade est détectée au double du tempo et les accords changent tous les demi-temps (「세월이 가면」 (Sewori gamyeon) : 135 contre 68 BPM) | Le charleston et le clavier remplissent les contretemps, le rapport d’intensité pair/impair (1.59) n’atteint pas le seuil de 2.4 | Ajout d’une condition vérifiant si grosse caisse et caisse claire se concentrent du même côté (au bon tempo, elles sont de côtés opposés à cause du backbeat) | Corrigé à 68.1 BPM, jugements sur les morceaux synthétiques tous inchangés |
| Fausses mesures à 3 ou 2 temps après la correction de moitié | Le suivi en croches avait glissé d’une case lors d’un fill, et en ne gardant qu’un beat sur deux, toute la suite était affectée | Au lieu de filtrer, nouveau suivi avec la nouvelle période de temps | Mesures irrégulières 5 → 1 |
| Dans les morceaux lents, les temps vacillent, attirés par les syncopes et les fills | La pénalité d’intervalle (fixe, 100) étant relative (en pourcentage), des écarts de plus de 100 ms restaient bon marché dans les morceaux lents | Comparaison avec la courbe de tempo locale et pénalité en temps absolu (α = 2000·T²) | RMS du résidu linéaire par section 96~222 → 6~23 ms, morceau de test en ritardando 80/80 |
| Un rock rapide est détecté à la moitié du tempo, et en plus avec les temps posés sur la caisse claire (temps 2 et 4), si bien que les accords se mélangent par demi-temps (un morceau à 178 BPM donné à 89 BPM) | Les croches de la basse remplissent les graves et la grosse caisse ressort faiblement ; le score de tempo est proche pour les deux niveaux | Doublement (type contretemps) d’après la forme caisse claire sur le temps / grosse caisse entre les temps et la force du candidat au double tempo | 177.9 BPM, F du premier temps 0 → 0.95, fondamentale des accords 62 % → 86 % |
| Un morceau rapide au feeling half-time est détecté à la moitié du tempo (un morceau à 170 BPM donné à 85 BPM) | Le temps lent tombe sur la grosse caisse et la caisse claire arrive aussi entre les temps | Doublement de type half-time. Exclusion des morceaux de piano sans batterie, qui n’ont presque pas de frappes graves entre les temps | 170.1 BPM, morceau de piano synthétique inchangé |
| Les morceaux à 110~130 BPM sont divisés par deux | Jugement que les croches ont été prises pour des temps sur la seule base de la différence d’intensité pair/impair | Vérification des graves entre les temps (qui doivent être en position de double croche) et du backbeat | 8 morceaux pop GTZAN corrigés, 「세월이 가면」 toujours à 68 BPM |
| Des morceaux en 4/4 sont notés en 7/4, 5/4 ou 3/4 | Dans des morceaux d’une trentaine de secondes, seules quelques rares traces fortes de premier temps sont retenues, ce qui gonfle le contraste | Vérification de l’autocorrélation de l’indice de premier temps ; si le backbeat de batterie est net, seulement des mesures paires | Morceaux notés en mesure impaire sur GTZAN 221 → 104 |
| Sur un riff syncopé, la mesure est décalée d’un temps et de fausses mesures à 5 ou 3 temps s’intercalent | L’indice de premier temps suit les accords qui changent une croche en avance | A priori pair/impair de la batterie (grosse caisse aux temps 1 et 3, caisse claire aux temps 2 et 4) | Mesures irrégulières 9 → 3 (「고민중독」), F du premier temps sur la pop GTZAN 0.557 → 0.608 |
| La conclusion d’un morceau est notée comme passant en 3/4 | Les accords changent un temps en avance et ressemblent à un intervalle de 3 temps | Probabilité de changement de mesure $10^{-6}$ → $10^{-7}$ | 4/4 conservé, les 4 morceaux synthétiques à changement de mesure inchangés |
| Beaucoup de m7 avec la tierce à la basse, comme Am7/C ou Em7/G | Les accords de sixte composés des mêmes notes (C6, G6) sont lus comme des renversements de m7 | Si la basse est la note la plus forte, accord de trois sons au-dessus de la basse | Sur GuitarSet, 12 des 13 changements correspondent à la vérité de jeu |
| Une modulation vers le mineur relatif apparaît au milieu d’un morceau majeur (G majeur → E mineur) | Seule la section riche en cadences sur vi (Em) et en progressions B7 → Em est jugée séparément comme mineure | Fusion des sections voisines partagées entre majeur et mineur relatifs et nouveau jugement ; mineur seulement s’il domine nettement | 「고민중독」 G majeur → A♭ majeur (comme la vérité), tonalités de tous les autres morceaux de test inchangées |
| Noté sus4 alors que la tierce sonne | Quarte mêlée venant de la mélodie ou d’une batterie à hauteur (partiels de la caisse claire) | Accord de trois sons si la tierce vaut au moins 0.7 fois la quarte | 「고민중독」 erreurs sus 10 % → 2 % |
| Le jugement entre deux niveaux est partagé sur les morceaux au skank marqué comme le reggae | L’interprétation au double tempo est aussi d’usage musicalement | Pas de forçage automatique, ÷2 est proposé | Non-résolution volontaire |
| Les beats sont marqués 6~8 ms trop tôt | La fenêtre de 46 ms englobe l’attaque à l’avance et le pic de flux arrive plus tôt | Constante de correction de 6.5 ms | Erreur moyenne 0 ± 2 ms |
| 61 % des accords de septième reconnus comme accords de trois sons | Pénalité a priori des accords de septième excessive | Réajustement de $\beta$, $\gamma$ et de la pénalité par recherche sur grille | Septièmes manquées 0, accords de trois sons pris pour des septièmes 0 |
| Même un morceau qui module n’affiche qu’une seule tonalité, et les accords après la modulation sont écrits dans la notation de l’ancienne tonalité (A♭m7 dans une section en E majeur, etc.) | Tonalité estimée une seule fois pour tout le morceau | Découpage en sections par un HMM de tonalité au niveau de l’armure, avec notation ♯/♭ et bonus de tonalité appliqués séparément par section | 「세월이 가면」 en E majeur à partir du temps 1 de la mesure 45, notation G♯m7 et C♯7 ensuite |
| Une progression nettement en la mineur (Am … E7) est jugée en E mineur | La tonalité n’était fixée que par la corrélation entre distribution des notes et profils de tonalité, sans pénaliser assez les notes hors tonalité (F) | Nouvelle détermination de la tonalité de section à partir des accords reconnus (adéquation à la gamme, durée de l’accord de tonique, V → I, premier et dernier accords), mélangée à la corrélation de distribution des notes | Jugé en A mineur, chiffres romains i v6 VI III6 … |
| Une courte section penche vers le mineur relatif (E majeur → C♯ mineur) | Si la section finit sur vi et contient V/vi → vi, les indices d’accords penchent vers le mineur | Ajout comme indice de la proportion d’accords de tonique au premier temps des phrases de 4 mesures, poids de la distribution des notes fixé par un test sur 18 morceaux | Les 18 morceaux à tonalité claire sont tous justes |
| Quand le tempo change fortement au milieu d’un morceau, les temps de la seconde partie sont perdus et même la mesure est fausse | Le tempo local n’était cherché qu’à ±15 % du tempo global | Recherche des sauts par un Viterbi sur les états de tempo ; sans saut, la courbe précédente est utilisée telle quelle | Beats 64→93/96, contretemps 16→1 |
| Le bebop est pris à une fois par mesure (65 BPM) | La forte répétition à l’échelle de la mesure fait choisir le niveau lent, et la règle de doublement ne regarde que la caisse claire en backbeat | Candidats de tempo jusqu’à 300 BPM, montée d’un niveau à la fois d’après les graves entre les temps (walking bass) | 260 BPM, beats 96/96 |
| Avec C à la basse, Cm7 est écrit E♭ ou E♭maj7 | Pour un même contenu de notes (Cm7 = E♭6), seule la basse permet de distinguer la fondamentale, et son poids est faible | Essai d’augmentation du poids de la basse, annulé car les notes de passage créaient ailleurs des erreurs comme C♯maj7/C | Non résolu, consigné dans les limites |
| Fausse anacrouse avant le début de la musique | Le chemin DP se prolonge dans le silence et le lissage par voisins du nettoyage des bords le conserve | Suppression des beats hors de la zone sonore ±¼ de temps, puis extrapolation | Supprimée |
| Le plancher de bruit est jugé comme du son | Critère de zone sonore trop lâche | −40 dB → −38 dB | Supprimé |
| Risque qu’une grosse caisse à hauteur soit prise pour une note de basse | Le boom grave de la grosse caisse s’accumule à chaque temps dans le chroma de basse | Soustraction de la moitié de la médiane du morceau entier | Composante permanente supprimée |
| 4 faux beats sur un fichier silencieux | Le chemin d’origine était conservé même sans zone sonore | Pas de beats sans zone sonore | Ligne de temps vide et message d’information |
| Clic avant le début du morceau après un décalage d’½ temps | Le calcul des points milieux ajoutait un temps au tout début | Les temps avant la zone sonore sont supprimés | Supprimé |
| Mesure d’un seul temps dans la réverbération de fin | L’extrapolation ne vérifiait que la borne de fin | Prolongation seulement s’il reste au moins un demi-temps de son après le nouveau temps | Supprimée |
| Risque de fort ralentissement si l’on change d’onglet pendant l’analyse | Dans un onglet en arrière-plan, setTimeout peut être retardé jusqu’à la seconde |
Cession du contrôle via MessageChannel, non soumis à la limitation des minuteurs |
Aucun effet des retards de minuteur |
| En maintenant la touche →, on ne passe pas à la mesure suivante | Pendant la programmation de la lecture (60 ms), la position est lue avant le point de saut | Position fixée au point de saut avant la programmation | 5 appuis consécutifs → exactement 5 mesures |
| Les icônes lecture et pause ne changent pas | Les éléments SVG n’ont pas de propriété .hidden |
Bascule directe de l’attribut hidden |
Normal |
| Le curseur de calage du clic est écrasé en un point | Le CSS des cases à cocher s’appliquait aussi aux entrées de plage | Sélecteur limité aux cases à cocher | Normal |
| Sur téléphone, la barre de lecture fixe grandit à quatre lignes | Le bouton du métronome et les volumes étaient tous fixés, avec retours à la ligne | Métronome en bouton icône, volumes hors de la zone fixe | Deux lignes (ligne de lecture et forme d’onde), hauteur 125 px |
| Risque de décalage entre les axes temporels de l’analyse et de la lecture | Latence du rééchantillonneur du navigateur et d’un décodage séparé | Rééchantillonnage direct du tampon de lecture, avec latence nulle | Décalage 0 (test d’impulsion 1.00000 s) |
| Le piano sonne 18 cents plus bas que l’enregistrement | Piano synthétisé avec A4 = 440 Hz | Synthèse au diapason estimé par l’analyse, cache reconstruit si le diapason change | Les 11 notes à +17.7~+18.3 cents (valeur juste +18) |
| Risque d’écrêtage numérique quand musique, clic et accords se superposent | La somme des trois sons peut dépasser 0 dBFS | Limiteur juste avant la sortie (−1 dBFS, 20:1, attaque 1 ms) | Même latence pour les trois, l’alignement est conservé, résultats des tests du clic inchangés |
| Le son du jeu des accords est trop faible | L’attaque du piano est 15~20 dB plus forte que le corps du son, si bien qu’un volume calé sur le pic paraît faible à l’oreille (RMS de la première seconde −28 dBFS au volume par défaut) | Gain de compensation fixe sur la voie piano, et phases initiales aléatoires par harmonique pour réduire le premier pic | Valeur finale fixée à la ligne suivante |
| Un gain de compensation de +11.4 dB est trop fort | Le point optimal se trouve entre une valeur trop faible (−28 dBFS) et une valeur trop forte (−18 dBFS) | Dichotomie au milieu en dB des deux valeurs : gain de compensation +6.4 dB | Environ 1.8~2.1 fois plus qu’avant (+5.1~+6.5 dB). Même au volume maximal, le pic du piano est autour de −3 dBFS, donc le limiteur n’écrase pas la musique |
| La résonance du jeu des accords est courte | Forte proportion de son immédiat, qui décroît vite juste après la frappe | Son immédiat 72 → 60 %, rapport de temps de décroissance du son immédiat 0.12 → 0.15, temps de décroissance du son résiduel ×1.13, durée des notes +0.8 s | Queue à 1–2 s +2.7~+3.0 dB, temps de décroissance de 10 dB ×1.3~1.8 |
| Monter le volume par un compresseur allonge la résonance d’environ 3 fois | Un compresseur à relâchement lent remonte aussi la queue, et un limiteur rapide ne saisit pas les pics des premières ms | Compresseur retiré, réglage par les paramètres de synthèse et un gain fixe | Allongement seulement de la valeur visée (+3 dB) |
| Des phases aléatoires par corde allongent exagérément la résonance | La double décroissance vient de cordes parties en phase qui se désaccordent peu à peu, et cela la brisait | Phase différente par harmonique, même phase pour les cordes d’un même harmonique | Variation de queue due au seul changement de phase +5.9 → +0.6 dB |
| Élément | Méthode | Effet |
|---|---|---|
| Séparation des étapes | Traitement du signal lourd une seule fois, inférence de la mesure et des accords à chaque réglage | Prise en compte d’une correction en environ 40 ms (morceau de 5 minutes) |
| FFT réelle | Une FFT complexe sur $N/2$ points + post-traitement, facteurs de rotation et table d’inversion de bits précalculés | Calcul de FFT réduit d’environ moitié |
| Pas de stockage du spectrogramme | Flux rythmique calculé au fil de l’eau dans un tampon circulaire de 3 trames, pour l’harmonie seuls les pics principaux de chaque trame sont gardés | Pour un morceau de 4 minutes, environ 4 MB de pics au lieu de trois spectrogrammes complets (rythme, aigus, basse, environ 85 MB chacun, soit environ 254 MB au total) |
| Rééchantillonneur polyphase | Noyau précalculé en table de phases, accumulateur entier, chemin rapide sans test de bornes | Environ 48 multiplications par échantillon de sortie (48 kHz → 22.05 kHz) |
| Sommes cumulées | Moyennes par intervalle de la normalisation du volume et du test de contraste des pics calculées par sommes cumulées | Temps linéaire indépendant de la longueur de fenêtre |
| Viterbi en O(T·K) | Exploitation de la structure « rester, ou passer depuis le maximum », retour arrière en Int16Array |
Avec le vocabulaire étendu (K = 289), 289 fois moins d’opérations qu’en O(T·K²) |
| Multitâche coopératif | Cession via MessageChannel toutes les 32 ms |
Fichier unique conservé sans worker, pas de gel de l’interface |
| Mises à jour d’écran minimales | DOM modifié seulement quand la mesure, le temps ou l’accord change. La forme d’onde est dessinée une fois sur deux canevas, rognés par largeur CSS pour afficher la progression | Pas de redessin du canevas à chaque image |
| Son du clic | Créé d’avance en tampon et réutilisé, annulation groupée via la liste des programmations | Pas de graphe d’oscillateur créé à chaque clic |
| Tableaux typés | Float32Array, Float64Array, Int16Array, Int32Array, Uint8Array |
Contiguïté mémoire, optimisation JIT |
| Synthèse du piano | Sinus générés par récurrence de rotation (sans appel à Math.sin), calcul ignoré sous −100 dB, chaque note synthétisée une seule fois puis mise en cache, synthèse anticipée dans l’ordre d’apparition dans le morceau |
0 tâche de plus de 50 ms sur le fil principal pendant la lecture |
| Mémoire des notes de piano | Seules les notes utilisées par le morceau (15 dans le morceau de test), en mono de 2.6~5.6 s | Environ 13 MB |
Il y a aussi une raison de ne pas utiliser de Web Worker. Un worker exige un fichier de script séparé ou une URL blob:, ce qui pose des contraintes pour la distribution en fichier unique et dans les environnements à politique de sécurité du contenu stricte. La seule cession par tranches de 32 ms suffit à garder l’indicateur de progression fluide même pendant l’analyse d’un morceau de 5 minutes.
| Élément | Méthode | Résultat |
|---|---|---|
| FFT réelle | Comparaison avec une DFT calculée directement sur un signal aléatoire de 256 points | Erreur maximale 3.8×10⁻¹³ |
| Précision du rééchantillonneur | Sinus de 1 kHz à 48 kHz → 22,050 Hz, comparé à un sinus idéal | Erreur RMS 7.7×10⁻⁶ |
| Latence du rééchantillonneur | Conversion d’une impulsion placée à 1.0 s, puis vérification de la position du pic | 1.00000 s (latence 0) |
| Fréquence d’échantillonnage | Entrées à 22.05, 44.1 et 96 kHz | Beats justes à 100 %, erreur moyenne inférieure à 0.3 ms |
| Entrées particulières | Clips silencieux de 5 s, 1.5 s et 0.2 s | Ligne de temps vide, sans erreur |
Les tests portent sur 18 morceaux synthétiques dont on connaît la vérité (beats, premiers temps, accords). Ils contiennent grosse caisse, caisse claire, charleston, une basse et un clavier avec harmoniques, une mélodie comportant 20 % de notes étrangères, et un plancher de bruit ; certains ont un diapason décalé de 18 cents ou un tempo qui varie de ±2 %. Un beat est juste s’il tombe à moins de 70 ms, et l’erreur vaut instant détecté − instant vrai. Un accord n’est compté juste que si la fondamentale, la qualité et la basse sont toutes correctes au milieu du temps.
| Morceau | BPM (vérité) | Beats justes | Contretemps | Erreur moyenne / erreur absolue moyenne | Mesure | Premier temps | Accords |
|---|---|---|---|---|---|---|---|
| Pop, charleston fort sur les contretemps, +18 cents | 97.1 (97) | 96/96 | 0 | 0.1 / 1.5 ms | 4/4 | 24/24 | 100% |
| Pop | 128.1 (128) | 96/96 | 0 | 0.5 / 1.7 ms | 4/4 | 24/24 | 100% |
| Valse | 150.2 (150) | 48/48 | 0 | 0.5 / 1.8 ms | 3/4 | 16/16 | 100% |
| Ballade en triolets | 58.0 (58) | 48/48 | 0 | −1.4 / 2.0 ms | 12/8 | 12/12 | 100% |
| Ballade en arpèges de croches, tempo fluctuant | 67.1 (68) | 64/64 | 0 | −1.0 / 1.9 ms | 4/4 | 16/16 | 98.4% |
| Rock à caisse claire faible | 118.0 (118) | 96/96 | 0 | 0.0 / 1.6 ms | 4/4 | 24/24 | 100% |
| Dance (4-on-the-floor, charleston ouvert sur les contretemps) | 123.9 (124) | 96/96 | 0 | −0.4 / 1.5 ms | 4/4 | 24/24 | 100% |
| Hip-hop (charleston en doubles croches, grosse caisse syncopée) | 87.9 (88) | 64/64 | 0 | 0.7 / 2.0 ms | 4/4 | 16/16 | 100% |
| Funk | 176.2 (176) | 96/96 | 0 | 0.4 / 1.7 ms | 4/4 | 24/24 | 100% |
| Piano solo | 72.0 (72) | 64/64 | 0 | −3.2 / 3.2 ms | 4/4 | 16/16 | 98.4% |
| Piano solo, mesure à 3 temps | 84.0 (84) | 48/48 | 0 | −2.6 / 2.7 ms | 3/4 | 16/16 | 100% |
| Ballade, ralentissement de 15 % en seconde partie (ritardando) | 71.6 (72→63) | 80/80 | 0 | −0.8 / 2.0 ms | 4/4 | 20/20 | 88.8% |
| Modulation C → D (via A7) | 110.2 (110) | 116/116 | 0 | 0.0 / 1.5 ms | 4/4 | 29/29 | 100% |
| Modulation E♭ → E (via B7, ballade) | 70.0 (70) | 116/116 | 0 | −1.1 / 2.0 ms | 4/4 | 29/29 | 93.1% |
| Modulation G → A♭ (directe) | 100.0 (100) | 112/112 | 0 | 0.0 / 1.4 ms | 4/4 | 28/28 | 100% |
| Couplet en A mineur → refrain en C majeur (pas une modulation) | 96.0 (96) | 64/64 | 0 | −0.2 / 1.5 ms | 4/4 | 16/16 | 100% |
| Intro batterie seule + anacrouse | 104.0 (104) | 57/57 | 0 | −0.7 / 2.3 ms | 4/4 | 14/14 | 100%, N.C. 9/9 |
| Reggae one drop | 151.7 (76) | 48/48 | 47 | −3.8 / 3.8 ms | 4/4 | niveau double | 100% |
Le reggae est détecté au niveau double, si bien que les autres beats tombent tous sur des positions de croche. C’est la non-résolution volontaire mentionnée plus haut, et un seul ÷2 donne 76 BPM. Les erreurs d’accords sont, d’une part, un endroit où Esus4 → E change au milieu de la mesure et où E est détecté un temps trop tard, et d’autre part deux morceaux en arpèges de type ballade (ritardando, E♭ → E) où la septième, faible dans l’arpège, a fait lire maj7 et m7 comme des accords de trois sons (le résultat est le même que l’on active ou non le tempo local ou le suivi des modulations, donc cela n’a rien à voir avec le suivi des temps ni de la tonalité).
Les 14 morceaux synthétiques sans modulation sont tous sortis avec une seule tonalité (0 fausse modulation). La position vraie d’une modulation est la mesure où commence l’accord de tonique de la nouvelle tonalité.
| Morceau | Vérité | Résultat |
|---|---|---|
| C majeur → D majeur, via A7 | D majeur à partir de la mesure 18 | Mesure 18, temps 1, erreur 0 temps |
| E♭ majeur → E majeur, via B7 (ballade) | E majeur à partir de la mesure 18 | Mesure 18, temps 1, erreur 0 temps |
| G majeur → A♭ majeur, directement sans transition | A♭ majeur à partir de la mesure 17 | Mesure 17, temps 1, erreur 0 temps |
| Couplet en A mineur → refrain en C majeur | Pas de modulation (même armure) | Pas de modulation |
| Morceau commençant par une anacrouse | Position de la tonalité de départ | Mesure 0, temps 4 (le temps réel dans l’anacrouse) |
La notation après la modulation a aussi été vérifiée : la section en D majeur est écrite F♯m, la section en E majeur G♯m7 et C♯m, la section en A♭ majeur D♭ et B♭m7.
| Élément | Résultat |
|---|---|
| Numéros des 24 tonalités comparés à la table de la roue Camelot standard | 24/24 concordants |
| Conversion par type d’accord | C → 8B, Am → 8A, G7 → 9B7, Dm7 → 7A7, Cmaj7 → 8Bmaj7, Esus4 → 12Bsus4, Bdim → 10Adim, Bm7♭5 → 10A7♭5, Bdim7 → 10Adim7, G/B → 9B |
| Changement de notation sur un vrai enregistrement (「세월이 가면」 (Sewori gamyeon)) | Tonalité E♭ majeur (5B) → E majeur (12B), étiquette de modulation « 12B로 » (avec la particule coréenne 로, « vers »). La grille, l’accord actuel et suivant, la grille texte et les noms pour lecteur d’écran passent tous en Camelot, et reviennent si l’on choisit les noms de notes |
| Résultats d’analyse | Changer de notation laisse inchangés temps, premiers temps et jugements d’accords (résultats identiques sur les 18 morceaux synthétiques) |
Des sources synthétiques aux accords nets ont été analysées pour vérifier que les chiffres romains des accords reconnus correspondent à la notation des manuels d’harmonie.
| Tonalité | Accords | Résultat |
|---|---|---|
| A mineur | Am, Em/G, F, C/E, Dm, G, C, E7 | i, v6, VI, III6, iv, V/III, III, V7 |
| C majeur (dominantes secondaires, accords d’emprunt) | C, E7, Am, D7, G7, C, A7, Dm, G7, C, Fm, C, B♭, C | I, V7/vi, vi, V7/V, V7, I, V7/ii, ii, V7, I, iv, I, ♭VII, I |
| E♭ majeur (ii secondaire, renversements) | E♭, B♭/D, Cm, B♭m7, E♭7, A♭maj7, B♭7/A♭, Gm7, Cm7, Fm7, B♭7, E♭ | I, V6, vi, ii7/IV, V7/IV, IVM7, V⁴₂, iii7, vi7, ii7, V7, I |
Sur les 105 accords du vrai enregistrement (「세월이 가면」), 10 ont été écrits comme accords secondaires (ii7/IV, V7/IV, V7/ii, etc.) et 16 comme renversements, et le B7 juste avant la modulation a été écrit V7 de la nouvelle tonalité, E majeur. Pour les 18 morceaux synthétiques à tonalité claire, la méthode actuelle, qui mélange accords et distribution des notes, a trouvé la bonne tonalité pour les 18 (l’ancienne méthode, fondée sur la seule distribution des notes, choisissait E mineur pour la progression en la mineur et n’en trouvait que 17).
Le test a porté sur un enregistrement commercial (기현 (Gihyeon), 「세월이 가면」, bande originale de Reply 1988, 3 min 50 s). Faute de marques de temps de référence, et comme il s’agit d’un enregistrement de studio à tempo constant, le résidu de l’ajustement linéaire des beats par section a servi d’indicateur indirect de l’erreur de suivi.
| Élément | Avant | Maintenant |
|---|---|---|
| Niveau du temps | 135 BPM (croches prises pour des temps) | 68.1 BPM |
| Grille de la section 36~40 s | A♭maj7 / Gm7 B♭/F │ Fsus4 / B♭ / (change tous les demi-temps) | A♭maj7 / / B♭/F │ Gm7 / E♭ / |
| Mesures de longueur différente | 3 (3 temps, 2 temps, 3 temps) + fin | 1 + fin |
| RMS du résidu linéaire par section | 96~222 ms (pénalité fixe 100, au bon tempo) | 6~23 ms |
| Intervalles du clic dans la section 33~48 s (navigateur) | 0.80~1.02 s | 0.86~0.90 s |
| Modulation | Non affichée, notation en E♭ même après la modulation (A♭m7, etc.) | E majeur à partir du temps 1 de la mesure 45 (2:37) (position du E dans B♭7 → B7 → E), puis notation G♯m7 et C♯7 |
La page a été réellement manipulée dans Chromium sans interface. En interceptant AudioBufferSourceNode.prototype.start, tous les clics programmés ont été enregistrés, puis, à partir des informations du dernier démarrage de la musique, leur instant dans le morceau ( $o_s + t^\text{click} - t_s$ ) a été reconstitué et comparé aux beats de référence. L’exécution mélangeait lecture, sauts de mesure et arrêts.
| Fichier | Clics | Sur le temps | Contretemps | Erreur moyenne / maximale | Position de l’accent du premier temps |
|---|---|---|---|---|---|
| Pop 97 BPM | 37 | 37 | 0 | 0.1 / 8.1 ms | 22/22 vrais premiers temps |
| Anacrouse 104 BPM | 29 | 29 | 0 | 1.9 / 9.7 ms | 16/16 |
| Ballade 68 BPM (correction de moitié automatique) | 22 | 22 | 0 | 1.9 / 8.5 ms | 13/13 |
| Correction effectuée | Résultat |
|---|---|
| Décaler d’½ temps (« ½박 옮기기 ») | Les clics 4/4 passent au point milieu des temps de référence ; un appui de plus les ramène sur le temps 5/5 |
| ×2, puis ÷2 | Intervalle 310 ms (temps + points milieux) → retour sur le temps à 622 ms |
| Retarder d’un temps (« 한 박 늦추기 ») | L’accent du premier temps passe au 2ᵉ temps |
| Calage du clic (« 클릭 타이밍 ») +30 ms | Clics programmés 29.2 ms plus tard |
| Mesure fixée à 3 (« 박자 3으로 지정 ») | 3/4, 3 barres obliques par mesure |
| Désactivation du métronome (M) | 0 clic programmé |
Par ailleurs, 0 erreur de console et 0 px de débordement horizontal ont été constatés aux largeurs bureau et téléphone. Pour un morceau de 63 s, il faut environ 1.6 s du choix du fichier à l’affichage de la grille (Chromium sans interface), et l’analyse d’un morceau de 5 minutes prend environ 2.7 s (Node 22) (mesures sous Linux).
Les notes de piano programmées ont été interceptées de la même manière. La hauteur de chaque tampon de note a été estimée (recherche approximative par autocorrélation, puis mesure précise de la fréquence du partiel fondamental par balayage de Goertzel), les notes commençant au même instant ont été regroupées en une seule frappe et comparées à l’accord de référence. Aucun marqueur de test n’a été ajouté au code de l’application.
| Élément | Résultat |
|---|---|
| Aux changements d’accord | Les 18 frappes ont toutes les bonnes notes constitutives, basse juste 18/18 |
| Instant des frappes | Écart avec l’instant réel du changement d’accord : 1.4 ms en moyenne, 8.1 ms au maximum |
| Démarrage de la lecture au milieu d’un accord | Les 10 frappes de reprise donnent toutes l’accord juste à cet instant |
| À chaque mesure, à chaque temps | 3/3 et 5/5 justes, écart d’instant des temps 3.0 ms et 0.6 ms en moyenne |
| Diapason du piano | Pour un accordage du morceau à +18 cents, partiels fondamentaux des 11 notes à +17.7~+18.3 cents |
| Désactivation par la touche P | Plus aucune note de piano programmée ensuite, le métronome continue |
| Effet sur le métronome | Même après l’ajout du limiteur, clics sur le temps 37/37, 29/29, 22/22, accents de premier temps tous exacts |
| Fil principal | 0 tâche de plus de 50 ms pendant la lecture |
| Volume et résonance | Rendu, via OfflineAudioContext, de la fonction de synthèse et de la chaîne audio de la vraie application, comparé à la version précédente avec les mêmes curseurs. RMS de la première seconde +5.1~+6.5 dB (environ 1.8~2.1 fois), queue à 1–2 s +2.7~+3.0 dB, temps de décroissance de 10 dB ×1.3~1.8 (C, G7, Am). Pic à −7 dBFS au volume par défaut, −2.3~−3.0 dBFS au volume maximal |
17 morceaux de genres absents des 18 morceaux de non-régression ont été ajoutés et comparés à la version 1.4.2 : 10 morceaux de type musique populaire (changement brusque de tempo, piano rubato, basse hors accord, variation de hauteur de bande, K-pop/EDM, power chords pop-rock, ballade R&B à accords barrés, hip-hop à batterie forte, rock à batterie très forte, pop en grattage acoustique) et 7 morceaux de genres particuliers (5/4, 7/4, jazz swing, bebop, bossa nova, metal, ambient).
Le critère de vérification donne la priorité à la musique populaire. Une modification qui dégrade les résultats des morceaux populaires (les 18 de non-régression, les morceaux de type populaire, l’enregistrement réel) n’est pas intégrée même si elle améliore les genres particuliers, et une modification qui améliore les morceaux populaires est intégrée même si elle dégrade un peu les genres particuliers.
| Groupe | Élément | 1.4.2 | 1.5.0 |
|---|---|---|---|
| 18 morceaux de non-régression | Beats, premiers temps, accords, tonalité | 100%, 100%, 98.6%, 18 morceaux | Identique |
| 10 morceaux de type populaire | Beats | 95.7% | 99.6% |
| Clics à contretemps | 16 | 1 | |
| Premiers temps | 95.7% | 99.5% | |
| Accords (exacts) | 88.1% | 97.0% | |
| 7 morceaux de genres particuliers | Beats | 80.0% | 93.8% |
| Premiers temps | 74.4% | 93.2% | |
| Accords (exacts) | 52.7% | 56.0% | |
| Enregistrement réel | Concordance avec 1.4.2 | Accords 100%, premiers temps 66/66, beats 257/257 |
Morceau par morceau : les beats du morceau à changement brusque de tempo passent de 64→93/96 (contretemps 16→1), les mesures 5/4 et 7/4 sont jugées exactement (premiers temps 16/16, 12/12), les beats du bebop passent de 24→96/96, le morceau à basse hors accord de 50→100 %, la ballade R&B à accords barrés de 82→91 %, et le morceau pop-rock en power chords de 50→88 %.
Méthodes comparées mais non intégrées
| Méthode | Musique populaire | Genres particuliers | Décision |
|---|---|---|---|
| Variantes des accords de septième avec extensions 9 et 13 | 18 % des accords de l’enregistrement réel changent (A♭→A♭maj7, etc.) | Concordance de la famille jazz swing 28→32 % | Non intégrée |
| Séparation harmonique/percussive (HPSS) | Aucun changement, 3 % des accords de l’enregistrement réel changent, temps d’analyse doublé | Accords exacts 56→61 % | Non intégrée |
| Chroma par décomposition en notes NNLS | Accords de non-régression 98.6→97.4 %, type populaire 97.0→95.7 % | Accords exacts 56→63 % | Non intégrée |
| Modèle bar pointer | Clics à contretemps en non-régression 47→304, premiers temps 100→56.7 % | Premiers temps 93→44 % | Non intégrée |
Le modèle bar pointer s’utilise normalement avec des activations de temps et de premier temps produites par un réseau de neurones entraîné ; avec des courbes d’attaque et d’accentuation construites à la main, il n’a pas su distinguer le niveau des temps ni la mesure. Les quatre méthodes restent dans le moteur sous forme de réglages désactivés, pour qu’on puisse refaire la même comparaison.
| Morceau | Vérité | Résultat |
|---|---|---|
| Pop, 4/4 → 3/4 → 4/4 (8 mesures chacun) | 3/4 à partir de la mesure 9, 4/4 à partir de la mesure 17 | Identique, premiers temps 24/24 |
| Couplet en valse → refrain en 4/4 | 4/4 à partir de la mesure 9 | Identique, premiers temps 20/20 |
| Changement brusque de tempo 96 → 132 | 132 à partir du temps 1 de la mesure 13 | Identique |
| Ballade ralentissant de 15 % en seconde partie | Seconde partie progressivement 72 → 63 | Progressivement 72 → 63 du temps 2 de la mesure 11 au temps 4 de la mesure 20 (cadre hexagonal), pastille blanche 63 au temps 4 de la mesure 20 |
| 35 morceaux à mesure constante et l’enregistrement réel | Pas de changement de mesure | 0 faux changement de mesure |
| Les 36 autres morceaux et l’enregistrement réel | Pas de section à changement progressif | 0 cadre hexagonal |
Même après l’activation du modèle de changement de mesure, les beats, premiers temps, accords et tonalités des 37 morceaux comparés à 1.5.0 sont tous identiques, et l’enregistrement réel concorde avec 1.4.2 : accords 100 %, premiers temps 66/66, beats 257/257. Sur le piano rubato, dont le tempo fluctue aléatoirement jusqu’à ±12 %, une seule marque est apparue, à un endroit où le tempo accélère brusquement de plus de 12 %.
En corrigeant dans 1.10.0 les règles de niveau du temps, de premier temps et de noms d’accords, la comparaison avec 1.9.4 a été faite sur des enregistrements réels annotés à la main. GTZAN comprend 998 extraits de 30 s répartis en 10 genres avec annotations de temps et de premiers temps ; GuitarSet comprend 180 accompagnements de guitare solo annotés en accords, temps et premiers temps. Pour les beats et premiers temps, la mesure F repose sur des appariements un à un à ±70 ms ; pour les accords, on compte si la fondamentale et la famille majeur/mineur (maj, 7, maj7 pour majeur ; m, m7 pour mineur) sont justes au milieu du temps de référence (pour GuitarSet, la vérité est la grille d’accords). Le groupe musique populaire comprend blues, country, disco, metal, pop et rock de GTZAN, et rock, auteur-compositeur-interprète et funk de GuitarSet.
| Données | Élément | 1.9.4 | 1.10.0 |
|---|---|---|---|
| GTZAN, 600 morceaux populaires | F des beats / F des premiers temps | 0.829 / 0.557 | 0.837 / 0.608 |
| Morceaux pris au bon tempo et sur le temps / morceaux pris à la moitié du tempo | 452 / 54 | 465 / 39 | |
| GTZAN, les 998 morceaux | F des beats / F des premiers temps | 0.786 / 0.511 | 0.794 / 0.556 |
| Morceaux notés à 3, 5 ou 7 temps | 221 | 104 | |
| GuitarSet, 108 morceaux populaires | F des beats / F des premiers temps | 0.656 / 0.550 | 0.663 / 0.568 |
| Fondamentale des accords / majeur-mineur | 81.7% / 68.5% | 81.9% / 69.0% | |
| GuitarSet, les 180 morceaux | Fondamentale des accords / majeur-mineur | 77.0% / 66.8% | 77.8% / 67.9% |
Par genre GTZAN, la F du premier temps a augmenté partout : blues 0.328 → 0.361, country 0.778 → 0.794, disco 0.676 → 0.708, metal 0.363 → 0.476, pop 0.676 → 0.717, rock 0.519 → 0.593, hip-hop 0.482 → 0.541, reggae 0.634 → 0.679, jazz 0.349 → 0.360, classique 0.293 → 0.315. Morceau par morceau, sur les 600 morceaux populaires, la F du premier temps a augmenté de plus de 0.05 pour 61 morceaux et baissé pour 34. Parmi ces derniers, 22 sont des morceaux en 4/4 jusque-là notés à tort en 7/4, 5/4 ou 3/4 qui, corrigés en 4/4, ont perdu quelques premiers temps justes par hasard ; seuls 8 morceaux ont vu la position du premier temps se dégrader à mesure égale. Sur GuitarSet, deux morceaux funk (114 BPM), corrigés de la moitié du tempo vers le bon tempo, ont des temps plus serrés et la fondamentale des accords a baissé de 6~9 points.
La vérification a aussi porté sur trois enregistrements de chanson populaire coréenne. 「고민중독」 (Gominjungdok, « Accro aux soucis ») a été mesuré contre une vérité obtenue en alignant mesure par mesure une grille d’accords publiée sur la batterie et la basse de l’enregistrement (seulement les 62 % de sections sûres) ; pour 「크리스마스의 기억」 (Keuriseumaseuui gieok, « Souvenir de Noël »), seuls le tempo connu (170 BPM) et la mesure ont été examinés.
| Morceau | Élément | 1.9.4 | 1.10.0 |
|---|---|---|---|
| QWER 「고민중독」 (vérité 178 BPM, 4/4, 129 mesures) | Tempo | 89.0 (moitié du tempo, sur la caisse claire) | 177.9 |
| F des beats / F des premiers temps / mesures irrégulières | 0.64 / 0 / 9 | 0.96 / 0.95 / 3 | |
| Fondamentale des accords / majeur-mineur (par temps) | 61.6% / 50.5% | 85.5% / 83.5% | |
| Accords par mesure | 66.7% | 91.3% | |
| Proportion de noms ornés (7, sus, etc.) | 91% | 67% | |
| Tonalité | E mineur → F mineur | G majeur → A♭ majeur (à partir de la mesure 104, comme la vérité) | |
| Warak 「크리스마스의 기억」 (170 BPM) | Tempo / mesures irrégulières | 85.0 / 3 | 170.1 / 2 (première et dernière mesures du morceau) |
| 기현 (Gihyeon) 「세월이 가면」 (Sewori gamyeon) | Concordance avec 1.4.2 (accords, premiers temps, beats) | 97.7%, 66/66, 257/257 | Identique |
Les beats, premiers temps, accords et tonalités des 37 morceaux synthétiques (18 de non-régression, 10 de type populaire, 9 de genres particuliers) et de 37 morceaux synthétiques inédits sont identiques à 1.9.4, morceau par morceau.
Cinq chansons populaires de genres et de langues différents ont servi à vérifier le tempo, la mesure, la position des mesures, la tonalité et les accords. La position des mesures a été comparée à un analyseur indépendant (madmom : suivi appris des temps et des premiers temps, et reconnaissance d’accords majeurs/mineurs) ; les accords ont été mesurés toutes les 0.1 s (fondamentale, famille majeur/mineur) contre une vérité obtenue en alignant au temps près des grilles d’accords publiées sur l’enregistrement, les endroits où la grille et l’enregistrement diffèrent (arrangements de reprises, etc.) étant tranchés en mesurant la basse et la bande harmonique. Pour des raisons de droits d’auteur, la vérité et les résultats de madmom ne sont pas distribués ; seuls les scores sont donnés. Pour 「여래아」 (Yeoraea), faute de grille d’accords publiée, seuls le tempo, la mesure, les mesures et la tonalité ont été examinés.
| Morceau | Tempo (valeur publiée) | Mesure | Concordance des premiers temps (madmom) | Tonalité | Fondamentale / majeur-mineur des accords 1.10.2 → 1.10.3 | madmom avec la même notation |
|---|---|---|---|---|---|---|
| 여자친구 (GFRIEND) 「시간을 달려서」 (Siganeul dallyeoseo) | 112.0 (112) | 4/4 | 0.96 → 0.99 | F mineur | 89.0% / 86.2% → 89.5% / 86.8% | 83.7% / 84.0% |
| 「もう恋なんてしない」, reprise par une voix féminine (7 demi-tons plus haut que l’original et environ 5 % plus rapide) | 109.9 | 4/4 | 0.99 | B majeur | 90.1% / 92.9% → 90.4% / 92.9% | 84.1% / 88.1% |
| あいみょん 「マリーゴールド」 | 106.0 (106) | 4/4 | 0.96 | D majeur | 89.4% / 88.9% → 90.4% / 89.9% | 92.9% / 92.9% |
| YOASOBI 「夜に駆ける」 | 130.0 (130) | 4/4 | 1.00 | C mineur → B mineur → D mineur | 88.6% / 80.6% → 88.6% / 80.5% | 83.4% / 82.7% |
| 시드 사운드 (Seed Sound) 「여래아」 | 90.0 | 4/4 | 1.00 | C mineur → D mineur (1.10.2 : C mineur → F majeur) | Pas de grille | - |
Pour les cinq morceaux, le niveau de tempo et la mesure sont justes, et la position des mesures concorde avec madmom et les grilles d’accords. Les deux premières mesures de 「시간을 달려서」 ont été corrigées dans 1.10.3, et les barres de mesure de l’introduction de 「マリーゴールド」 dans 1.10.4. Pour l’introduction de 「マリーゴールド」, madmom place lui aussi les choses autrement (1.78 et 4.78 s), si bien que la concordance des premiers temps reste à 0.96 ; les barres de mesure ont été vérifiées d’après la période de répétition et le point de départ du riff d’introduction. Les modulations d’un demi-ton vers le bas puis vers le haut de 「夜に駆ける」 existent réellement ; la tonalité descendue d’un demi-ton était affichée deux mesures trop tôt (mesure 102) jusqu’à 1.10.3, et à partir de 1.10.4 elle l’est à la mesure 104, où commence le refrain en B mineur. La plupart des erreurs d’accords restantes viennent de la mélodie chantée ou de notes tenues qui se mêlent à la bande harmonique et font lire un accord voisin riche en notes communes (A → Bm7/A, G7 → Gm7, C → Cm7, etc.), d’accords courts d’une demi-mesure ou d’un temps manqués, et de la fusion en un seul accord d’un sus4 qui se résout sur l’accord de trois sons. Une méthode réduisant le poids du registre aigu augmentait la fondamentale de 0.6~1.1 point sur ces cinq morceaux, mais dégradait la ballade R&B synthétique, GuitarSet et 「고민중독」 (Gominjungdok) ; elle n’a donc pas été intégrée.
1.10.4 (grille de l’introduction, affinement des bornes de modulation) n’a modifié ni les accords, ni les autres mesures, ni les autres bornes de tonalité des cinq morceaux, et les scores des 37 morceaux synthétiques, des 18 morceaux de non-régression, des tests de tonalité et de chiffres romains, de GuitarSet, des accords, premiers temps et beats de 「고민중독」 et de 「세월이 가면」 (Sewori gamyeon), de Warak et de GTZAN sont tous inchangés. Sur 「고민중독」, la borne de tonalité s’est déplacée d’une mesure vers la vérité ; sur les 1000 extraits GTZAN de 30 s sans vérité de tonalité, 9 endroits (3 en classique, 4 en metal, 1 en jazz et 1 en rock) et 1 morceau de GuitarSet ont vu le marquage de modulation reculer de 1~2 mesures (s’agissant de courts extraits, ce sont pour la plupart des modulations qui n’existent pas).
Autres résultats de test de 1.10.3 : les 37 morceaux synthétiques sont identiques morceau par morceau ; 「고민중독」 passe de 85.5 % → 85.9 % pour la fondamentale et de 83.5 % → 83.8 % pour majeur/mineur ; sur la musique populaire de GuitarSet, la fondamentale est inchangée (81.9 %) et la F des premiers temps passe de 0.568 → 0.574 ; sur les 6 genres populaires de GTZAN, F des beats et des premiers temps inchangées, mesures irrégulières 711 → 695 ; 「세월이 가면」 reste à 97.7 %, 66/66, 257/257 par rapport à 1.4.2.
Aux cinq morceaux de 1.10.3 ont été ajoutés cinq morceaux de genres et de tempos différents (김종국 (Kim Jong-kook) 「이 사람이다」 (I saramida), 015B 「이젠 안녕」 (Ijen annyeong), reprise en concert de 박명수 (Park Myung-soo) 「바다의 왕자」 (Badaui wangja), et reprises par une voix féminine de 디셈버 (December) 「별이 될게」 (Byeori doelge) et de 피노키오 (Pinocchio) 「사랑과 우정 사이」 (Saranggwa ujeong sai)) ainsi que 「세월이 가면」 (기현 (Gihyeon), bande originale de Reply 1988), pour constituer un kit de vérification de 10 enregistrements réels avec vérité d’accords. Pour chaque morceau, au moins deux grilles d’accords publiées ont été alignées sur les temps de l’enregistrement, les endroits où grille et enregistrement diffèrent ont été tranchés en mesurant la basse et la bande harmonique, puis le tout a été revérifié séparément avec un œil critique (1~9 corrections par morceau), et la vérité a été établie avec celle des temps, des premiers temps et de la tonalité. Pour des raisons de droits d’auteur, la vérité n’est pas distribuée. 「여래아」 a été écarté faute de grille publiée, et 「고민중독」 est noté séparément.
Les règles et les valeurs ont été choisies uniquement à partir des quatre premiers morceaux, de 「고민중독」, de GuitarSet et des morceaux synthétiques ; les cinq nouveaux morceaux et 「세월이 가면」 n’ont pas été regardés lors du choix des valeurs et n’ont été mesurés qu’à la fin.
| Morceau | Fondamentale / majeur-mineur des accords 1.10.5 → 1.11.0 | madmom avec la même notation |
|---|---|---|
| 여자친구 「시간을 달려서」 | 89.3% / 86.5% → 91.8% / 90.0% | 83.7% / 84.0% |
| Reprise de 「もう恋なんてしない」 | 90.4% / 92.6% → 92.8% / 94.1% | 84.1% / 88.1% |
| あいみょん 「マリーゴールド」 | 90.4% / 89.8% → 97.0% / 94.9% | 92.9% / 92.9% |
| YOASOBI 「夜に駆ける」 | 88.6% / 80.5% → 90.7% / 85.0% | 83.4% / 82.7% |
| 김종국 「이 사람이다」 | 87.6% / 83.5% → 90.0% / 85.6% | 83.3% / 80.9% |
| 015B 「이젠 안녕」 | 85.8% / 83.2% → 91.0% / 88.8% | 83.2% / 82.7% |
| 박명수 「바다의 왕자」, reprise en concert | 94.0% / 93.6% → 99.3% / 99.3% | 90.3% / 90.3% |
| 디셈버 「별이 될게」, reprise | 90.4% / 89.8% → 90.9% / 88.5% | 88.6% / 88.5% |
| 피노키오 「사랑과 우정 사이」, reprise | 97.7% / 96.2% → 98.0% / 95.8% | 91.1% / 91.9% |
| 기현 「세월이 가면」 | 88.4% / 84.8% → 94.7% / 91.2% | 90.8% / 89.8% |
| Les 4 premiers morceaux (ayant servi à choisir les valeurs) | 89.7% / 87.2% → 93.3% / 91.0% | 86.5% / 87.3% |
| Les 6 derniers morceaux (non regardés lors du choix des valeurs) | 90.8% / 88.6% → 94.0% / 91.5% | 88.0% / 87.5% |
| Les 10 morceaux | 90.4% / 88.0% → 93.7% / 91.3% | 87.4% / 87.4% |
La notation vérifie, pour chaque échantillon de 0.1 s, si la fondamentale et la famille majeur/mineur de l’accord du moteur correspondent à l’une des étiquettes de vérité ; les endroits sans accord (avant le premier temps, à la fin) sont aussi comptés faux. Le tableau de la section 1.10.3 utilisait une ancienne notation, qui cherchait l’accord correspondant à l’instant et retirait ces échantillons du dénominateur majeur/mineur ; ses valeurs diffèrent donc de 0.1~0.7 point.
La fondamentale a progressé pour les 10 morceaux, et la part d’échantillons à fondamentale fausse est passée de 9.6 % à 6.3 % (lectures comme accord voisin riche en notes communes : 5.0 % → 3.6 %). Majeur/mineur a un peu baissé pour 「별이 될게」 et 「사랑과 우정 사이」. La proportion où la fondamentale et la qualité (majeur, mineur, 7, maj7, m7, sus, etc.) sont toutes deux justes est passée de 64.3 % à 66.0 % (pour les 4 premiers morceaux, dont les grilles de vérité n’indiquent que des accords de trois sons, cette proportion est basse dès le départ). Les temps, premiers temps et tonalités sont inchangés pour les 10 morceaux. 「이젠 안녕」 (vérité 71 BPM) et 「사랑과 우정 사이」 (64 BPM) sont pris au double tempo, en comptant les croches comme temps ; élargir les conditions de la vérification du niveau du temps faisait descendre à la moitié davantage de morceaux GTZAN au bon tempo, on ne l’a donc pas corrigé (4-8).
Le critère de test de 「세월이 가면」 devient la vérité (1.11.0). Jusqu’ici, les régressions sur ce morceau étaient vérifiées par la concordance avec les résultats de 1.4.2 (accords 97.7 %, premiers temps 66/66, beats 257/257), mais les résultats de 1.4.2 eux-mêmes n’avaient qu’environ 88 % de fondamentales justes par rapport à la vérité. À partir de 1.11.0, la comparaison se fait avec la vérité, et toute baisse sous les valeurs consignées (fondamentale 94.7 %, majeur/mineur 91.2 %, qualité 78.1 %, F des beats 0.948, F des premiers temps 0.937) est considérée comme une régression ; la concordance avec 1.4.2 n’est gardée qu’à titre indicatif (dans 1.11.0, accords 85.9 %, premiers temps et beats inchangés à 66/66 et 257/257).
Autres résultats de test de 1.11.0 : pour les 37 morceaux synthétiques, fondamentale 96.52 % → 96.81 % et famille majeur/mineur 95.60 % → 95.78 % (trois morceaux, bebop, jazz swing et ballade R&B, s’améliorent, les autres sont identiques ; temps et premiers temps inchangés) ; 「고민중독」 fondamentale 85.9 % → 93.3 %, majeur/mineur 83.8 % → 88.2 % ; musique populaire de GuitarSet fondamentale 81.87 % → 82.47 %, majeur/mineur 68.97 % → 69.72 % ; GuitarSet complet fondamentale 77.87 % → 78.35 % ; les 18 morceaux de non-régression, les tests de tonalité et de chiffres romains, ainsi que temps, premiers temps et mesures de GTZAN et Warak sont inchangés. Sur GTZAN, la tonalité de 23 des 1000 morceaux a changé ; comparé à la vérité de tonalité GTZAN publiée (Lerch), 7 morceaux ont changé à juste titre et 5 à tort (pour les autres, pas de vérité ou faux dans les deux cas), et la précision de tonalité sur les 6 genres populaires est passée de 55.3 % à 56.0 % (score MIREX, qui accorde un crédit partiel aux tonalités relatives et à la quinte, 64.4 % → 65.0 %). Pour les fichiers stéréo, le temps d’analyse augmente d’environ 40 % par morceau (moyenne des 10 morceaux du kit 2.9 s → 4.0 s, même ordinateur).
Dans la deuxième mesure de 「해질녘 예스터데이」 (Haejilnyeok yeseuteodei, « Yesterday au crépuscule »), A♯m7 est joué au premier temps et D♯m7 à partir du deuxième. Au seul premier temps, A♯m7 devance D♯m7 de 3.79, mais c’est moins que la pénalité de changement d’accord au deuxième temps (4.0), si bien que dans 1.11.7 la mesure entière sortait en D♯m7.
Au départ, on n’avait posé qu’une condition de score : « si au premier temps un autre accord devance de plus de 3.5 et qu’au deuxième temps l’accord actuel est meilleur, le premier temps prend cet accord ». Résultat : 102 des 1,268 morceaux de test changeaient, et sur GuitarSet, qui a une vérité d’accords, les 6 morceaux dont le score bougeait se dégradaient tous. D’après la vérité, tous ces endroits étaient des cas où le nouvel accord commence dès le premier temps, et l’autre accord vu au premier temps était la réverbération de l’accord précédent mêlée au nouvel accord. La différence de score ne permettait pas de distinguer ce morceau-ci de ceux-là (GuitarSet 00_Jazz3-150-C avait un écart de 3.94, plus grand que ce morceau). Une condition qui coupe le premier temps en deux et vérifie si l’accord devance aussi dans le demi-temps arrière n’a pas été retenue, car l’A♯m7 de ce morceau y est au contraire faible (0.88).
Ce qui a permis de savoir si les deux accords étaient vraiment joués séparément, c’est le début du son (l’attaque). Dans ce morceau, les notes propres à A♯m7 sonnent à nouveau au premier temps avec un rapport de 2.25, celles propres à D♯m7 au deuxième temps avec un rapport de 2.03, et les basses des deux accords diffèrent. Les 6 endroits fautifs de GuitarSet avaient une attaque faible au premier temps (moins de 1.2 fois, 3 endroits), ou l’accord d’origine n’était pas rejoué au deuxième temps (2 endroits), ou les deux accords avaient la même basse (1 endroit). Le seuil d’attaque reprend tel quel le rapport de 1.2 utilisé pour juger le gris (tenu).
| Condition | Morceaux modifiés (sur 1,268) | Notation des accords GuitarSet |
|---|---|---|
| Écart de score 3.5 ou plus | 102 | 6 morceaux dégradés |
| + conditions d’attaque et de basse, écart de score 3.0 ou plus | 51 | 2 morceaux dégradés, 1 amélioré |
| + conditions d’attaque et de basse, écart de score 3.25 ou plus | 34 | Aucun morceau modifié |
| + conditions d’attaque et de basse, écart de score 3.5 ou plus (retenu) | 23 | Aucun morceau modifié |
Même à 3.25, aucun morceau avec vérité ne se dégradait, mais comme c’est proche de 3.0, où des dégradations apparaissent, on a fixé 3.5 pour garder une marge. Avec la condition finale, 23 morceaux changent (une ou deux mesures par morceau). Pour 「해질녘 예스터데이」, la deuxième mesure est redevenue A♯m7 D♯m7, et un D♭ s’est ajouté au premier temps de la mesure 93, vers la fin (A♭sus4 Fm7/C B♭m7 → D♭ A♭sus4 Fm7/C B♭m7). Pour 「고민중독」 du kit d’enregistrements réels, un B7/F♯ s’est ajouté au premier temps d’une mesure vers 2 min 21 s, mais c’est une case sans accord dans la grille de vérité, donc le score est inchangé (de même pour le fichier m4a du même morceau). Les 20 autres morceaux sont des morceaux GTZAN sans vérité d’accords. Les 18 morceaux de non-régression, les tests de tonalité et de chiffres romains, la notation des 37 morceaux synthétiques, le test de vérité de 「세월이 가면」 et la notation des accords et des temps des 180 morceaux de GuitarSet sont identiques à 1.11.7, et même les morceaux modifiés gardent leurs temps, premiers temps, mesure et tonalité.
「해질녘 예스터데이」 (Haejilnyeok yeseuteodei), signalé par un utilisateur, a une introduction au piano jusqu’à l’entrée de la batterie à 10.88 s ; les temps y étaient détectés de manière irrégulière, à des intervalles de 0.40~0.53 s, et les accords étaient décalés dès la première mesure. En prolongeant vers l’arrière la période des temps du corps du morceau (0.455 s, 132 BPM), on tombe exactement sur le premier son (3.14 s), et presque toutes les attaques du piano de l’introduction se placent sur des positions de double croche de cette grille (51 des 58 pics d’attaque à ±25 ms près) : le morceau a donc été produit à tempo fixe de 132 BPM dès le début. Jusqu’ici, les anticipations d’une double croche (5.31 s, 9.40 s, etc.) étaient suivies comme des temps, et les temps arrivaient jusqu’à 0.12 s trop tôt. Dans 1.11.7, les temps de l’introduction sont placés à 0.455 s d’intervalle, et la troisième mesure passe de G♯m G♯m7 à G♯m7 C♯7 (progression descendant par quintes). En revanche, la deuxième mesure passe de A♯m7 D♯m7 à D♯m7 : sur la bonne grille, A♯m7 ne sonne qu’au premier temps (plus une double croche), et cet accord court d’un temps a été fusionné avec l’accord voisin. Cela a été corrigé dans 1.11.8 (voir la vérification de 1.11.8 ci-dessus). La première mesure passe de B G♯7/F♯ à G♯m7/B ; hors de l’introduction, lors du regroupement des scores d’accords entre sections répétées, les temps modifiés de l’introduction ont servi de paires, et un seul temps, le quatrième de la mesure 44, est passé de Em7 à Cmaj7 (d’après les notes de ce temps, Em7 est plus plausible). Les autres mesures sont inchangées.
Sur les 1,268 morceaux de test, on a compté les morceaux modifiés en ajoutant les conditions une à une. Avec les seules conditions de tempo régulier, d’écart local et d’alignement en doubles croches, 4 morceaux changeaient (pour 2 morceaux GTZAN, scores de temps et de premiers temps inchangés) ; GuitarSet 05_Funk2-119-G gardait les mêmes scores de temps et de premiers temps, mais une mesure de longueur différente apparaissait et la fondamentale des accords baissait de 0.254 → 0.222, majeur/mineur de 0.316 → 0.263 ; on l’a exclu en ajoutant une condition de preuve de tempo fixe (au moins 30 pics d’attaque, alignement en doubles croches d’au moins 0.85). Ce morceau est joué du début à la fin par une guitare seule, avec seulement 19 attaques dans l’introduction et un alignement de 0.84. Avec la condition finale, seul 「해질녘 예스터데이」 change ; les 1,267 autres morceaux ainsi que les 18 morceaux de non-régression, les tests de tonalité et de chiffres romains, la notation des 37 morceaux synthétiques, le kit d’enregistrements réels, le test de vérité de 「세월이 가면」 (Sewori gamyeon) et les notations GTZAN et GuitarSet sont identiques à 1.11.6. Aucun autre morceau de test n’ayant une introduction de même forme (anticipations d’une double croche dans un morceau à tempo fixe commençant sans batterie), on n’a pas encore pu mesurer dans quelle mesure cette règle corrige d’autres morceaux.
Avec la même méthode que pour 1.11.5, pour chacun des 119 morceaux, parmi les 125 dont les temps semblent divisés en trois, que le contrôle 4:3 ne modifie pas, on a préparé le résultat redétecté à un tempo 3/2 fois plus rapide, puis on a ajouté les conditions une à une.
| Condition | Morceaux modifiés | Améliorés | Dégradés (temps ou premier temps) |
|---|---|---|---|
| Tout changer sans condition | 119 | 34 | 84 |
| Nouveau temps non ternaire, entre 60 et 240 BPM | 107 | 32 | 75 |
| + groupement des changements d’harmonie $G \ge 0.05$ | 48 | 26 | 22 |
| + rapport de score sans distribution a priori d’au moins 0.93 | 12 | 9 | 3 |
| + rapport d’accentuation aux nouvelles positions de beat d’au moins 1.05 | 9 | 8 | 1 (un accompagnement de guitare, premier temps) |
| + nouveau temps nettement divisé en deux croches (1.4 fois) | 8 | 8 | 0 (sur les temps et premiers temps) |
| + nouveau tempo d’au moins 90 BPM (retenu) | 7 | 7 | 0 |
À l’étape des 8 morceaux, la notation des accords GuitarSet a montré que 02_BN2-166-Ab (12/8, 56 BPM → 4/4, 83 BPM, la moitié de la vérité, 166) améliorait temps et premiers temps, mais que sa précision majeur/mineur des accords tombait de 0.44 à 0.22 ; on l’a exclu en relevant le plancher du nouveau tempo de 60 à 90 BPM. Les 7 morceaux modifiés sont les suivants.
| Morceau | Changement | Comparaison avec la vérité |
|---|---|---|
| GTZAN metal.00017 | 12/8, 144 BPM → 4/4, 216 BPM (vérité 217) | F des temps 0.38 → 0.76, F des premiers temps 0.04 → 0.70 |
| GTZAN metal.00034, metal.00094 (même enregistrement présent deux fois) | 12/8, 107 BPM → 4/4, 160 BPM (vérité 159) | F des temps 0.38 → 0.88, 0.37 → 1.00 / F des premiers temps 0.12 → 0.35, 0 → 0 |
| GTZAN rock.00064 | 12/8, 102 BPM → 5/4, 152 BPM (vérité 152, mesures à 5 temps aussi dans la vérité) | F des temps 0.39 → 1.00, F des premiers temps 0.21 → 1.00 |
| GuitarSet 01_Rock1-130-A | 12/8, 87 BPM → 4/4, 130 BPM | F des temps 0.40 → 0.99, F des premiers temps 0.29 → 0.96, fondamentale des accords 0.83 → 0.96, majeur/mineur 0.81 → 0.96 |
| GuitarSet 02_Rock3-148-C | 6/8, 98 BPM → 4/4, 150 BPM | F des temps 0.40 → 0.60, F des premiers temps 0.28 → 0.63, fondamentale des accords 0.87 → 0.97, majeur/mineur 0.76 → 0.87 |
| GTZAN jazz.00086 | 12/8, 137 BPM → 5/4, 206 BPM (le double de la vérité, 104) | F des temps 0.28 → 0.59, F des premiers temps 0.12 → 0.17 |
Les 6 premiers morceaux sont au tempo juste, et jazz.00086 (qui avait en réalité une erreur 4:3) est au double de la vérité, ce qui le rend corrigeable avec le bouton ÷2 des corrections (« 보정 ») (auparavant, en 12/8, le bouton ne pouvait pas le corriger). Les morceaux de test présentant la même erreur (notés en 12/8 ou 6/8, avec un tempo valant 2/3 de la vérité) sont au nombre de 28 : 10 dans GTZAN et 18 dans GuitarSet ; 6 d’entre eux sont passés au tempo juste. Les autres n’ont pas franchi au moins une des conditions (surtout le rapport de score de 0.93). Abaisser ce seuil faisait aussi changer, en les dégradant, des accompagnements de guitare (00_BN1-129, etc.) dont le tempo devient juste mais dont les beats se collent aux contretemps ; on ne l’a donc pas élargi. En analysant séparément l’ensemble des 1,268 morceaux et en les comparant à 1.11.5 (plancher 60 BPM), tout était identique sauf les 7 morceaux ci-dessus et 02_BN2-166 ; après avoir relevé le plancher à 90, on a relancé les 125 morceaux dont les temps semblent divisés en trois et vérifié que seul 02_BN2-166 revenait à 1.11.5. La notation des accords des 180 morceaux GuitarSet n’améliore que ces 2 morceaux, le reste étant identique, et les 18 morceaux de non-régression, les tests de tonalité et de chiffres romains, la notation des 37 morceaux synthétiques, le kit d’enregistrements réels, le test de vérité de 「세월이 가면」 et les tonalités GTZAN sont identiques à 1.11.5.
Sur les mêmes 1,268 morceaux de test que pour 1.11.4, pour chacun des 125 morceaux dont les temps semblent divisés en trois (notés en 12/8 ou 6/8), on a préparé le résultat redétecté à un tempo 4/3 fois plus lent, puis compté les morceaux modifiés en ajoutant les conditions une à une. Pour les morceaux avec vérité, une baisse de la F des temps ou de la F des premiers temps comptait comme une dégradation.
| Condition | Morceaux modifiés | Améliorés | Dégradés (temps ou premier temps) |
|---|---|---|---|
| Tout changer sans condition | 124 | 26 | 96 |
| Nouveau temps non ternaire, entre 50 et 140 BPM | 97 | 25 | 70 |
| + rapport de score sans distribution a priori d’au moins 0.93 | 14 | 5 + 1 morceau sans vérité | 8 (7 accompagnements de guitare, 1 morceau très rapide) |
| + nouveau temps nettement divisé en deux croches (1.4 fois) | 9 | 5 + 1 morceau sans vérité | 3 (2 accompagnements de guitare, 1 morceau très rapide) |
| + quasi-égalité dès l’estimation initiale (0.85) | 6 | 5 + 1 morceau sans vérité | 0 |
| + groupement des changements d’harmonie $G \ge 0$ (retenu) | 6 | 5 + 1 morceau sans vérité | 0 |
Les 6 morceaux modifiés sont les suivants.
| Morceau | Changement | Comparaison avec la vérité |
|---|---|---|
| 「아주 먼 옛날」 (Aju meon yennal, « Il y a très longtemps ») (signalé par un utilisateur) | 12/8, 92 BPM → 4/4, 69 BPM, mesures de longueur différente 4 → 0 (hors dernière mesure) | Pas de fichier de vérité (les accords tombent aux temps 1 et 3 de la mesure et progressent régulièrement, comme C–Em–Dm7–G7) |
| GTZAN pop.00004 | 6/8, 107 BPM → 4/4, 80 BPM | F des temps 0.30 → 1.00, F des premiers temps 0.17 → 1.00 |
| GTZAN pop.00062 | 6/8, 107 BPM → 2/4, 81 BPM | F des temps 0.30 → 1.00, F des premiers temps 0.11 → 0.67 |
| GTZAN hiphop.00035 | 12/8, 112 BPM → 4/4, 84 BPM | F des temps 0.28 → 1.00, F des premiers temps 0.15 → 1.00 |
| GTZAN rock.00049 | 12/8, 111 BPM → 4/4, 84 BPM | F des temps 0.27 → 0.98, F des premiers temps 0 → 0 (identique) |
| GuitarSet 00_Rock2-85-F | 12/8, 113 BPM → 4/4, 85 BPM | F des temps 0.30 → 0.99, F des premiers temps 0.21 → 0.97 |
Pour pop.00004 et pop.00062, les beats redétectés suivaient la grosse caisse et se collaient aux contretemps (F des temps 0), et il a fallu la règle de décalage d’un demi-temps pour qu’ils s’améliorent. Les morceaux présentant la même erreur (notés en 12/8 ou 6/8, avec un tempo valant 4/3 de la vérité) sont au nombre de 19 : 11 dans GTZAN, 7 dans GuitarSet et 「아주 먼 옛날」 ; 6 d’entre eux ont été corrigés. Les 13 autres n’ont pas franchi au moins une des conditions ci-dessus ; élargir les conditions faisait passer à la moitié du tempo ou en contretemps des accompagnements de guitare dont le tempo juste est 3/2 fois plus rapide, ou des morceaux très rapides, on ne les a donc pas élargies. Les morceaux dont les temps ne semblent pas divisés en trois ne subissent pas ce contrôle, leurs résultats sont donc identiques à 1.11.4. En analysant séparément l’ensemble des 1,268 morceaux avec le moteur 1.11.4 et avec ce moteur, tout est identique sauf les 6 morceaux ci-dessus, et les 18 morceaux de non-régression, les tests de tonalité et de chiffres romains, la notation des 37 morceaux synthétiques, le kit d’enregistrements réels et le test de vérité de 「세월이 가면」 sont identiques à 1.11.4.
Les conditions des trois règles de 1.11.4 (contrôle du changement de mesure, réexamen des mesures de longueur différente, nom de tonalité quand m7 et accord de sixte se recouvrent) ont été fixées pour qu’aucun des 1,268 morceaux de test (37 morceaux synthétiques et 37 morceaux synthétiques inédits, 15 enregistrements réels (dont 11 chansons populaires avec vérité), 999 morceaux GTZAN, 180 morceaux GuitarSet) ne se dégrade. Pour chaque morceau, on a appliqué au résultat d’une seule analyse les deux réglages, règles activées et désactivées, et comparé mesures, accords, tonalités, mesures (signatures) et tempos. Règles désactivées, tous les morceaux sont identiques à 1.11.3 ; activées, seuls les 7 morceaux suivants changent.
| Morceau | Changement | Comparaison avec la vérité |
|---|---|---|
| Morceau en 4/4 dont le dernier refrain passait en 5/4 et où une mesure à 2 temps s’intercalait à chaque refrain (signalé par un utilisateur) | Pas de changement de mesure, mesures de longueur différente 27 → 0, nom de tonalité mineur → majeur | Pas de fichier de vérité (4/4 et majeur confirmés par l’analyse des répétitions et de la basse) |
| GTZAN hiphop.00067, reggae.00022, reggae.00077 | Moins de mesures de longueur différente | F des premiers temps 0.56, 0.89, 0.81 → 1.00 |
| GTZAN country.00039, jazz.00074 | Nom de tonalité F♯ mineur → A majeur, E mineur → G majeur | Faux → juste |
| GTZAN blues.00061 | Nom de tonalité F mineur → A♭ majeur | Vérité G mineur, faux avant comme après (score MIREX identique) |
Aucun morceau ne se dégrade en temps, premiers temps, accords ou tonalité. Pour la tonalité, on a aussi fait en sorte qu’aucun morceau ne voie baisser sa proximité à la vérité (score pondéré MIREX) (avec un seuil de 0.1, un morceau passait d’une tonalité voisine à la quinte de la vérité à une tonalité éloignée, d’où 0.15). Les 18 morceaux de non-régression, les tests de tonalité et de chiffres romains, la notation des 37 morceaux synthétiques, le kit de 11 enregistrements réels, le test de vérité de 「세월이 가면」 et GuitarSet sont identiques à 1.11.3.
Ce qui n’a pas été intégré sans conditions. Utilisées sans conditions, les trois règles modifiaient beaucoup de morceaux : contrôle du changement de mesure 8 morceaux (premiers temps dégradés pour 3), réexamen des mesures 159 morceaux (premiers temps améliorés pour 72, dégradés pour 34), nom de tonalité 118 morceaux (tonalité devenue juste pour 26, fausse pour 29). En ne les appliquant que lorsque les indices sont nets, afin de protéger les morceaux existants, on a aussi renoncé à la plupart des améliorations. On a également testé, sans les intégrer, une méthode qui ne compte comme majeur que les m7 dont la basse n’est pas la fondamentale (76 morceaux, tonalité juste pour 17, fausse pour 13) et une règle de nommage qui écrit un m7 de la tonalité avec la septième à la basse comme accord parfait majeur/basse (D♯m7/C♯ → F♯/C♯, fondamentale de 「바다의 왕자」 (Badaui wangja) 99.3 % → 99.1 %).
Vitesse d’analyse. Sans changer un seul bit des résultats de calcul (mêmes opérations dans le même ordre), l’analyse a été accélérée d’environ 1.8 fois. La conversion de fréquence d’échantillonnage calcule côte à côte 8 sorties de même phase, et la FFT parcourt deux étapes à la fois et ne calcule que les cases de fréquence utilisées. Dans Chrome, le temps total d’analyse et de construction de la grille pour 5 enregistrements réels est passé de 20.2 s à 11.3 s (ce qui annule le surcoût de 1.11.0 et dépasse même 1.10.5), et la mémoire maximale pendant l’analyse est la même qu’en 1.11.0. L’identité des résultats a été vérifiée en comparant tous les nombres produits par le moteur sur des enregistrements réels (y compris en versions mono, 3 canaux et 48 kHz), 90 morceaux GuitarSet, 74 morceaux synthétiques, diverses fréquences d’échantillonnage, durées et entrées silencieuses, et sur des combinaisons de commutateurs désactivés.
Correction d’une régression de tonalité. Dans 1.11.0, la tonalité de 「고민중독」 (Gominjungdok) était notée à tort B mineur → E mineur → F mineur (1.10.5 donnait G majeur → A♭ majeur, comme la vérité). Le kit ne contenait pas de fichier de vérité de tonalité pour ce morceau, et le test de 1.11.0 l’a manqué. La cause était un seul nom d’accord de septième laissé par la réduction de la mélodie chantée (le C de l’introduction devenu C7), qui faisait passer la tonalité de l’introduction en D majeur pour un écart de score de 0.007 ; on l’a corrigé par un filtrage des modulations quasi à égalité. Cette règle n’a modifié que 「고민중독」 et une fausse modulation d’un morceau hip-hop parmi les 1000 de GTZAN (ce morceau diffère de la vérité avant comme après) ; les 10 morceaux du kit, les 180 de GuitarSet, les morceaux synthétiques et les tests de tonalité et de chiffres romains sont inchangés, tonalité comprise.
Noms de qualité. L’ajout du nom d’accord semi-diminué fait passer la qualité, mesurée par rapport au jeu réel de GuitarSet, de 59.37 % → 60.28 % ; la qualité sur les 10 morceaux du kit passe de 66.0 % → 66.2 % (m7♭5 dans 「이 사람이다」 (I saramida) et 「もう恋なんてしない」), et le temps d’analyse par morceau, sous node sur le même ordinateur, passe en moyenne de 4.0 s → 2.1 s. Fondamentale, majeur/mineur, temps et tonalité sont inchangés dans tous les groupes de test.
Ce qui a été étudié mais non intégré.
Autres résultats de test de 1.11.1 : les 37 morceaux synthétiques et les 37 inédits, les 18 morceaux de non-régression, les tests de tonalité et de chiffres romains, Warak, ainsi que temps, premiers temps, fondamentales et majeur/mineur de GTZAN et GuitarSet sont identiques à 1.11.0. Le test de vérité de 「세월이 가면」 reste à fondamentale 94.7 %, majeur/mineur 91.2 %, qualité 78.1 %.
| Élément | 1.8.3 | 1.8.4 |
|---|---|---|
| Gris en début de mesure dans les morceaux synthétiques (tous rejoués) | 49 endroits | 8 endroits, tous la résonance du dernier accord après la fin du morceau |
| Changements d’accord au même temps que la vérité / un temps trop tôt / un temps trop tard / changements absents de la vérité | 772 / 50 / 19 / 35 | 776 / 46 / 19 / 35 |
| Accords exacts / famille, 18 morceaux de non-régression | 98.6% / 99.8% | 98.9% / 100% |
| Accords exacts / famille, morceaux de type populaire | 97.0% / 99.2% | 97.2% / 99.3% |
| Beats, premiers temps, tonalité, genres particuliers, test des chiffres romains | Identique | |
| Enregistrement réel | Accords, premiers temps et beats identiques. Sur 6 endroits en gris, seul celui qui est rejoué (mesure 24) passe en noir | |
| Morceau de nappes avec accords tenus (8 endroits où le même accord se prolonge) | 7 endroits justes |
La position d’affichage à l’écran a aussi été vérifiée. En ouvrant 6 morceaux aux largeurs bureau et mobile, les 306 noms d’accords étaient tous à la même distance de la barre oblique de leur temps.
Limites
Pistes pour la suite
La version s’écrit avec trois nombres, majeure.mineure.build. La version actuelle est affichée à côté du titre de l’application et de la page d’aide.
| Position | Quand l’incrémenter | Exemple |
|---|---|---|
| Majeure | Quand le nom de l’application ou sa façon de s’utiliser change fortement. 0 désigne les versions de développement antérieures au nom définitif | 1.0.0 nom fixé à Chordity |
| Mineure | Quand une nouvelle fonction est ajoutée. Le numéro de build repart de 0 | 1.3.0 notation en chiffres romains |
| Build | Quand les fonctions restent les mêmes et que changent des corrections de bugs, des réglages de son ou de valeurs, des textes ou la documentation | 1.4.1 retouche des textes d’information |
A♯m7 D♯m7). Le premier temps n’est noté séparément que si un autre accord y domine nettement, que les notes de cet accord sont nouvellement frappées au premier temps et que l’accord d’origine est rejoué au deuxième temps, et que les deux accords ont des basses différentes. Les cas où la réverbération de l’accord précédent se mêle et fait entendre un autre accord ne sont pas modifiés.N.C. du thème clair ont été un peu foncés pour rester lisibles sur le remplissage orange.N.C. a été un peu ajusté pour rester lisible aussi bien sur le cadre que sur le fond.N.C. gardent une barre normale.N박 (« N temps ») sont placés sans se chevaucher ni sortir de la ligne. Si des pastilles sont proches, la pastille d’arrivée se décale un peu, le cadre raccourcit son bord du côté de la pastille, et si le cadre est trop court pour contenir 여기까지 63 (« jusqu’ici 63 »), seul le nombre est écrit.N박 débordait sur le haut de la case du nom d’accord. On a aussi empêché les dispositions où la pastille du temps de fin de ligne sortait de la ligne et provoquait un débordement horizontal sur écran étroit, où la pastille de modulation en début de ligne touchait la ligne sous les barres obliques de la ligne précédente, ou où la pastille de modulation pouvait chevaucher la marque N박./F♯) est retirée en premier et … est ajouté.C 장조 → C 장조 (« C majeur → C majeur »). Si, après le découpage en sections de tonalité et la nouvelle détermination de la tonalité par les accords, deux sections voisines ont la même tonalité, elles sont fusionnées en une seule.C 장조 4/4, c’est-à-dire « C majeur », « 4/4 »).로/으로 (« vers »), choisie selon les règles d’orthographe (D 장조로, 3/4으로, 132로, 63으로). L’étiquette du début du morceau ne prend pas de particule.여기까지 63 (« jusqu’ici 63 »), et si la position de lecture est dans le cadre, le tempo actuel est affiché, comme 현재 67 (« actuel 67 »).4/4 → 3/4 → 4/4, et une étiquette 3/4로 (« vers 3/4 ») est placée sur la mesure du changement.120) à la place de la barre oblique.information.html) qui rassemble les fondements des décisions. Elle couvre les cas où les résultats peuvent être faux et comment les vérifier, la lecture des informations d’analyse, les principes, les formules, la physique du son, l’architecture, la vérification, le vocabulaire et les références, avec table des matières, recherche et thèmes clair et sombre.Avant que le nom définitif soit fixé, l’outil s’appelait « 마디 코드 » (« Accords par mesure »).
docs) pour que les captures d’écran s’affichent dans le README.