Subject: MSDL (Music Score Description Language

From: Jacques Menu <[email-masked]>
Date: Tue, 16 Mar 2021 00:52:49 +0100

Bonsoir tutti,

MSDL est un langage qui se veut proche des musicien-ne-s, tout en offrant des possibilités pour les arrangeurs dans l’esprit de ce que font Edition Engraver, arranger.ily et Abjad. 
L’idée est de pouvoir réutiliser un même fragment de musique en différents endroit en le manipulant, le transposant ou adaptant la dynamique et l’accentuation pour les besoins de l'orchestration, par exemple.

MSDL est d’un peu plus haut niveau que LilyPond et de franchement plus haut niveau que MusicXML.

Il peut être converti par un compilateur en du code LilyPond, musique braille, MusicXML et Guido. La création de fichiers MIDI est à l’agenda, mais pas pour tout de suite.

La suite de ce message montre les choix de conception et des exemples. 

La version 1.001 du compilateur, baptisé msdl au niveau de la ligne de commande, vient d’être mise à disposition sur le dépôt de la librairie libmusicxml2 de Grame à Lyon. C’est Dominique Fober qui a conçu la librairie et qui en assure la maintenance.

Pour installer libmusicxml2 sur Linux, Windows ou Mac OS X, il faut avoir un compilateur C++11 et cmake, et prendre la branche lilypond sur le dépôt de Grame:

	git clone -b lilypond https://github.com/grame-cncm/libmusicxml.git libmusicxml-git
	cd libmusicxml-git/build
	make

Les executables, dont xmlly, xml2brl, xml2xml, xml2gmn et msdl se retrouvent dans build/bin. 
Les mêmes fonctionalités peuvent être utilisées sans ligne de commande, comme depuis un site web par exemple.

Les options du compilateur MSDL varient selon l’option de sortie choisie :

menu@macbookprojm: ~/libmusicxml-git/files/msdl > msdl -help-generate-output
--- Help for subgroup "Generated output" in group "Generated output group" ---
  Generated output group (-hgc-group, -help-generate-output-group):
  --------------------------
    Generated output (-hgo, -help-generate-output):
      -gen, -generate GENERATED_OUTPUT_KIND
            Generate GENERATED_OUTPUT_KIND code to the output.
              The 5 generated output kinds available are:
              braille, guido, lilypond, midi and musicxml.
              The default is 'LilyPond output'.
      -guido
            Generate Guido output
      -lilypond
            Generate LilyPond output
      -braille
            Generate braille music output
      -musicxml
            Generate MusicXML output

msdl bénéficie des même options, hormis celles concernant MusicXML, que xmlly, xml2brl, xml2xml et xml2gmn, respectivement.

Les mots-clés du langage comme pitches/hauteurs sont réservés, comme dans les langages de programmation, et ne sont pas introduits par un un ‘\’ comme en LilyPond.

Le langage est multilingue pour ce qui est des mots-clés, et on peut utiliser le compilateur pour les traduire d’une langue dans une autre. 
Pour l’instant, il y a le français et l’anglais, mais il est facile d’en ajouter d’autres si l’on dispose de quelqu’un pour faire la traduction des mots-clés.

La syntaxe pour fournir les notes et autres éléments est très proche de celle de LilyPond, avec une différence majeure quant à la barre verticale ‘|’ :

	- elle indique non pas la fin d’une mesure, mais le fait que la musique qui suit va dans la mesure indiquée, comme dans |2 c2.. d’’8, où ces deux notes vont dans la mesure 2;

	- il est ainsi possible de ‘déposer’ de la musique dans la partition, comme un peintre met de la couleur par touches ou repasse où il en a déjà déposé;

	- cela permet de rentrer la musique non-linéairement, donc pas strictement de gauche à droite dans la musique;

	- c’est pour cette raison que staff/portée et voice/voix sont fondues en une seule notion music/musique. Il peut y avoir plusieurs couches dedans, selon les besoins du compositeur. 

Cet emploi de ‘|’ est une suggestion de Jean Abou-Samra, que je trouve excellente. 
L’exemple joint UnPetitAir.msdl, qui lui est dû, montre comment on peut créer une partition de piano avec cette approche.

Pour l’instant, les numéros de mesures sont ignorés, et elles sont toutes placées à la suite l’une de l’autre dans la musique.

Suite à des échanges avec Jean, il y aura prochainement :

	|3 c1      % mesure 3
	|-2 d2 e2  % 2 plus à gauche, donc la 1
	|+1 g1     % 1 plus à droite, donc la 2

Je vais aussi ajouter le mode de saisie des octaves, directement repris de LilyPond :

	octaves absolute/absolues      % par défaut, le seul actuellement
	octaves relative/relatives
	octaves fixed/fixees d’

Je joins les fichiers produits par les commandes suivantes, ainsi que des vues des résultats :

	msdl -lilypond BonjourToutLeMonde.msdl -msdl-keywords-input-language francais -auto-output-file-name

	msdl -lilypond HelloWorld.msdl -global-staff-size 40 -jianpu -o HelloWorld_JIANPU.ly

	msdl -musicxml HelloWorld.msdl -auto-output-file-name 

	msdl -braille HelloWorld.msdl -auto-output-file-name -braille-output-kind utf8d -use-encoding-in-file-name

	msdl -guido HelloWorld.msdl -auto-output-file-name

Comme je n’en suis qu’au début, beaucoup de choses sont encore ouvertes dans MSDL. 

Je m’adresse à vous pour connaître vos idées sur ce qu’il serait bien d’avoir à disposition dans un tel langage.

Il y a par exemple la manière de décider dans music/musique l’ordre des voix (qu’il y a bel et bien derrière le rideau), qui n’est pas encore claire. Et c'’est important bien sûr pour l'orientation des hampes de notes vers le haut ou vers le bas.
Et aussi comment spécifier les paroles pour les placer sur la musique, ou comment indiquer sur quelle-s note-s appliquer la dynamique ou l'accentuation.

Merci de votre aide!

JM

==========================================================================

Premier exemple MSDL avec les mots-clés en anglais :

%{
 The unavoidable HelloWorld score
%}

% the language used for the pitches
% -----------------------------------------------

pitches english            % default is english

% is there an anacrusis?
% -----------------------------------------------

anacrusis                 % measure numbers start at 0

% the structure
% -----------------------------------------------

% score helloWorld = "Hello World in MSPL" {

 music {
   |1 c2.. d''8
   |||                   % final bar
 }

% } % helloWorld

==========================================================================

Le langage est multilingue pour ce qui est des mots-clés :

%{
 Un exemple MSDL en français
%}

% l'identification
% -----------------------------------------------

titre       "MSDL en français"
compositeur "A. N. Onyme"

% la langue pour les hauteurs de notes
% -----------------------------------------------

hauteurs francais  % par défaut: english

% la partition
% -----------------------------------------------

partition bonjourToutLeMonde = "Bonjour tout le monde en MSDL" {

 musique {
   |1 do2.. re''8        % à placer dans la mesure 1
   |||                   % double barre finale
 }

} % bonjourToutLeMonde

==========================================================================

Vue de BonjourToutLeMonde.ly dans Frescobaldi :

==========================================================================

Vue de HelloWorld.gmn dans Guido Editor :

==========================================================================

Vue de HelloWorld.xml dans MuseScore :

==========================================================================

Vue de HelloWorld_UTF8Debug.brf dans un terminal, avec une interprétation en clair de chaque ligne sur la ligne suivante :

menu@macbookprojm: ~/libmusicxml-git/files/msdl > cat HelloWorld_UTF8Debug.brf

⠀⠸⠝⠄⠄⠨⠑

 {o3c2..|o5d8}

==========================================================================

Vue de HelloWorld_JIANPU.ly dans Frescobaldi, avec les notes indiquées par leur numéro d’ordre dans la gamme, ici Do majeur :

==========================================================================