Variations Musicales: Meta Variations Goldberg

Dans ces pages, nous allons décrire différents procédés pour manipuler harmoniquement des morceaux de musique. Il s’agira de partir d’un fichier MIDI, et de produire des variations, en modulant la hauteur des notes, selon des règles systématiques, un peu à la manière de l’Oulipo[1] (l’Ouvroir de Littérature potentielle), mais appliqué cette fois ci à des notes de musique. Il existe par ailleurs des projets OuMupo (pour ‘Ouvroir de Musique Potentielle’), dont on peut retrouver les travaux sur le web[2]

Les substitutions et permutations de notes que nous allons opérer n’ont de sens que dans le cadre tempéré, le choix d’un morceau de J.S. Bach semble de bon ton. Notre point de départ sera donc le premier mouvement des Variations Goldberg,  sous forme de fichier MIDI.

Enfin, certains des procédés décrits ici sont utilisées dans certaines créations du groupe Capture, monté à l’initiative de Grégory Chatonsky.

Analyse du fichier

La première chose a faire, est de procéder à une analyse du fichier midi. Revenons brièvement sur la façon dont les informations musicales sont représentées dans un tel fichier.

MIDI

Un fichier audio (WAV, MP3, OGG), contient des échantillons sonores qui peuvent être directement transmis vers un convertisseur analogique (et un haut parleur) pour être rendus audibles. Un fichier MIDI s’apparente plutôt à la partition d’un morceau de musique: il ne contient que des informations symboliques: les notes jouées, leur hauteur, leur durée,  à quel moment, avec quelle vélocité, etc.

Le fichier MIDI est donc bien plus compact qu’un fichier audio, et nous donne accès (quasi) immédiat aux informations symboliques qui nous intéressent, donc bien plus simple à analyser et manipuler qu’un fichier audio.

Bien entendu, la contrepartie, c’est qu’il ne contient aucune information audio, et donc pour être écouté, doit être interprété au préalable par un synthétiseur. Ainsi, rien ne garantit la qualité de la restitution audio :  selon le synthétiseur utilisé, le rendu sonore peut grandement changer. Ici nous utiliserons le synthétiseur logiciel Fluidsynth[3] qui fonctionne à partir de ‘fontes sonores’ (ou soundfonts) pour interpréter un fichier MIDI. Un exemple d’interprétation de notre fichier initial, à l’aide de la fonte standard distribuée avec fluidsynth peut être écoutée ici :

Aussi, j’invite le lecteur à focaliser son attention sur les mélodies et notes jouées, et non pas la qualité et le timbre des instruments: ce n’est pas le propos.

Pistes et messages

Selon la norme MIDI[4][5], un message Midi est l’élément de base pour décrire un morceau de musique. Les évènements les plus importants qui peuvent se produire sont les suivants :

  • Note On / Note Off : décrit l’action de jouer et relâcher une note à des instants précis
  • Program Change : Permet de choisir l’instrument à utiliser pour interpréter des notes
  • Wheel Pitch
  • Meta Commandes, qui concerne tout ce qui n’a pas directement attrait à la notation musicale : Par exemple la méta commande “End Of Track” indique la fin d’une  piste.

Les messages qui vont nous intéresser le plus sont bien sur “Note On” et “Note Off”. Ils décrivent le fait de jouer une note à l’aide des paramètres suivants :

  • Le pitch, qui définit la hauteur du son, c’est à dire une note jouée à une octave donnée. Par exemple, le pitch 48 (= 12*4) est un Do à la 4ème octave (en numérotant les octaves a partir de 0), ce que l’on note C4. Le pitch 49 correspond au C#4, et ainsi de suite.
  • La durée, qui est déduite de l’intervalle de dates entre un l’événement Note On et l’événement Note Off associé.
  • La vélocité : C’est l’intensité avec laquelle la note est jouée.

Enfin, tous les message sont associés à une piste, et la plupart du temps à un canal (les meta commandes sont une exception). Un fichier MIDI est une simple mise a plat d’une partition : tous les évenements MIDI, sont regroupés et stockés séparément pour chaque piste.

Analyse de la partition

Nous allons maintenant procéder à une analyse très naïve de la partition : je ne prétends pas m’y connaitre en musicologie! Par contre, l’avantage qu’elle soit superficielle, c’est qu’elle peut aisément être transcrite sous forme d’algorithme, et donc être automatisée. Quelques considérations générales :

  • Le fichier contient 964 messages ‘Note on’, ainsi que 964 ‘Note Off’: Chaque Note Off est associé à un Note On, ce qui permet de déduire la durée de chaque note.
  • Il contient 1 seule piste
  • La durée est d’environ 3 minutes 37
  • Ce morceau contient deux voix

Intéressons nous un instant à la distribution des notes dans ce fichier. Pour cela, rien de plus simple, il suffit de compter le nombre de Do, de Ré, Mi, etc. Bien entendu, il peut exister des occurrences de la même note à différentes octaves, on ne fera pas de distinction entre elles. Comme on se focalise sur l’harmonie, on peut considérer  -du moins dans un premier temps- que les différentes octaves d’une note sont équivalentes. Le tableau suivant indique le nombre d’occurrence pour chaque note, dans le morceau original :

