2.Représentation interne...  
Retour à la Page principale
4.Conclusion et Références
 

3. Opérateurs rythmiques

Si le travail sur le domaine des hauteurs a déjà fait l’objet de nombreuses recherches et théories, le domaine du rythme lui est beaucoup moins bien fournit. En particulier, les opérateurs directement appliqués au rythme s’intéressent le plus souvent à un problème précis : la quantification. Cette opération consiste à simplifier un ensemble de données temporelles suivant une unité minimale, créant des distorsions dans les structures musicales mais, en contrepartie, permettant par exemple de les afficher graphiquement ou de corriger les imprécisions temporelles d’un enregistrement Midi [Agon 94], [Assayag 97], [Assayag 94], [Brown 91], [Desain 91], [Vérière 93].

Les opérateurs réalisent des transformations complexes sur les structures musicales sans faire de concessions sur le plan temporel, en mettant à profit l’organisation hiérarchique des structures temporelles intégrée dans OpenMusic.

Nous avons conçu un ensemble d’opérateurs que nous estimons utiles pour les utilisateurs du logiciel. Cette panoplie n’est pas exhaustive, mais elle vise à mettre en évidence un cadre général de travail sur les structures temporelles que l’on pourra éventuellement réutiliser pour la réalisation d’autres opérateurs.

Parmi les opérateurs réalisés, les étirements temporels seront décrits dans la section 3.1 La fusion de structures musicales apparaît en section 3.2. Très proche de cette dernière opération le masquage d’une structure musicale par une autre sera finalement décrite en 3.3.
 

3.1 Extension / compression temporelle

Les étirements temporels sont un premier type d’opérateurs rythmiques dont la réalisation se prête bien à la définition hiérarchique des objets. Cette opération prend en argument d’une part la structure musicale que l’on souhaite transformer et d’autre part un facteur d’étirement exprimé sous la forme d’un ratio n / p.
Localement, un container muni d’une qvalue q et d’une durée e, étiré d’un ratio n / p a simplement une durée e * n dans une fraction de la noire q * p. Les positions relatives p1,...,pn des éventuels sous containers deviennent alors p1*n,...pn*n dans la nouvelle fraction de la noire q*p
Figure 6 : Description locale de l'algorithme d'étirement temporel

L’algorithme d’extension / compression temporelle parcourt donc récursivement la structure, en profondeur d’abord, en modifiant  les champs qvalue et extent des objets, et en mettant éventuellement à jour, pour les containers, les différents offsets de ses sous objets.
 

3.1.1 Exemple d’étirement temporel

Prenons par exemple, comme structure initiale, la voix décrite Figure 7
 
Figure 7 : Structure initiale pour l'étirement temporel

Le résultat de la compression temporelle de cette structure initiale par un facteur 1/2 est donné sur la Figure 8 : simplement, les croches de triolet deviennent des double croches de triolet, le demi soupir de triolet devient un quart de soupir de triolet, la noire devient une croche et la blanche devient une noire

Figure 8 : Compression d'un facteur 1/2

Si nous effectuons maintenant un étirement de facteur 3/2 (c’est à dire une extension), la croche de triolet devient une croche et la structure ternaire disparaît.
 

Figure 9 : Extension d'un facteur 3/2
On remarquera que le résultat obtenu et présenté Figure 9 contient des mesures augmentées. Dans ce cas précis, une simplification était envisageable, en étirant le chiffrage d’un même ratio, c’est à dire en écrivant deux mesures à 3 / 4. Dans des cas plus complexes, le résultat de l’étirement n’est pas toujours facile à représenter en notation musicale.
 

3.2 fusion de structures musicales :

L’opérateur de fusion prend en argument deux structures musicales et rend comme résultat une structure dans laquelle seront regroupés l’ensemble des éléments terminaux des structures initiales. Lorsque plusieurs notes interviennent simultanément, elles sont regroupées à l’intérieur d’un accord.

Une manière de raisonner pour réaliser cet opérateur consiste à considérer une structure musicale comme étant composée d’une part d’une ossature, c’est à dire la structure initiale privée de ses éléments terminaux, et d’autre part d’une frange, constituée de la liste de ses éléments terminaux.
 

Figure 10 : Schéma général de l'opération de fusion
A partir de ce point de vue, l’opération de fusion consiste à calculer une nouvelle frange, une nouvelle ossature, et enfin à appliquer cette frange à l’ossature. Le schéma général de cette opération est décrit Figure 10 : les sections suivantes en détaillent les divers composants.
 

3.2.1 Extraction de l’ossature

