Trouver un accord depuis des notes
- 34 réponses
- 11 participants
- 1 755 vues
- 18 followers

Djardin

je me disais que j'allais tenté un programme pour trouver un accord depuis des notes.
On en a parlé là :
https://fr.audiofanzine.com/le-pub-des-gentlemen/forums/t.71857,les-questions-auxquelles-on-a-pas-les-reponses-mais-un-afien-peut-les-avoir,post.10317118.html
En gros, je cherche à rentrer 4 notes et à avoir le nom de l'accord.
Je pensais partir sur une solution un peu simple :
je génère tous les accords possible et je vérifie si mes 4 notes sont dans chaque accord.
ça peut avoir l'air brute force, mais au final une liste de 15000 valeurs ça devrait se filtrer vite !
Référence en matière de bon gout capillaire et vestimentaire.
homme à tête de zizi.
- 1
- 2

KoalaMan

Ensuite, l’analyse de la formule utilisée pour passer d’une note à l’autre permet de déterminer l’accord, son renversement et sa basse.
Par exemple (je prends des chiffres au hasard, j’ai pas envie de calculer), la suite 24, 45, 52, 55 te donne D +21 +7 +3, et tu sais que N +7 +3 est un accord parfait majeur.
On ne voit bien qu'avec les yeux. Le cœur est invisible pour l'essentiel.

Jeg Folay

Enfin ici y a un truc qui ressemble terriblement à ton idée mais il faut s'abonner pour essayer.
Tu as beau te limiter à 4 sons, tu n'échapperas aux formes altérées des accords complexes (les no3, no 5, basse étrangère, et j'en passe)
Rock, rock 'til you drop!

Djardin

