Stéphane Boussuge

Composer / Concert Pianos Technician

Music Composition

Génération de progression harmonique avec des chaines de Markov.

Voici un exemple de génération de progression harmonique avec Opusmodus utilisant pour les règles d'enchainements des accords une table de transition.
La technique présentée ici utilise le concept tonal de degrés, mais il est important de noter que comme vous allez le voir plus loin dans cet article, ce concept peut être poussé relativement loin et tout à fait en dehors du sytème tonal traditionnel.

D'abord, on édicte les règles de transition de degré en degré:

(setf transition
'((1 (4 1) (5 1)(6 2))
(2 (5 2) (4 1))
(3 (4 1))
(4 (5 1)(2 1))
(5 (1 3)(6 2)(4 1))
(6 (4 1))
(7 (1 1)(6 1))))

voici donc une règle nommée transition qui dit que:
un 1er degré aura 2 fois plus de chances d'être suivit par un sixième degré (1 (6 2)) que par un 4e ou 5e (1 (4 1)(5 1)) ,
un second degré pourra être plus probablement suivit d'un 5e (2 (5 2) que d'un 4e (2 (4 1))
On définit ainsi de suite les règles de transitions pour chaque degré de la gamme ou échelle.

Nous générons maintenant une suite de degrés que nous appelons "prog" basée sur ces règles avec la fonction GEN-MARKOV-FROM-TRANSITIONS:
(pour plus de renseignements sur les chaines de markov, vous pouvez consulter: "https://fr.wikipedia.org/wiki/Chaîne_de_Markov" )

(setf prog (gen-markov-from-transitions transition :size 24 :start 1))

qui peut par exemple donner ce résultat:

=> (1 5 6 4 5 1 6 4 5 1 4 2 4 5 4 2 5 4 2 4 5 6 4 5)

Comme la fonction que nous allons utiliser pour générer les accords se base sur une numérotation à partir de zéro mais que nos degrés générés sont basés sur une notation à partir de 1, nous allons soustraire 1 à chaque valeur de notre liste "prog" afin de pouvoir fournir à notre prochaine fonction une liste numérotée à partir de zéro .
Pour ce faire, nous utilisons la fonction mapcar du Lisp pour appliquer -1 à chaque valeur de la liste et nous stockons le résultat dans la variable prog.prep.

(setf prog.prep (mapcar (lambda(x) (- x 1)) prog))
=> (0 4 5 3 4 0 5 3 4 0 3 1 3 4 3 1 4 3 1 3 4 5 3 4)

Maintenant, passons à la génération des accords utilisant la fonction harmonic-progression que nous stockons dans la variable accords:

(setf accords (harmonic-progression prog.prep '(d4 major)))

Les paramètres passés à la fonction sont notre liste de degrés "prog.prep" et une gamme ou échelle avec une note fondamentale de base (ici d4).

Voici la sortie de cette fonction en notation dans Opusmodus:

Capture d’écran 2016-02-25 à 13.28.42

Bien entendu, nous ne sommes pas limité aux gammes Majeures et mineures, nous pouvons utiliser n'importe quelle échelle ou structure de hauteur disponible ou générée dans Opusmodus, en voici quelques exemples:

(setf accords (harmonic-progression prog.prep '(d4 messiaen-mode5)))

Capture d’écran 2016-02-25 à 13.34.15

(setf accords (harmonic-progression prog.prep '(c4 acoustic-scale)
:root '(d4 f4 g4 e4 bb3)))

Capture d’écran 2016-02-25 à 13.36.30

(setf accords (harmonic-progression prog.prep '(d4e4fs4gs4as4c5ds5)
:root '(d4 f4 g4 e4 bb3)))



Capture d’écran 2016-02-25 à 13.38.30

un dernier exemple utilisant le mot clef :relative qui permet une transition plus douce entre les accords grâce à une conduite des voix relative d'accord en accord:

(setf accords (harmonic-progression prog.prep '(d4e4fs4gs4as4c5ds5)
:root '(d4 f4 g4 e4 bb3)
:relative t))

Capture d’écran 2016-02-25 à 14.23.36


Une fois ces accords générés, vous pouvez les utiliser comme bon vous semblera dans Opusmodus, soit en les appliquants sur des structures musicales avec la fonction tonality-map soit tel quel, comme matériaux de base pour créer des réservoirs de hauteurs ou autres matériaux.

SB.