L’extraction de l’ossature est une opération simple consistant à parcourir récursivement la structure initiale en supprimant les éléments terminaux. Cependant, l’étape de calcul d’une ossature commune (décrite en 3.2.4) nécessite de détecter les éventuelles subdivisions irrégulières (triolets, quintolets, septolets,...) qui appartiennent à la structure. Or, cette opération n’est possible qu’en examinant chaque container et particulièrement la manière dont son contenu est réparti. Pour que cette opération soit toujours possible à partir des ossatures, les éléments terminaux de la structure initiale sont remplacés par des containers vides (reprenant leurs propriétés temporelles) dans l’ossature extraite.
 

3.2.2 Extraction de la frange

Au contraire, l’extraction de la frange consiste à construire une liste des éléments terminaux qui se trouvent dans la structure. Pour que l’information soit conservée intégralement, il faut que les offsets des éléments terminaux récoltés soient exprimés de manière globale, et non plus relativement au container d’ordre supérieur qui les contient. De manière récursive, le calcul d’un offset absolu se fait localement par la somme de l’offset local relatif et de l’offset absolu du niveau immédiatement supérieur. Cette règle est appliquée récursivement jusqu’à la racine de la structure pour laquelle l’offset absolu vaut zéro (le paramètre offset de la racine d’une structure n’a pas d’interprétation possible puisque la racine n’est justement pas contenue dans une structure d’ordre supérieur qui en définirait la qvalue).
 

3.2.3 Calcul de l’union des franges

L’union des franges consiste à rassembler deux franges (données initialement) en une seule. Cet algorithme requiert un minimum de précautions de manière à éviter les chevauchements. En effet, la frange résultante doit pouvoir être intégrée dans un objet de type sequence, qui interdit tout chevauchement dans son contenu. Pour ce faire, les notes présentant une partie commune avec celles de l’autre frange vont être fragmentées (comme décrit sur la  Figure 11) de manière à ce que les parties communes puissent être directement intégrées dans un objet de type chord (accord) et que le résultat ne présente finalement plus de chevauchements.
Figure 11 : exemple d'union de deux franges

Dans l’exemple présenté Figure 11, les deux premières notes de la frange 1 ainsi que la première note de la frange 2 sont fragmentées. Deux accords vont être introduits afin que plus aucune superposition n’apparaisse dans le résultat. De plus, les notes qui sont fragmentées lors de cette opération doivent apparaître de manière liée sur le résultat. Il est donc nécessaire de mettre correctement à jour le champ tie (liaison) des différents fragments, qui prend une des trois valeurs : begin (lorsque la note considérée est la première d’une suite de notes liées), continue (lorsque la note est à l’intérieur d’une suite de notes liées) ou end (lorsque la note est la dernière de la suite).
 

3.2.4 Calcul d’une ossature commune

Cette opération consiste à construire, à partir des ossatures obtenues précédemment par extraction, une ossature commune capable de recevoir et contenir correctement les éléments terminaux résultant de l’union des franges. Une solution naïve consisterai à ne garder que la plus longue des deux ossatures extraites. Cette solution fonctionne correctement tant que les ossatures initiales ne contiennent pas de subdivisions irrégulières (triolets, quintolets, etc.). Lorsque des subdivisons irrégulières sont présentes, il est nécessaire d’en conserver des traces : en effet, lorsque l’on « plonge » directement un triolet dans un quintolet, par exemple, le résultat obtenu se décrit précisément à l’aide de valeurs exprimées en quinzième de sa durée, sur un seul niveau d’imbrication. Le résultat est alors un quinzolet, ce que nous cherchons précisément à éviter (c.f. section 2.2). La solution retenue consiste donc à propager, pour l’exemple précédent, la subdivision par trois à l’intérieur du quintolet. L’ossature ainsi construite est alors préparée à rendre compte d’une imbrication de subdivisions irrégulières (Figure 12).
 
Figure 12 : Propagation d'une subdivision par 3 dans une subdivision par 5

Suivant cette méthode, une des deux ossatures initiales va devenir englobante. L’autre, dont on propage les subdivisons irrégulières, est considéré comme englobée. Le choix de l’une ou de l’autre ossature comme englobante n’est pas innocent et s’avère relativement délicat dans certains cas : il amène à des résultats équivalents sur le plan temporel, mais différents au niveau de la notation musicale. Cet aspect est mis en évidence dans l’exemple de fusion de structures musicales donné dans la section 3.2.6.
 

3.2.5 Application de la nouvelle frange à la nouvelle ossature

