Olivier Delerue - Rapport de Stage de DEA - Etude et réalisation d'opérateurs musicaux pour un environnement de composition assitée par ordinateur.

I. Introduction
Retour au Sommaire
III. Développement

II.Présentation des outils


II.1 CLOS (Common Lisp Object System)

    II..1.1 Présentation

    Le langage LISP s'inscrit aujourd'hui de manière de plus en plus unanime comme le langage de référence pour le développement d'applications relatives à la composition musicale. Mieux encore, à ses versions les plus récentes s'intègre le concept " orienté objet " qui autorise une programmation plus souple et plus modulaire (bien que moins pure au niveau du langage lui même) : le langage CLOS s'adapte si bien au développement de logiciels musicaux que l'ouvrage de Desain et Honing [Desain 97] propose l'apprentissage du Lisp orienté objet à partir d'applications musicales.

    Les avantages de la conception orientée objet se font également sensiblement ressentir lors du développement d'applications dans le cadre d'une équipe, où plusieurs informaticiens travaillent simultanément sur les mêmes données. Cette particularité de Lisp, complètement nouvelle pour moi, a donc fait l'objet d'un apprentissage puisqu'elle est largement mise à contribution dans le développement d'OpenMusic.

    Le concept " orienté objet " se résume très simplement suivant les notions élémentaires de classe et de méthode. Une classe s'apparente à la notion de modèle : c'est la description abstraite d'une famille d'éléments qui possèdent des caractéristiques similaires. Celles-ci apparaissent sous la forme d'attributs, de champs, de la classe. Un objet est une donnée structurée sous la forme d'une instance d'une classe, c'est à dire qu'il spécifie concrètement la valeur des différents champs de la classe.

    Par exemple, on peut imaginer une classe " note " munie de deux champs, " hauteur ", exprimée en numéro midi, et " intensité ", exprimée suivant une échelle entre 0 et 127. Alors un " do " quadruple forte, par exemple, serait une instance de cette classe note, pour laquelle le champ " hauteur " prendrait la valeur 60 et le champ " intensité " la valeur 110.

    Ces notions de classe et d'objet viennent se compléter par le concept important qu'est celui de l 'héritage : en définissant un lien d'héritage entre deux classes A et B (B hérite de A par exemple), ont spécifie que B est une sous classe de A, c'est à dire que la classe B est une particularisation de la classe A. Pour reprendre le même exemple, on peut concevoir que la classe " note " hérite de la classe " objets musicaux simples " qui, elle, possède un champ " durée " (en millisecondes par exemple). En d'autres termes, les liens d'héritage définissent un ordre d'imbrication hiérarchique des classes.

    Ce lien d'héritage entre les deux classes rend le champ " durée " accessible depuis n'importe quelle instance de la classe note. La définition d'une note se fait donc finalement comme si celle-ci possédait trois paramètres : hauteur, intensité et durée.

    Ainsi, les liens d'héritage permettent de structurer les champs de la manière la plus générale possible, en les rendant accessibles à toutes les sous-classes qui ont cette particularité en commun : on peut définir, par exemple, depuis la classe Objet musical simple, la classe " silence ", qui par héritage bénéficie du champ durée de sa super-classe. Par contre, elle ne possède aucun champ qui lui est spécifique mais elle autorise,  simplement en observant le type d'instance, la distinction entre un objet note et un objet silence.

    Les méthodes, quant à elles, sont conçues comme des fonctionnalités des objets. Une définition de méthode est donc propre à une classe et s'applique aux objets de la classe. Cependant, les liens d'héritage concernent aussi les méthodes, et toutes les méthodes d'une super-classe sont accessibles par les objets d'une sous-classe. Par exemple, une méthode " étirement-temporel " définie pour la classe " objet musical simple " pourra s'appliquer aussi bien à une note qu'à un silence.

    Pour finir, le polymorphisme est un concept intéressant largement mis à profit dans OpenMusic : plusieurs méthodes dans CLOS peuvent supporter le même nom pour peu qu'elles s'appliquent à des classes différentes. Le même nom de méthode aura ainsi des actions différentes suivant les objets auxquels elle s'applique. Par exemple, la méthode " transpose " pourra être définie d'une part pour les notes et d'autre part pour les silences, de manière à ce qu'elle puisse être utilisée globalement sans se soucier de l'objet auquel elle s'applique. Pour une note, la méthode " transpose " aura donc comme effet d'ajouter une certaine quantité à la valeur " hauteur " de cette note, pour un silence, elle aura le comportement de la fonction identité.

    II.1.2 Fondamentales Virtuelles

    Cette auto-formation à CLOS (Common Lisp Object System) a été l'occasion de développer une application concernant le calcul de fondamentales virtuelles.

    Les motivations de ce problème nous viennent en partie de la psychoacoustique : chacun connaît le mystère de la quarte par exemple, pour les sons de cloches : une hauteur est perçue là où l'analyse spectrale du son ne révèle aucune énergie. Il se trouve que cette hauteur correspond directement à la fréquence fondamentale d'un ensemble de partiels qui, eux, figurent dans le spectre. De même, des études sur le piano montrent que la présence de la fréquence fondamentale n'est pas forcément nécessaire pour percevoir la hauteur d'un son (i.e. en supprimant cette fondamentale, la hauteur perçue reste la même), et les facteurs de piano d'en tirer directement partie, en économisant sur la taille des tables d'harmonie dont les dimensions, pour les pianos droits, ne permettent pas la résonance sur la fréquence fondamentale.  

    Ainsi, il peut être intéressant, étant donné un ensemble de partiels, de chercher une fréquence fondamentale, c'est à dire une fréquence telle que chaque partiel s'écrit comme un multiple entier de cette fondamentale. Cette fréquence existe toujours, quelles que soient les valeurs des différents partiels, pourvu qu'on ne lui impose pas d'être entière et ce calcul a déjà fait l'objet d'une application, " virt-fund " que l'on trouve sous forme de module dans une librairie de PatchWork.

    Plus que le simple calcul d'un plus petit diviseur commun, " virt-fund " autorise une approximation sur les fréquences des différents partiels. En effet, le calcul simple de PGCD mène la plupart du temps à des résultats décevants. Prenons par exemple l'ensemble de partiel suivant : { 100 Hz, 200 Hz, 301 Hz }. Le calcul de PGCD aboutit à une fréquence fondamentale de 1 Hz, dont chaque partiel correspond respectivement aux harmoniques d'ordre 100, 200, et 301. Ce résultat ne fait évidemment pas sens, et une marge de tolérance autour des partiels (exprimée par un facteur multiplicatif, c'est à dire pouvant être définie par l'utilisateur comme un intervalle musical, le quart ou huitième de ton par exemple) permet de repérer alors, dans cet exemple, un spectre de fondamentale 100 Hz, composé des harmoniques 1, 2 et 3.

    Pourtant, ce fonctionnement n'est toujours pas pleinement satisfaisant. En particulier, lorsque l'ensemble des partiels provient de l'analyse spectrale d'un son réalisée par exemple à l'aide d'AudioSculpt (Logiciel d'analyse, synthèse et traitements sonores par manipulation graphique sur Macintosh, développé à l'Ircam par les équipes Interface / Représentation et Analyse / Synthèse), il est possible qu'il intègre des composantes de plusieurs spectres harmoniques mélangés. Le calcul en utilisant " virt-fund " mène alors à la fondamentale des fondamentales des différents spectres, ce qui, du point de vue perceptif, n'est pas forcément très intéressant.

    La problématique s'énonce donc sous une nouvelle forme : étant donné un spectre défini par un ensemble de partiels, il s'agit d'effectuer un classement de ces partiels en sous-spectres harmoniques pour chacun desquels on peut proposer une fondamentale virtuelle raisonnable. Ce classement s'effectue en optimisant certains critères, qui sont ici : un nombre de sous spectres limité, des fondamentales virtuelles de fréquence relativement élevées (et en tout cas situées dans le domaine perceptif pour que le résultat soit exploitable) et éventuellement des spectres relativement " ramassés " autour de leur fondamentale (même de fondamentale élevée, un spectre composé d'harmoniques de rangs trop élevés ne présente pas grand intérêt au point de vue perceptif) : un compromis est à réaliser entre ces critères.  

    Le problème comporte une forte composante combinatoire, et l'algorithme le moins élégant consisterait à évaluer l'ensemble des regroupements possibles pour en déduire le meilleur. Cependant la quantité de calculs réalisés par ces algorithmes augmente trop rapidement avec la taille des données (le nombre initial de partiels) et le temps global de calcul en subit les conséquences. On préférera ainsi davantage s'intéresser à des algorithmes plus rapides même s'il faut limiter la solution à un optimum local.

    Par chance, ce problème s'apparente fortement avec celui étudié en analyse de données, concernant la classification hiérarchique ascendante : une série d'individus mesurés suivant des variables continues sont représentés dans un espace multidimensionnel. On souhaite dégager des tendances de cet ensemble d'individus, c'est à dire les regrouper en familles comportant des similarités sur ces mesures. On suppose disposer d'une mesure de distance entre les individus ou entre des groupes d'individus (un individu pouvant être considéré comme un groupe composé d'un seul élément). Le caractère " ramassé " des groupes constitués se mesure à l'aide des notions d'inertie inter-groupe et intra-groupe.

    L'inertie d'un groupe d'éléments (de pondérations égales à un) correspond à la somme des distances au carré de chaque élément au centre de gravité de l'ensemble. Ainsi, pour un ensemble d'éléments , de centre de gravité , l'inertie de l'ensemble s'écrit : .

    Si l'on considère maintenant une partition de notre ensemble , l'inertie intra-groupe correspond à la somme des inerties locales de chaque partie : . Ainsi, plus cette intertie est faible, plus les groupes sont " ramassés ". L'inertie inter-groupe en est la notion duale : elle correspond à un calcul d'inertie sur l'ensemble des points formés par les centres de gravité de chaque partie, et pondérés par le cardinal de leur partie. Elle s'écrit donc : . Cette grandeur met donc en jeu les distances relatives entre les groupes. 

    Ainsi, un classement intéressant se mesure à une 'petite' inertie intra-groupe (des groupes " ramassés " ) et une 'grande' inertie inter-groupe (les groupes sont relativement distincts ).

     
     6 éléments mesurés suivant deux variables X1 et X2 et réunis en 3 groupes.

       

    L'algorithme de classification consiste à considérer initialement chaque élément comme un groupe constitué d'un seul élément. On dresse un tableau des distances entre ces groupes et on va agglomérer les deux groupes les plus proches. On répète cette phase (en recommençant un nouveau tableau des distances dans lequel les deux groupes agglomérés disparaissent pour être remplacés par leur union) jusqu'à ce qu'il n'y ait plus qu'un seul groupe. On obtient ainsi un ensemble de classements allant du plus grand (tous les individus sont des groupes) au plus petit (tous les individus sont regroupés en un seul groupe).

     
    Exemple de classification hiérarchique ascendante 

    On observe, dans cette classification hiérarchique ascendante de six individus, que les deux dernières agglomérations de groupes se trouvent relativement haut sur l'axe vertical : simplement, ces deux derniers regroupements correspondent à ceux de groupes relativement distants. Ainsi, l'inertie intra-groupe augmente fortement : ces deux derniers regroupements n'étaient pas intéressants.

    La méthode utilisée pour le classement de partiels est assez similaire : les partiels sont considérés comme des individus mesurés suivant une variable continue, la fréquence. Ainsi un spectre harmonique peut être vu comme un regroupement d'individus, et la fréquence fondamentale comme le centre de gravité.

    La fonction de distance est définie de la manière suivante : si un partiel est multiple direct d'un autre, ils sont à distance nulle, et la distance augmente à mesure que la fondamentale du regroupement diminue.

    La programmation orientée objet est un concept qui facilite et clarifie sensiblement la réalisation de cette application. Des objets appartenant aux classes partiel, spectre et regroupement sont crées : un partiel est un objet simple dont l'unique attribut est la fréquence. Un objet spectre contient deux champs : " partiels " qui correspond à la liste de ses partiels et " fondamentale " qui contient la fréquence fondamentale du spectre (plus exactement une liste de fondamentales possibles). Finalement, un objet regroupement correspond à un ensemble de spectres. Ainsi, la fonction d'itération sur les classements successifs devient une méthode, définie pour cette classe d'objets.

    Le résultat de cette procédure est donc un ensemble de regroupements, allant du plus local (l'étape initiale où chaque partiel représente un spectre) au plus global (où l'ensemble des partiels sont regroupés en un seul spectre). L'analyste Jean-Pierre Cholleton a pu tester et apprécier cette application dans le cadre de son travail (analyses d'Arcana d'Edgard Varèse et des cinq accords de référence de Tout un monde lointain d'Henri Dutilleux) : une amélioration prochaine de l'algorithme permettra de spécifier le type de spectres que l'on souhaite utiliser pour le calcul, intégrant ainsi non seulement les spectres purement harmoniques (où chaque partiel est multiple direct de la fréquence fondamentale), mais aussi des spectres tenant compte d'un facteur d'inharmonicité (comme ceux du piano), ou encore des spectres définis par l'approximation en fréquence imposée par la représentation discrète des hauteurs de la notation musicale, en demis tons, quarts de tons, ou huitièmes de tons. 

    Finalement, cette application m'a permis de me familiariser avec les notions de classe et de méthode ainsi que leurs syntaxes. Elle est maintenant intégrée dans l'environnement PatchWork sous forme d'un module contenu dans une librairie. D'autre part, cet exercice n'est pas complètement détaché du reste du travail effectué en stage, plus orienté vers des problèmes touchant davantage le domaine du rythme que celui des hauteurs : en effet, une fondamentale virtuelle sur des durées peut être interprétée comme une durée " unité ", soit une pulsation compatible. En ce sens, notre travail a des applications dans le domaine du rythme, notamment l'extraction de tempo [Assayag 94, Agon 94, Vérière 93].

II.2 OpenMusic

    PatchWork, développé par l'Ircam et Mikael Laurson, est un logiciel parmi les plus puissants et les plus souples en matière d'aide à la composition musicale.  Il est devenu indispensable dans le travail quotidien de nombreux compositeurs représentant les styles de musique les plus variés.

    L'évolution, en terme d'expérience acquise par les utilisateurs de PatchWork, pousse la demande informatique vers des fonctionnalités de plus en plus pointues, nécessitant parfois des changements majeurs à l'intérieur du logiciel. Cependant, à l'heure actuelle, PatchWork accumule une quantité innombrable de petites améliorations qui sont venues se greffer sur les versions successives du logiciel. Le désordre induit par ces modifications rend la maintenance du logiciel très complexe et a motivé l'équipe pour repartir à zéro, imaginer OpenMusic.

    II.2.1 Description Générale

    Ainsi OpenMusic, prenant la suite de PatchWork, reste un environnement de programmation visuelle, c'est à dire qu'il permet de construire des programmes, et que ces programmes s'écrivent non pas en texte comme dans un langage de programmation traditionnel, mais en assemblant des boîtes auxquelles sont associées des fonctionnalités, par des liens symbolisant la circulation des données.

    On y retrouve donc la notion de patch, un cadre représentant graphiquement l'organisation des différentes fonctionnalités définissant une opération. Un patch peut à son tour être plongé dans un autre patch : il prend alors deux interprétations possibles, soit sous forme d'opérateur, devenant alors une des fonctionnalités qui définissent une opération d'ordre supérieur, soit sous forme de donnée, devenant un argument fonctionnel à un autre patch, et rendant paramétrable la nature même d'un calcul. Cependant, cette notion a été élargie à un type de patch particulier : les maquettes. Elles sont l'expression d'un patch ordinaire, dans lequel la position en abscisse des objets prend une valeur temporelle. Ces maquettes offrent un intérêt tout particulier aux applications dans le domaine musical.

    Un patch plongé dans un autre patch
    Un patch servant d'argument fonctionnel à un autre patch.

    II.2.2. Organisation des structures musicales

    L'aspect très général d'OpenMusic le libère de toute contrainte sur son domaine d'application : se définissant de la manière la plus générale comme un langage de programmation, rien n'empêche l'utilisateur de se servir d'OpenMusic pour faire du calcul formel, de la démonstration automatique de théorèmes ou simuler des expériences de chimie organiqueŠ Cependant, à ces concepts très généraux viennent s'ajouter dans OpenMusic une spécialisation adaptée à un domaine particulier, le domaine musical. C'est cette particularisation qui intéresse ici mon propos.

    Cette spécification s'exprime, au niveau informatique, tout d'abord par la possibilité de structurer des données musicales, c'est à dire, en langage orienté objet, par la définition de classes auxquelles viendront ensuite s'ajouter des méthodes spécifiques. Cette étape est fondamentale dans la conception d'un logiciel puisque toutes ces fonctionnalités vont être bâties sur le modèle de représentation des données. Ainsi, cette définition de classe n'est elle pas encore définitivement établie. Une hiérarchie a cependant été retenue de manière provisoire pour permettre d'effectuer les premiers essais.

    A la base, une classe " musical-object " vient regrouper toutes les classes et objets d'OpenMusic appartenant à cette spécification musicale. A l'image de la représentation hiérarchique imbriquée des fonctions définies par le patch, une structure musicale va être formalisée par un ensemble de contenants " containers " et de contenus. De cette conception émergent immédiatement au niveau musical deux catégories d'objets : les objets simples, " simple-container " (om-musical-object sur le schéma), objets atomiques qui sont des éléments terminaux de la structure en arbre, et les objets composés " container " (compound-musical-object sur le schéma) qui ne sont pas terminaux et contiennent des sous-structures.  

    On retrouvera donc, dans la catégorie des simple-container, les notes, silences, sons numériques,Š et dans celle des container, deux nouvelles catégories : les objets parallèles regroupant les notions de polyphonie et d'accord, dans lesquels les objets peuvent se chevaucher au niveau temporel, et les objets séquentiels (une voix, un groupe, une mesure) dans lesquels les objets se succèdent chronologiquement.

    Hiérarchie (provisoire) des classes dans OpenMusic

     Les liens figurant entre les classes sur ce schéma symbolisent les relations d'héritage. Par exemple, un accord (chord) est un objet parallèle (parallel), qui lui-même est un objet musical composé (compound-musical-object). Cela signifie que la classe chord hérite de la classe parallel et donc de la classe compound-musical-object. Ainsi, toute instance de la classe accord aura, en plus d'éventuelles spécifications propres aux accords, toutes les caractéristiques d'un objet-musical-composé. De même, toute méthode décrite sur la classe compound-musical-object pourra s'appliquer à une instance de la classe chord.

    Manipulant des objets provenant de systèmes d'unités temporelles totalement différents (unités symboliques du domaine musical, unités en millisecondes pour les sons numériques,Š), un effort particulier d'unification a été produit pour que chaque structure musicale, et quelle que soit la nature des objets qu'elle fait coexister, soit définie au niveau temporel à partir de paramètres entiers, évitant ainsi les erreurs de troncature (des nombres décimaux vers les nombres entiers), source de dégradations irréversibles des structures lors de leur manipulation et permettant un passage plus facile d'objets définis dans un temps hiérarchique (comme les structures musicales) à des objets définis dans un temps continu (comme les fichiers midi ou audio).

     Cette unification des unités est réalisée à partir d'un système d'échelles locales entendues suivant une valeur de référence : la noire. Toutes les positions temporelles et les durées vont alors s'exprimer suivant des fractions n/p de cette valeur de référence.

     La structure d'un objet de type simple-container est alors immédiate. On y trouve trois champs qui permettent de le définir sur le plan temporel et, si l'objet est un contenant, un champ supplémentaire listant toutes les sous structures qu'il contient. Ainsi, la " qvalue " représente la fraction de la noire nécessaire pour exprimer, suivant un nombre entier, la durée de l'objet ainsi que les positions temporelles des éventuelles sous-structures qu'il contient. L'" extent " exprime donc la durée de l'objet en rapport avec cette qvalue (c'est à dire que l'objet possède une durée de extent / qvalue noires ). Ainsi, la durée d'une croche s'écrit comme une extent de 1 pour une qvalue de 2, une croche pointée comme une extent de 3 pour une qvalue de 4, etc. Finalement, le champ " offset " permet de positionner l'objet dans le temps, de manière relative à l'objet qui le contient, au niveau hiérarchique immédiatement supérieur.

    Le champ " inside " est propre aux objets de type container, et décrit l'ensemble des sous structures contenues dans l'objet.

    A titre d'exemple, observons la structure musicale définie comme suit :

     
      Description d'une structure musicale

    A la base, une  " voix "   possède une " qvalue "  de 1, et une " extent " de 1. Cela signifie que la noire est une unité suffisamment petite pour exprimer sa durée, qui vaut donc une noire, ainsi que la position de son contenu, un groupe qui commence à l'offset 0, c'est à dire immédiatement. L'offset de l'objet voix n'est pas précisé (il vaut 0 par défaut) puisqu'il ne fait aucun sens (l'objet voix n'est pas le contenu d'un contenant hiérarchiquement supérieur).

    L'objet groupe, immédiatement situé dans le contenu de l'objet voix, nécessite, lui, une qvalue de 5, non pas pour exprimer sa durée, puisque son extent de 5 signifie qu'il dure lui aussi une noire, mais pour exprimer la position des différents éléments qu'il contient.

    En effet, chacun des éléments contenus, quatre notes et un groupe, possède une durée d'un cinquième de noire (extent = 1 et qvalue = 5 ) et occupe respectivement les positions 0, 1, 2, 3 et 4 (offset = 0, 1, 2, 3, 4 ), et donc l'ensemble qvalue et extent du groupe et offset des différents éléments contenus ne peut pas se réduire par un diviseur commun. L'objet groupe est donc un quintolet de doubles croches contenant quatre doubles croches et un groupe se divisant, on le voit aisément, en un triolet de triples croches.

    La représentation musicale de cette structure est donc la suivante :

    Le lien entre ce temps hiérarchique et un temps plat en millisecondes se fait par l'intermédiaire du tempo, fixé arbitrairement à 60 à la noire. Par exemple, supposons que l'on souhaite mettre en commun notre structure avec un fichier audio dont la durée est 1230 millisecondes, dans un objet polyphonie. La qvalue de la racine de la structure devient 1000 (à un tempo de 60 à la noire, un millième de noire correspond à une milliseconde). Cette valeur est toujours compatible avec la structure précédente, et l'on pourra noter que l'objet voix possède maintenant une valeur offset. Celle-ci (elle vaut 0) est exprimée dans la subdivision de la noire définie dans l'objet polyphonie, le niveau hiérarchique immédiatement supérieur.

     Finalement, le résultat est de la forme :

      Coexistence d'objets définis en temps hiérarchique et en temps continu

    Ainsi, grâce à un passage à une échelle compatible avec les deux structures en temps continu et hiérarchique, celles-ci peuvent coexister pleinement en restant définies au niveau temporel par des nombres entiers. 

    Pour finir, un avantage non négligeable de cette structuration des données musicales réside dans le fait qu'une sous-structure peut être extraite de manière simple d'une structure, en restant totalement définie au niveau temporel, c'est à dire formant elle même une entité musicale cohérente.

    II.3 CMN (Common Music Notation) 

    OpenMusic prévoit l'édition des objets musicaux sous forme de notation musicale. 

    Cependant, réaliser la partie graphique d'un système permettant la représentation en notation musicale représente une tâche importante qui demande du temps et de la main d'¦uvre qualifiée. En particulier, l'aspect graphique, source majeure d'incompatibilité entre les différents systèmes informatique, impose un investissement spécifique au système informatique utilisé qui sera quasiment perdu dès que l'on voudra porter le logiciel vers une autre plate-forme.

    L'intégration de CMN à OpenMusic représente donc une économie considérable en temps, qui permet de consacrer les efforts à des aspects plus spécifiques à la composition assistée par ordinateur.

    II.3.1 Présentation 

    CMN, Common Music Notation, se définit comme un langage de description de partitions musicales. Il est conçu et réalisé par Bill Schottstaedt au CCRMA de l'université de Stanford, qui entretient maintenant avec l'équipe Représentations Musicales une collaboration fructueuse. Initialement prévu pour générer des fichiers de type postscript (donc essentiellement destinés à l'impression), CMN, par sa modularité, a pu voir sa sortie détournée vers quickdraw, le système graphique du Macintosh, permettant ainsi l'affichage graphique à l'écran. De plus, sa syntaxe initiale très générale ainsi que son extensibilité du point de vue de la notation permettent d'atteindre un degré de souplesse dans la notation qui saura convaincre les compositeurs les plus exigeants.

    La syntaxe de CMN est relativement simple. La description d'une note par exemple se fait de la manière suivante : (nom-de-la-note durée-de-la-note ). Le nom de la note s'exprime en accord avec la notation anglo-saxonne, c'est à dire une lettre entre A (la) et G (sol), suivie éventuellement d'une altération (s pour un dièse, f pour un bémol et n pour un bécarre) et d'un numéro d'octave (le do 3 français, C4 américain, étant celui situé une ligne supplémentaire en dessous de la clef de sol). La durée peut également s'exprimer par un assemblage de mots clefs (un q pour " quarter note ", soit une noire, un e pour une croche,... combinés avec un " . " pour une valeur pointée, " .. " pour une valeur doublement pointée, etc.) ou par l'appel à la fonction " rq " qui convertit directement une durée exprimée en fraction de la noire en sa forme directe. Ainsi, (CS5 (RQ 3/4)) correspond à un do 5, qui dure 3/4 de noire, c'est à dire une croche pointée. 

    Donnons tout de suite un premier exemple, simple, d'édition en notation musicale, à l'aide de CMN. Dans l'expression suivante, WCMN est la fonction générale d'appel à CMN. Elle reçoit comme paramètres un ensemble d'instructions, propres donc à la syntaxe de CMN. On commence par initialiser des variables globales de CMN qui permettent de formater l'affichage. Par exemple, par l'évaluation de (AUTOMATIC-NATURALS T) , on confie à CMN le rappel automatique du bécarre pour une note précédemment altérée dans la mesure. Puis on définit un système 'system' composé d'une portée 'staff', elle même composée de deux mesures. La première, par exemple, comporte 5 notes : une croche pointée, une double et un triolet de croches. On peut remarquer dans cet exemple que le triolet est spécifié explicitement par l'appel aux fonctions BEAT-SUBDIVISION- (qui définit le commencement de la subdivision irrégulière), -BEAT-SUBDIVISION- et -BEAT-SUBDIVISION (qui respectivement continue et termine la structure).

    (WCMN
    (AUTOMATIC-BEAT-SUBDIVISION-NUMBERS NIL)
    (AUTOMATIC-NATURALS T)
    SYSTEM
    (STAFF TREBLE
    (METER 2 4 (BEAMING (LIST 1.0 1.0)))
    (CS5 (RQ 3/4))
    (GS4 (RQ 1/4))
    (FS4 (RQ 1/3) (SETF TUP1 (BEAT-SUBDIVISION- (SUBDIVISION 3))))
    (C4 (RQ 1/3) (-BEAT-SUBDIVISION- TUP1))
    (F4 (RQ 1/3) (-BEAT-SUBDIVISION TUP1))
    BAR
    (METER 2 4 (BEAMING (LIST 2.0)))
    (CS4 (RQ 2))
    BAR))

       

    Le résultat à l'affichage est le suivant :

       

    II.3.2 Les processus automatiques

    CMN ne se contente pas de transcrire graphiquement la partition musicale dont on lui transmet la description : une analyse des informations qui lui parviennent est réalisée et permet de déclencher certains processus automatiques. Cette opération est fondamentale pour représenter correctement une structure musicale : par exemple, cette analyse permet de prévoir le regroupement de notes, le sectionnement de groupes suivant la métrique dans la mesure,Š

    Les processus automatiques de CMN restent cependant relativement limités et ne fonctionnent correctement que dans des cas simples. Parfois même, ces processus ne fonctionnent tout simplement pas : dans la figure précédente, par exemple, le deuxième fa devrait être muni automatiquement d'un bécarre.

    En particulier, les figures de type triolet, quintolet, septolet,Š ne sont représentées correctement que lorsqu'elles sont " pleines ", c'est à dire par exemple, que lorsqu'un quintolet de doubles croches contient effectivement cinq doubles croches et non pas un monnayage en une croche et une croche pointée.

    Ce problème a fait l'objet de fonctions spécifiques décrites dans la suite de ce rapport. Comme il n'existe pas en français de mot équivalent à l'anglais " tuplet ", le terme de " subdivision irrégulière " (au sens ou un signe graphique supplémentaire est nécessaire pour la noter musicalement) sera employé pour désigner indifféremment un triolet, un quintolet,Š soit une figure musicale dont la durée des différents éléments ne peut pas s'exprimer sous la forme d'un multiple d'une subdivision binaire de la noire.

    Ainsi, non seulement la représentation des subdivisions irrégulières n'est correcte que lorsqu'elles sont " pleines ", mais surtout il est impossible d'en déduire automatiquement d'éventuels emboîtements à partir de la simple donnée des durées des éléments : une telle analyse produit plusieurs solutions. Par exemple, la suite de durées (1/5, 1/15, 1/15, 1/15, 1/5, 1/5, 1/5) peut s'interpréter des deux façons suivantes :

    Exemple d'ambiguïté dans la notation à partir de la simple donnée des durées.

     

    Il s'agit en effet soit d'un " quinzolet " , c'est à dire quinze doubles croches dans le temps de huit, soit d'un triolet de triples croches imbriqué dans un quintolet de doubles croches. Si la deuxième forme semble la plus probable, puisque les musiciens sont plus habitués à effectuer des découpages du temps en des valeurs relativement petites, la première reste néanmoins tout à fait acceptable et peu fort bien être justifiée. Seule une structure en arbre, par exemple de la forme (1 (1 (1 (1 1 1)) 1 1 1 )) (en interprétant l'expression (1 (1 1 1)) par une unité subdivisée en trois, la structure récursive précédente indique un temps qui se subdivise en 5 unités égales, et dont la deuxième se subdivise en trois) spécifie convenablement et entièrement l'imbrication de subdivisions irrégulières.

    Ainsi, une étude pour pallier à ces problèmes a été réalisée, et des fonctions remplaçant certains des processus automatiques de CMN seront décrites dans la partie développement de ce rapport.