On rappellera la notation Anglo-Saxonne, avec A=La, C=Do, Gb=Sol bémol=F#=Fa Dièse, etc. On peut ensuite trier les notes par leur nombre d’occurence, c’est le SOL qui est en tête avec 176 occurences :

Si l’on isole ensuite les 7 notes les plus rencontrées (G A E B F# D C), on peut constater qu’elles correspondent à la gamme de Sol Majeur (G), ici indiquée avec les notes rangées dans l’ordre croissant :

G   A   B   C   D   E   F#  G
  1   1   ½   1   1   1   ½

Sur la seconde ligne, ce sont les intervalles entre les notes consécutives de la gamme (c’est sa signature). On peut donc déduire que la tonalité générale de ce morceau est en sol majeur. On pourrait aussi en déduire qu’elle s’inscrit aussi dans une gamme de Mi mineur (les deux gammes sont exactement composées des mêmes notes – seul l epoint de départ change), mais le fait qu’il y a ait 176 Sol et 132 Mi fait pencher en faveur du Sol Majeur. C’est une approche très heuristique, certes! Elle néglige les accidents et modulations. Il faudrait élaborer une version plus complexe de l’algorithme d’analyse, qui décompose par exemple le morceau en régions, selon leur tonalité dominantes. Pour le moment, et étant donné le choix du morceau étudié, cette première analyse nous suffira.

Il reste 56 notes qui ne font pas partie de la tonalité de Sol Majeur (soit environ 6% des notes totales) : 28 C# (ou Db), 22 D# (ou Eb), 6 Fa.

Projections/Réductions harmoniques

Il est temps maintenant de produire de nouveaux fichiers MIDIs. Nous pourrions faire toute sortes de modifications sur cette partition, par exemple la jouer à l’envers (à écouter ici), modifier la vélocité ou la durée des notes, mais ici nous allons nous intéresser essentiellement à la hauteur des notes.

En particulier, nous allons projeter les notes de la partition initiales vers d’autres notes, ce que l’on représentera par un schéma comme celui ci :

Dans cet exemple, on force en quelque sorte les notes à correspondre à une gamme de Sol Mineur. Il ne s’agit pas de ré-harmoniser les morceaux, mais de les rendre ‘compatible’ avec une tonalité donnée. Le résultat est entre une réduction du nombre de notes (ici les notes qui ne sont plus jouées du tout : G#, B, C#, E, F#), et un décalage qui altère l’harmonie, à écouter et à comparer au morceau original.

La première phrase avant et après transformation est  montrée ici :

Si l’on analyse le morceau après transformation, on constatera sans surprise qu’il sera classé dans tonalité de Sol mineur (ou Si majeur)

Sacrilège! Nous avons écorché, édulcoré, affadi la musique de Bach! J’espère que le compositeur, la ou il se trouve, ne nous en voudra pas…  Mais nous n’allons pas en rester là.

Si l’on procède à toutes les projections similaires vers des modes mineurs, et que l’on compte le nombre de notes altérées, on obtient cette distribution (j’ai ajouté des liens vers les version Midi et Audio pour quelques unes des projections qui m’ont semblé pertinentes) :

  • Cmin7 : 564 / 964 (midi | ogg)
  • Gmin7 : 414 / 964 (midi | ogg)
  • Dmin7 : 304 / 964 (midi | ogg)
  • Amin7 : 176 / 964
  • Emin7 : 56 / 964
  • Bmin7 : 114 / 964
  • Gbmin7 : 290 / 964
  • Dbmin7 : 378 / 964 (midi | ogg)
  • Abmin7 : 528 / 964
  • Ebmin7 : 654 / 964
  • Bbmin7 : 696 / 964
  • Fmin7 : 646 /964

Les plus observateurs auront remarqué que l’ordre selon lequel les projections sont listées correspond à celui des quintes successives (le D est la quinte du G, le A celle du D, etc.). En conséquence, une seule note change d’une ligne a l’autre.

On constate la encore que la tonalité Mi Mineur (ou Sol Majeur) est bien celle qui domine le morceau original: avec 56 notes modifiées (ce sont celles que l’on a comptabilisé lors de l’analyse). Plus l’on s’éloigne de cette tonalité, plus de notes sont substituées (le maximum étant de 696 notes, pour la projection en Bb (le triton de E)).

Si l’on écoute le résultat après projection vers Db mineur, on se rend compte que le nombre de notes est encore plus réduit. En effet, il s’agit quasiment d’une pentatonique si l’on néglige le D#, qui n’apparaît que 22 fois (soit 2.28% du nombre total de notes):

Pentatoniques

Essayons des projections vers des gammes pentatoniques. Je ne connais pas le nom du mode/de la gamme représentés sur le schéma suivant :

Elle produit en tout cas des sonorités “orientales” très intéressantes :

La encore, si l’on essaye toutes les combinaisons, on constate sans surprise que la projection vers cette pentatonique, en B est la plus proche de l’originale, même si fortement altéré (30% des notes sont changées)

Final

Pour terminer ce premier aperçu des possibilités offertes avec le type de procédé décrit ici, voici un exemple de permutation: Cette fois ci, chaque note est substituée à une autre, plus aucune note ne disparait.

Dans les parties suivantes, nous verrons d’autres transformations, dont certaines feront même appel à des algorithmes d’apprentissage! Nous les essaierons sur d’autres morceaux de musique.

Reférences

software design & creative process