Pour finir,  cette dernière étape consiste à reporter l’union des franges dans l’ossature commune que l’on vient de construire. Cette  opération est décrite localement à un container et s’applique récursivement à toute la structure dérivant de ce container. Elle prend en argument une liste d’objets terminaux à insérer. Si le container possède des sous-structures, il commence par passer cette liste successivement à chacune d’entre elles : la liste intégrale est d’abord passée à la première sous structure, puis la liste rendue est passée à la seconde, et ainsi de suite. Finalement le container examine les éléments restant dans la liste rendue par la dernière sous structure, en conserve les éléments qui lui reviennent (les éléments terminaux qui s’insèrent dans son contenu et ne s’insèrent pas dans le contenu de ses sous-structures) et rend le reste comme résultat (éventuellement au container hiérarchiquement supérieur).
La Figure 13 décrit comment l’algorithme d’application d’une frange à une ossature se déroule dans un exemple précis. Nous partons d’une part d’une frange constituée de deux éléments terminaux A et B (des notes), et d’autre part d’une ossature constituée de quatre containers C1, C2, C3 et C4. C’ est imbriqué dans C3, C2 et C3 sont imbriqués dans C1 (c.f. Figure 13, dans laquelle l’axe horizontal représente la position temporelle). L’opération est réalisée en 5 étapes successives en appliquant à chaque fois l’algorithme local, tel qu’il a été décrit précédemment.
Pour que le résultat obtenu dans l’étape 5 soit tout à fait exact, il faut mentionner le contrôle des liaisons musicales puisque les notes A et B ont été fragmentés, d’une part en A1, A21 et A22, et d’autre part en B1 et B2. Cette gestion se fait comme dans le calcul de l’union des franges,  en mettant à jour le champ tie des différents fragments.
 
Figure 13 : Déroulement de l’algorithme d'application d'une frange à une ossature
 

3.2.6 Exemple de fusion de structures musicales

Pour terminer nous donnons un exemple de fusion. Les structures initiales sont représentées Figure 14. Cet exemple met en valeur un point important qu’est le choix de la structure englobante et de la structure englobée qui est fait lors du calcul de l’ossature commune (décrit en 3.2.4)
 
Figure 14 : structures initiales pour l'opération de fusion

La Figure 15 présente le résultat de la fusion des structures initiales de la Figure 14. La mesure de gauche correspond au cas où le triolet est considéré comme englobant, c’est à dire que la subdivision par 5 a été propagée dans la subdivision par trois. La mesure de droite représente le cas contraire, où le quintolet est englobant.

 
Figure 15 : résultat de l'opération de fusion. A gauche, la structure englobante est le triolet. A droite, c'est le quintolet.

Si les deux résultats sont exacts et équivalents du point de vue temporel, celui de droite peut être préférable, car plus simple : dans le résultat de gauche, toutes les impulsions du triolet sont nécessairement subdivisées en 5, tandis que dans le résultat de droite, seuls les deuxième et quatrième impulsions du quintolet sont subdivisées en trois. Dans un cadre général, le choix de l’ossature englobante est une opération délicate à réaliser. En particulier, il peut être nécessaire de la construire à partir de partie de fragments des deux ossatures initiales.
 

3.3 Masquage de structures musicales.

L’opération de fusion décrite précédemment induit un cadre général de travail pour définir un ensemble d’opérateurs symboliques qui mettent en regard des structures différentes. En particulier, l’opération de masquage d’une structure rythmique par une autre se déduit quasiment directement de l’opération de fusion.

Cette opération consiste à rendre muette une structure musicale lorsqu’une autre est active. Si le résultat correspond à une sous partie de la première structure, celui-ci  sera quand même imprégné de l’aspect rythmique de la deuxième.  Ainsi, le calcul  d’une ossature commune reste nécessaire et est réalisé de la même manière que dans l’opération de fusion. En revanche, le calcul de la nouvelle frange va différer : les deux franges initiales sont extraites comme précédemment, mais l’union des franges est remplacée par le masquage de la première frange par la seconde, illustré Figure 16 par un exemple.

Figure 16 : Masquage d'une frange (donnée) par une autre (masque)

Finalement, comme dans l’opérateur précédent, la structure résultante est calculée comme l’application de la nouvelle frange à la nouvelle ossature.
 

Figure 17 : Structures initiales pour le masquage. La première sert de donnée et la seconde de masque.
 
Figure 18 : Résultat. La portée de gauche représente l’opération de masquage initiale. Celle de droite correspond au masquage inverse. La fusion des deux résultats permet de retrouver la structure initiale.

Le masquage inverse est réalisé en calculant un masquage des franges avec un opérateur logique différent. C’est un résultat qui peut également s’avérer intéressant : le résultat correspond en fait au masque, dans lequel les hauteurs ont été remplacées par celles de la structure initiale (Figure 18, portée de droite). Il peut être utilisé, par exemple, lorsque l’on souhaite filtrer une trame harmonique à l’aide d’une séquence rythmique.