• Aucun résultat trouvé

10.1.1 Contraindre la recherche pour mieux l’orienter

La notion générique de contrainte a été introduite au paragraphe 7.5. Nous l’avions alors définie comme une condition que doivent satisfaire les attributs d’une configuration. Rappelons qu’à la différence des descripteurs, qui caractérisent le timbre selon une dimension perceptive, les attributs sont les paramètres symboliques de l’écriture musicale (instrument, note, mode de jeu, dynamique, sourdine. . .). Les contraintes portées sur les attributs ne restreignent donc l’espace des timbres qu’indirectement, en limitant les possibilités combinatoires dans l’espace des attributs (ou espace des décisions — voir section 7.6).

La contrainte la plus évidente à imaginer est la contrainte de capacité, liée aux limitations de l’effectif orchestral : si l’orchestre ne comprend par exemple que deux violons, l’attribut « instrument » ne pourra prendre la valeur « violon » qu’au plus deux fois, sans quoi la solu-tion n’est pas réalisable. Le caractère incontournable des contraintes de capacité nous a fait adopter au paragraphe 9.2 une modélisation du problème permettant de s’en affranchir. Une orchestration est représentée par un N -uplet donc chaque coordonnée correspond à un instru-ment précis de l’orchestre, si bien qu’une configuration obtenue par instanciation aléatoire des variables ou par une opération génétique (voir section 9.2.1) est toujours consistante avec les

140 CHAPITRE 10. GESTION DES CONTRAINTES

contraintes de capacité. D’une façon plus générale, on dira que la consistance est garantie pour toute contrainte de cardinalité maximale placée sur l’attribut « instrument », quelle que soit la valeur de ce dernier. Mais, nous allons le voir, il existe bien d’autres types de contraintes, portant sur d’autres attributs.

Notre expérience avec les compositeurs au cours de notre recherche d’une part, et celle plus générale des contraintes en composition assistée par ordinateur d’autre part, nous enseignent qu’à l’exception des problèmes de composition entièrement formalisables par la PPC1, il est très difficile de spécifier des contraintes en dehors d’un « contexte » musical. Imaginons le cas d’un compositeur désirant orchester une série d’accords et disposant déjà de l’orchestration du premier. Selon le degré de contraste désiré à chaque changement d’accord, on peut imposer pour l’accord courant d’avoir au plus ou au moins un certain nombre de notes communes avec le précédent. Aussi rudimentaire soit-il, l’accord initial constitue déjà un « contexte » : c’est ici un point de départ, ce sera ailleurs un point de passage, ou un point d’arrivée. « Contraindre une orchestration », c’est donc déjà penser le matériau musical dans sa mise en temps, dans ses relations temporelles aux autres objets musicaux. Or notre outil d’orchestration a été conçu comme un environnement hors temps d’exploration du timbre : il produit une matière, un objet « brut » que le compositeur devra « polir » avant de l’insérer dans la composition. De fait, dans la grande majorité des cas, tous les problèmes d’orchestration commencent sans contraintes.

Bien souvent toutefois, les critiques faites aux suggestions d’orchestration — dans le cas où elles ne satisfont pas le compositeur — portent certes sur leurs propriétés timbrales, mais aussi sur leurs attributs : telle hauteur est présente dans la cible et manque dans l’orchestration, tel mode de jeu est inaudible en présence d’instruments jouant fortissimo, telle sourdine est nécessaire, la densité harmonique (i.e. le nombre de hauteurs différentes jouée simultanément) est trop faible ou trop forte, l’orchestration mobilise une trop grande ou trop petite proportion de l’orchestre, etc. La possibilité d’ajouter des contraintes sur les attributs est alors bienvenue pour « guider » la recherche vers des solutions plus pertinentes. Certes ces contraintes ne viennent pas spontanément au compositeur, mais elles surgissent en réaction aux solutions « libres » retournées par le système. D’un certain point de vue, on peut dire qu’elles viennent combler les carences éventuelles de la description du timbre (voir section 8.1) qui, dans certains cas, ne suffit pas pour découvrir les solutions les plus proches de la cible au sens perceptif.

10.1.2 Langage élémentaire de contraintes

D’un point de vue formel, nous définissons donc une contrainte par la donnée d’un attribut, d’un opérateur, et deux éléments optionnels :

<attribut><opérateur ><quantité (opt.)><valeur (opt.)>

En théorie, n’importe quel attribut est recevable : instrument, famille, hauteur, mode de jeu, dynamique, sourdine, corde. . . si cela bien sûr a un sens musicalement. Quant aux opérateurs, ils se répartissent en trois catégories selon le nombre d’arguments supplémentaires qu’ils re-quièrent, comme l’indique le tableau 10.1.

L’opérateur all-diff associé à un attribut A signifie que toutes les composantes de l’orches-tration doivent avoir des valeurs différentes pour l’attribut A.