En gros, si je mets Do à 0,
j'ai Do, Mi Sol -> 0, 4, 7.
Idem, Ré majeur, j'ai 2, 6, 9. Donc 2+0, 2+4, 2+7.
Le problème va être "comment je passe de 2, 6, 9 à 2 (0, 4, 7)" ?
Je considère que le plus grave est toujours la fondamentale ?
(mais difficilement faisable vu que je veux m'en servir pour ukulélé, banjo, mandoline et autre petites saloperies ayant peu de cordes et plein de renversement)
Référence en matière de bon gout capillaire et vestimentaire.
homme à tête de zizi.

Djardin

ou encore là pour la version tout-terrain, guitares et claviers (RIP).
je regardais ça à l'instant !
Ils ne mettent pas leur code !
Après, je me doute que ça existe déjà, j'en utilise souvent.
Mais je me disais que j'allais essayer d'en faire un pour le fun et pour l’exercice.
Et pour me faire un truc sur mesure pour mon usage à moi.
donc changer d'instruments/accordage et retrouver où je suis.
ou composer avec des autodidactes qui jouent sans savoir ce qu'ils font et retrouver leurs accords.
ça pourrait aussi se faire en bossant le solfège, hein, mais bon s'ils bossaient la théorie, ils seraient plus des autodidactes qui jouent sans connaître la théorie !
Référence en matière de bon gout capillaire et vestimentaire.
homme à tête de zizi.
[ Dernière édition du message le 08/05/2020 à 23:52:25 ]

KoalaMan

Est-ce que tu as moyen de partir de la note le plus aigüe du coup ? De compter à l’inverse pour finir par la note la plus grave. En l’ignorant éventuellement si elle ne correspond pas à un schéma traditionnel. Je pense par exemple aux faux positifs si on joue un accord de 7 majeure.
C e g b, en partant de l’aigu on a vite fait de croire que c’est un mi mineur.
On ne voit bien qu'avec les yeux. Le cœur est invisible pour l'essentiel.

Djardin

Après mon côté feignasse me fait dire que vraiment, vaut souvent mieux un bon tableau qu'un algo.
Parce que l'algo ça va être compliqué, va falloir enlever les erreurs.
Et là tu viens d'en lever deux : les renversements, et les 7eme majeur.
(c'est justement ton exemple entre le C7 et le Em qui m'a fait dire que c'est sûrement pas simple l'algo de reconnaissance)
Un tableau ça veut dire que je dois générer la liste des possibles, mais ensuite je cherche et je dis :
est ce que mon accord est dans la liste ?
oui.
il s'appelle comment ?
Donc je déplace la complexité sur générer les possibles.
Mais ce qui veut dire qu'à la génération, je peux avoir une 1ere version avec que les accords majeurs/mineurs parfaits, puis petit à petit je rajoute des nouveaux accords dans la liste.
Et donc faut juste savoir comment générer un accord (et le faire pour 11 notes à chaque fois)
Référence en matière de bon gout capillaire et vestimentaire.
homme à tête de zizi.
[ Dernière édition du message le 09/05/2020 à 00:02:09 ]

KoalaMan

Donc c’est un peu dommage de ne pas s’appuyer sur ce qui existe déjà pour faire ton espèce de reverse-engineering musical.

On ne voit bien qu'avec les yeux. Le cœur est invisible pour l'essentiel.

Djardin

Je compte dire : un accord majeur c'est ce format là, et il y en a 11. Un mineur c'est celui là, 11 aussi. et ainsi de suite.
Et avoir un algo qui génère tous les cas possibles.
Mais bon, vu que j'ai aucune idée de où je vais aller, p'être que je vais changer de façon de faire en fait. On verra.
Design émergent, tout ça !
Référence en matière de bon gout capillaire et vestimentaire.
homme à tête de zizi.

Dr Pouet

Un tableau ça veut dire que je dois générer la liste des possibles (par algorithme donc), mais ensuite je cherche et je dis :
est ce que mon accord est dans la liste ?
oui.
il s'appelle comment ?
Ou bien : ils s’appellent comment ?

Anonyme

L'utilisateur rentre disons 4 notes pour un accord. La première est comptée comme 1. Ensuite chaque intervalle est simple à trouver (comme sur un gratte en fait) :
- 2nde mineur + 1
- 2nde majeure +2
- Tierce mineure +3
etc
De plus, on connaît a priori les façons de renverser les intervalles. Une tierce mineure devient une sixte majeure par exemple. La formule est simple : la somme des deux intervalles doit faire 9, et on inverse mineur avec majeur, juste restant juste. En adaptant avec la numérotation présentée avant, la somme des intervalles fait finalement 12.
Du coup, au niveau du stockage, il me semble simple de stocker les accords sous formes d'intervalles :
-majeur = 1 4 7
- mineur = 1 3 7
- aug = 1 4 8
etc
Au niveau complexité, je partirai là-dessus : tu détectes le nb de notes et ensuite tu affines par rapport à la deuxième note, la troisième etc...
Y'a moyen de faire un truc pour stocker les renversements plus simplement je pense. Les accords de base stockés en brut et les renversements étudiés avec la formule donnée plus haut.
Je sais pas si c'est clair ^^

Azimut2

Le plus dur, c'est quand c'est mou

christian_r

Ca peut éventuellement te servir.
Je me suis limité aux 28 types d'accords musicaux "qui sonnent bien", donc pas de clusters (groupes de notes en vrac peu mélodieux).
C'est ce qu'on peut utiliser d'origine sur un séquenceur Roland MC-909 par exemple, sans devoir programmer ses propres accords supplémentaires.

Christian

Jeg Folay

Rock, rock 'til you drop!

Azimut2

Le plus dur, c'est quand c'est mou

Djardin

Et exemple : le Mi Mineur à la mandoline, c'est G E B e. Donc la note la plus grave est le Sol, pas du tout le Mi.
On pourrait dire "la fondamentale est le mi, parce que le mi est doublé à l'octave", mais par exemple au ukulélé, le Fa majeur, c'est : a C F A. Donc c'est le la qui est doublé (et le La la 1ère note, et le Do la plus grave).
En même temps ça serait plus simple si je partais sur une base d'instruments logiques façon piano, et pas de trucs avec des accords renversé partout parce que pas assez de cordes et manche trop court façon ukulélé !
Et merci pour le tableau chritian_r, ça me fait toute la liste d'accords à implémenter !
(en attendant par contre, je galère sur les tests d'UI d'android)
Référence en matière de bon gout capillaire et vestimentaire.
homme à tête de zizi.

KoalaMan


On ne voit bien qu'avec les yeux. Le cœur est invisible pour l'essentiel.

Anonyme

Le soucis de partir sur les intervalles, c'est que ça sous-entend que je connais la fondamentale.
Pas forcément ! D'où la gestion des renversements qui te permet de déduire la fondamentale !
Si t'as un accord mineur : 1 - 3 - 7
Premier renversement : 1 - 4 - 9
Deuxième renversement : 1 - 5 - 8
En gros, il suffit de checker si la deuxième note est une tierce. Si c'est le cas, ça fait partie des accords standards. Sinon c'est qu'il est renversé. Je me trompe ?
EDIT : Oui je me trompe en partie, il suffit de voir le premier renversement, qui est similaire à un accord de sixte (d'ailleurs noté dans la littérature classique par 6). Donc on peut détecter les renversements, mais ils sont similaires à d'autres accords. Ca peut être une possibilité de tout indiquer !
(je passe le cas particulier des "So What" chords, qui seraient en gros 1 - 5 - 10 - 15 - 19...)
[ Dernière édition du message le 09/05/2020 à 18:22:04 ]

Jimbass

Je te proposais une solution de numérotation de chaque note du piano standard, donc de 1 à 89.
Y'a déjà une norme pour ca. Ca s'appelle ... MIDI.
Musikmesser 2013 - Bullshit Gourous - Tocxic Instruments - festivals Foud'Rock, Metal Sphère et la Tour met les Watts

Will Zégal

Donc, pour moi, ou tu considère que c'est pour les autodidactes et qu'on ne s'occupe pas de la tonalité auquel cas tu donnes tous les noms d'accords correspondant aux trois ou quatre notes entrées, ou tu considère que savoir la tonalité est le minimum pour utiliser ton soft et elle te permet de déduire le nom des accords ou du moins de grandement limiter le nombre de noms par accord (2-3 max, je pense, pour des accords de 4 notes).
Si tu es joueur, tu commences par rentrer toutes les notes jouées dans les différents accords du morceau et c'est le soft qui te donne la tonalité et donc le nom de chaque accord.

Dr Pouet

'SolLa#DoMi': ['Do7']
pour dire que la séquence de notes Sol La# Do Mi se trouve dans l'accord Do7
(comme les crochets ne passent pas dans les messages du forum, il faut remplacer £ par un crochet ouvrant, et $ par un crochet fermant ; les lignes commentées sont les tests unitaires !)
notesGammeDo = £"Do","Do#","Ré","Ré#","Mi","Fa","Fa#",
"Sol","Sol#","La","La#","Si"$
listeAccords = £
{ "suffixeNom" : "Maj", "notesAcc" : £0,4,7$ },
{ "suffixeNom" : "Min", "notesAcc" : £0,3,7$ },
{ "suffixeNom" : "7", "notesAcc" : £0,4,7,10$ },
$
dicoAccords = { }
def ajoutDico( dico, clef, valeur ):
if clef in dico:
dico£clef$.append( valeur )
else:
dico£clef$ = £valeur$
return
#dicoAccords = { "testNotes" : £"testAcco1", "testAcco2"$ }
#peuplerDico( dicoAccords, "testNotes", "testAcco3" )
#peuplerDico( dicoAccords, "test2", "accoPipo" )
#print( dicoAccords )
def chaineNotes( listeNotes, notesGamme ):
resu =""
for note in listeNotes:
resu += notesGamme£ note $
return resu
#print( chaineNotes( £0,4,7$, notesGammeDo ) )
def peuplerRenversements( dico, notesGamme, notes, nomAcc ):
renversement = notes
for i in range( len( notes ) ):
ajoutDico( dico, chaineNotes( renversement, notesGamme), nomAcc )
pivot = renversement.pop(0)
renversement.append(pivot)
return
#peuplerRenversements( dicoAccords, notesGammeDo, £0,4,7$, "DoMaj" )
#print( dicoAccords )
def peuplerAccordsTranspoRenvers( dico, notesGamme, notes, suffixeAcc ):
tailleGamme = len( notesGamme )
for transpo in range( tailleGamme ):
notesTransposees = £$
for uneNote in notes:
notesTransposees.append( (uneNote + transpo) % tailleGamme)
nomFondamentale = notesGamme£ notesTransposees£0$ $
peuplerRenversements( dico, notesGamme, notesTransposees,
nomFondamentale + suffixeAcc)
return
#peuplerAccordsTranspoRenvers( dicoAccords, notesGammeDo, £0,4,7$, "Maj" )
#print( dicoAccords )
def peupler( dico, listeAcc, notesGamme ):
for unAccord in listeAcc:
peuplerAccordsTranspoRenvers( dico, notesGamme, unAccord£"notesAcc"$,
unAccord£"suffixeNom"$ )
return
peupler( dicoAccords, listeAccords, notesGammeDo )
print( dicoAccords )
[ Dernière édition du message le 12/05/2020 à 17:44:06 ]

Dr Pouet

Ça fait déjà 624 entrées dans le dictionnaire (avec toutes les transpositions et renversements) !
On constate que le même groupe de notes peut correspondre à différents accords ; grâce notamment au dim / 6 / min 7 b5 / 7 b5 / Aug...
Exemples :
'RéMiSol#Si': ['Mi7', 'Sol#Min7b5']
'SolLa#DoRé#': ['DoMin 7', 'Ré#6']
'La#RéFa#': ['RéAug', 'Fa#Aug', 'La#Aug']
'FaSolSiDo#': ['Do#7b5', 'Sol7b5']
notesGammeDo = £"Do","Do#","Ré","Ré#","Mi","Fa","Fa#",
"Sol","Sol#","La","La#","Si"$
listeAccords = £
{ "suffixeNom" : "Maj", "notesAcc" : £0,4,7$ },
{ "suffixeNom" : "Maj 7", "notesAcc" : £0,4,7,11$ },
{ "suffixeNom" : "7", "notesAcc" : £0,4,7,10$ },
{ "suffixeNom" : "Min", "notesAcc" : £0,3,7$ },
{ "suffixeNom" : "Min 7", "notesAcc" : £0,3,7,10$ },
{ "suffixeNom" : "Dim", "notesAcc" : £0,3,6,9$ },
{ "suffixeNom" : "Min7b5", "notesAcc" : £0,3,6,8$ },
{ "suffixeNom" : "Aug", "notesAcc" : £0,4,8$ },
{ "suffixeNom" : "Sus4", "notesAcc" : £0,5,7$ },
{ "suffixeNom" : "7sus4", "notesAcc" : £0,5,7,10$ },
{ "suffixeNom" : "Add9", "notesAcc" : £0,5,7,2$ },
{ "suffixeNom" : "#11", "notesAcc" : £0,5,6$ },
{ "suffixeNom" : "MinAdd9", "notesAcc" : £0,3,7,2$ },
{ "suffixeNom" : "6", "notesAcc" : £0,4,7,9$ },
{ "suffixeNom" : "6", "notesAcc" : £0,3,7,9$ },
{ "suffixeNom" : "Min Maj 7", "notesAcc" : £0,3,7,11$ },
{ "suffixeNom" : "7b5", "notesAcc" : £0,4,6,10$ },
{ "suffixeNom" : "Aug7", "notesAcc" : £0,4,8,10$ },
$
dicoAccords = { }
doublons = set( £$ )
def ajoutDico( dico, clef, valeur ):
if clef in dico:
dico£clef$.append( valeur )
doublons.add( valeur£2:$ )
else:
dico£clef$ = £valeur$
return
#dicoAccords = { "testNotes" : £"testAcco1", "testAcco2"$ }
#peuplerDico( dicoAccords, "testNotes", "testAcco3" )
#peuplerDico( dicoAccords, "test2", "accoPipo" )
#print( dicoAccords )
def chaineNotes( listeNotes, notesGamme ):
resu =""
for note in listeNotes:
resu += notesGamme£ note $
return resu
#print( chaineNotes( £0,4,7$, notesGammeDo ) )
def peuplerRenversements( dico, notesGamme, notes, nomAcc ):
renversement = notes
for i in range( len( notes ) ):
ajoutDico( dico, chaineNotes( renversement, notesGamme), nomAcc )
pivot = renversement.pop(0)
renversement.append(pivot)
return
#peuplerRenversements( dicoAccords, notesGammeDo, £0,4,7$, "DoMaj" )
#print( dicoAccords )
def peuplerAccordsTranspoRenvers( dico, notesGamme, notes, suffixeAcc ):
tailleGamme = len( notesGamme )
for transpo in range( tailleGamme ):
notesTransposees = £$
for uneNote in notes:
notesTransposees.append( (uneNote + transpo) % tailleGamme)
nomFondamentale = notesGamme£ notesTransposees£0$ $
peuplerRenversements( dico, notesGamme, notesTransposees,
nomFondamentale + suffixeAcc)
return
#peuplerAccordsTranspoRenvers( dicoAccords, notesGammeDo, £0,4,7$, "Maj" )
#print( dicoAccords )
def peupler( dico, listeAcc, notesGamme ):
for unAccord in listeAcc:
peuplerAccordsTranspoRenvers( dico, notesGamme, unAccord£"notesAcc"$,
unAccord£"suffixeNom"$ )
return
peupler( dicoAccords, listeAccords, notesGammeDo )
#print( dicoAccords )
#print( doublons )
print( dicoAccords£ "DoRé#SolSi" $ )
print( "Nombre d'entrées dans le dictionnaire : " + str(len(dicoAccords)) )

Dr Pouet


Et j'ai une question orientée harmonie : y a-t-il une règle assez simple pour choisir en # et b ? Sur ce tableau on voit qu'il y a le choix pour F# et G#. Mais ma question est plus générale et porte sur toutes les fondamentales. Notamment D#, Eb etc etc

KoalaMan

On essaye également de n'avoir qu'un type d'altération (en musique tonale en tout cas), donc pas de Eb G A# D.
Will avait raison en parlant de tonalité : la plupart des morceaux sont encore tonaux, donc si on a une possibilité de rentrer la tonalité, ça limite pas mal le champs des possibles.
On ne voit bien qu'avec les yeux. Le cœur est invisible pour l'essentiel.

Dr Pouet

On essaye également de n'avoir qu'un type d'altération (en musique tonale en tout cas), donc pas de Eb G A# D.
Ça c'est ok, pour l'instant il n'y a que des #

si on a une possibilité de rentrer la tonalité
A priori non.
Mais est-ce que les informations :
- note fondamentale de l'accord (C ou D# ou Eb ou ...)
- type d'accord ( min7, aug ...)
suffiraient ?
- < Liste des sujets
- Charte
- 1
- 2