1

Les problèmes de séries d’intervalles, de suites d’accords ou de canons rythmiques, pour n’en citer que quelques uns, appartiennent à cette catégorie — voir à ce sujet la thèse de Charlotte Truchet [Tru04].

10.1. CONTRAINTES EN ORCHESTRATION 141

Tab. 10.1 – Opérateurs d’arité variable exprimant des contraintes sur les attributs des confi-gurations.

Opérateur Argument 1 Argument 2

all-diff -

-at-most-diff quantité n

-at-least-diff quantité n -at-most quantité n valeur v

at-least quantité n valeur v

Ex.1 – « L’orchestration ne doit jamais impliquer deux fois la même hauteur » s’écrit :

<attribut=“note”><opérateur =“all-diff ”>

L’opérateur at-most-diff (respectivement at-least-diff ) associé à un attribut A et à une quan-tité n signifie que l’orchestration doit comporter au plus (respectivement au moins) n valeurs différentes pour l’attribut A.

Ex.2 – « L’orchestration doit impliquer au minimum trois cuivres » s’écrit :

<attribut=“famille”><opérateur =“at-least-diff ”><quantité=“3”><valeur =“brass”>

Ex.3 – « Tous les instruments doivent jouer avec la même dynamique » s’écrit :

<attribut=“dynamique”><opérateur =“at-most-diff ”><quantité=“1”>

L’opérateur at-most (respectivement at-least) associé à un attribut A, une quantité n et une valeur v signifie que l’orchestration doit comporter au plus (respectivement au moins) n fois la valeur v pour l’attribut A.

Ex.4 – « Au moins deux cordes doivent jouer avec le bois de l’archet » s’écrit :

<attribut=“mode-de-jeu”><opérateur =“at-least”><quantité=“2”><valeur =“legno-tratto”>

Ex.5 – « Au plus deux instruments peuvent jouer fortissimo » s’écrit :

<attribut=“dynamique”><opérateur =“at-most”><quantité=“2”><valeur =“ff ”>

Ces cinq opérateurs permettent de définir un langage de contraintes simple, expressif, et facilement extensible par l’ajout de nouveaux attributs. On pourrait très bien imaginer, par exemple, un attribut qui précise quel instrumentiste est requis pour émettre le son considéré. Tous les sons de flûte, flûte basse et flûte picolo peuvent en effet être produits par un flûtiste. Si l’orchestre n’en comprend qu’un seul, alors la contrainte :

<attribut=“instrumentiste”><opérateur =“at-most”><quantité=“1”><valeur =“flûtiste”>

permet d’effectuer la recherche avec tous les sons de flûte tout en garantissant qu’un seul son sera compris dans l’orchestration. Le même raisonnement est évidemment valable pour les clarinettistes, trompettistes, trombonistes, saxophonistes et percussionnistes, qui peuvent être amenés à changer d’instrument au cours d’une même œuvre.

Nous avons en outre pourvu notre langage de deux opérateurs de cardinalité globale : size-min et size-max. Comme leur nom l’indique, ils permettent de size-minorer ou de majorer le nombre

142 CHAPITRE 10. GESTION DES CONTRAINTES

Tab. 10.2 – Contraintes de cardinalité globale Opérateur Argument 1 Argument 2

size-min quantité n

-size-max quantité n

-d’instruments impliqués dans une orchestration. Ces opérateurs sont d’un grand intérêt lorsque le compositeur veut augmenter la « masse orchestrale » ou au contraire réserver une partie de l’orchestre pour un matériau musical se superposant à la texture proposée par l’outil.

Pour les raisons évoquées au début de cette section, les contraintes liées à l’exécution — i.e. au déroulement de la musique dans le temps — ne sont pas prises en compte au sein de notre système. Modéliser le potentiel sonore des instruments hors de tout contexte temporel est une tâche difficile, mais abordable — du moins partiellement — dans le cadre d’une thèse. Maîtriser les possibilités d’enchaînement de timbres réalisables par un instrument solo est d’une complexité bien supérieure, et ne parlons même pas de l’infinité de variations que peut produire un orchestre. Nous verrons cependant en fin de chapitre de quelle manière les contraintes peuvent être utilisées pour transformer progressivement une orchestration, sans toutefois disposer d’une formalisation temporelle du timbre. L’évolution sera alors contrôlée non pas par des descripteurs perceptifs, mais par les attributs symboliques des configurations successives.

10.1.3 Fonctions de coût

La notion de « fonction de coût » a été introduite au paragraphe 7.5. Elle s’appuie sur le concept de « contraintes molles » (soft constraints) avec lequel les méthodes de recherche locale sont famillières (voir paragraphe 6.4.1) : chaque contrainte est remplacée par une fonc-tion de coût positive que l’on cherche à minimiser. Cette dernière est nulle si et seulement si la contrainte est satisfaite, et de valeur d’autant plus élevée que la contrainte est vio-lée. L’idée sous-jacente est qu’on a d’autant plus de chance de parvenir à une configuration consistante que la configuration initiale viole peu les contraintes. En d’autres termes, nous supposons la fonction de coût globale, obtenue par sommation des fonctions de coût associées aux contraintes, est localement monotone.

Nos fonctions de coût ne dépendent que de l’opérateur impliqué dans la contrainte : at-most, at-least, at-most-diff, at-least-diff, all-diff, size-min, size-max. Nous les construisons selon la règle suivante : elles renvoient le nombre minimum de variables à modifier pour que la contrainte soit satisfaite. Elles sont calculées à partir de la représentation des configurations introduites à la section 9.2 : chaque variable correspond à un instrument, et chaque valeur à un son jouable par l’instrument. Une requête préalable dans une base de donnée permet de retourner, pour chaque son, la valeur de l’attribut impliqué dans la contrainte avant d’en calculer la consistance. Dans la suite de cette section, nous désignons respectivement par n et v les premier et second arguments éventuels de nos opérateurs.

10.1. CONTRAINTES EN ORCHESTRATION 143

at-most, at-least

Soit nv le nombre de fois où apparait la valeur v dans la configuration (effectif de la valeur v). On a alors trivialement, pour les opérateurs at-least et at-most :

zat-least = max(nv− n, 0) et zat-most = max(n− nv, 0) (10.1)

at-least-diff

Soit maintenant nAle nombre total de valeurs que peut prendre l’attribut A et (ni)1≤i≤nA les effectifs des valeurs prises par A. Soit δ la fonction indicateur de R

+ (δ(x) = 1 si x > 0, δ(x) = 0 sinon). La fonction de coût pour l’opérateur at-least-diff compte le nombre de valeurs différentes pour l’attribut A et renvoie la différence avec la quantité limite n si cette dernière et supérieure : zat-least-diff = max n− nA X i=1 δ(ni), 0 ! (10.2) at-most-diff

De façon non intuitive, la fonction de coût pour at-most-diff n’est pas la symétrique de la précédente. Soit par exemple la contrainte :

<attribut=”note”> <opérateur =”at-most-diff”> <quantité=”1”> (Tous les instrument doivent jouer la même note)

Soient alors les deux configurations K1 = (C4,A4,C4,A4) et K2 = (C4,C4,C4,A4) (seules les hauteurs ont été mentionnées par souci de lisibilité. Si on compte le nombre de valeurs différentes pour l’attribut A et que l’on renvoie sa différence avec la quantité limite n si cette dernière est inférieure, on obtient alors z(K1) = z(K2) = 1. Autrement dit, il n’y a aucun intérêt pour un algorithme de recherche locale à remplacer A4 par C4 pour la seconde variable, alors queK2 est plus proche de satisfaire la contrainte que K1 (il faut modifier une seule variable dansK2 contre deux dans K1).

Soit ( ¯ni)1≤i≤nA la permutation de (ni)1≤i≤nA pour laquelle les effectifs sont classés dans l’ordre décroissant, ce qui donne (2, 2) pour K1 et (3, 1) pourK2. On a alors :

zat-most-diff = nA X i=n+1 ¯ ni , (10.3) ce qui donne z(K1) = 2 et z(K2) = 1. all-diff

Quant à l’opérateur all-diff, l’idée la plus immédiate consiste à retourner l’effectif maximal moins 1. Toutefois, si nous considérons les deux configurationsK1= (C4,A4,C4,A4) et K2 = (C4,G4,C4,A4), on obtient pour la contrainte all-diff sur les hauteurs les valeurs de coût z(K1) = z(K2) = 1. Encore une fois, un algorithme de recherche locale n’aura donc aucun intérêt à remplacer A4 par G4 pour la seconde variable, alors que K2 est plus proche de satisfaire la contrainte queK1. Alors qu’avec la foncion :

zall-diff =

nA

X

i=1

144 CHAPITRE 10. GESTION DES CONTRAINTES

on obtient z(K1) = 2 et z(K2) = 1.

size-min, size-max

Soit n le nombre de variables dont la valeur est différente de l’élement neutre e (voir section 9.2). On a alors trivialement :

zsize-min= max(n− n, 0) et zsize-max = max(n− n, 0) (10.5)

Consistance globale

Comme la plupart des méthodes de recherche locale, notre algorithme favorise dans ces déplacements les configurations de consistance maximale pour l’ensemble du réseau de contraintes. L’évolution dans l’espace de recherche est donc guidée par une « fonction de coût globale », que nous définissons comme la somme des fonctions de coût associées à chaque constrainte. Elle peut s’interpréter une estimation du nombre de variables à modifier pour parvenir à une solution satisfaisant toutes les contraintes.