Subject: Convertir du lyricmode en "vrai" texte

From: "Valentin Villenave" <[email-masked]>
Date: Mon, 25 Feb 2008 01:34:52 +0100

Bonjour à tous, bonjour Nicolas,

après avoir passé un certain temps à examiner le code des partitionc
de Lully, Rameau et Couperin avec la plus grande perplexité, j'avoue
ne pas être parvenu à trouver exactement comment effectuer des
substitutions de regexp en Scheme. J'ai bien vu passer des fonctions
regexp-substitute, mais je ne sais pas comment les utiliser.

Voici ce que j'essaye de faire : j'aimerais arriver à sortir
automatiquement le livret de mon opéra, en partant de la même source
que les paroles des chanteurs (en lyricmode). En d'autres termes, j'ai
chaque réplique des personnages dans des variables telles que :

HamletAA= \lyricmode { Cou -- cou. __ _ _ }
TitaniaAA= \lyricmode { Bon -- _ _ jour_! }
HamletAB= \lyricmode { Co -- mment va_? }

...et je voudrais, grâce à deux trois formules magiques, obtenir comme sortie :

      HAMLET
Coucou.

      TITANIA
Bonjour !

      HAMLET
Comment va ?

... Ce qui me permettrait d'ajouter une commande de type "make
libretto" à mon opéra, pour obtenir le livret tout propre si on le
souhaite.

En gros, il faudrait juste des regexp permettant de faire sauter les
"--" entourés d'espaces, de nettoyer les underscore qui se baladent,
et de remplacer toutes les ponctuations doubles précédées d'un
underscore (genre "_!", "_?" ou "_;") par la même ponctuation précédée
d'un espace insécable. Je pourrais ensuite faire un livret en mettant
simplement les variables correspondant aux répliques dans le bon ordre
(plutôt que de retaper tout le texte).

C'est-y-pas une feature qu'elle serait cool ?

Cordialement,
Valentin

PS. Pour aller plus loin, je me demande également s'il y aurait une
autre formule magique qui identifie automatiquement toutes les
variables dont le nom commence par Hamlet* et qui puisse ajouter
automatiquement un \markup {\fill-line \smallCaps "Hamlet"} devant
chacune, histoire que le nom des personnages s'imprime automatiquement
mais c'est peut-être trop demander :)

---

From: jm reboul <[email-masked]>
Date: Mon, 25 Feb 2008 06:52:59 +0100

Valentin Villenave a écrit :
> .......

D'autant plus cool, si cela permettait d'ajouter, à la fin d'une 
partition vocale, tous les lyrics utilisés sous les notes. Quand le 
texte est en latin, j'aime bien récapituler le texte en versets, avec en 
face, la traduction française. (ce qui n'est pas une mince affaire, avec 
la gestion des colonnes...)

Espérons donc que ce voeu pourra être exaucé !

Jean-Marc R

---

From: Nicolas Sceaux <[email-masked]>
Date: Mon, 25 Feb 2008 21:23:58 +0100

> ...et je voudrais, grâce à deux trois formules magiques, obtenir  

Ce n'est pas avec des regex que tu t'en sortiras, comme le montre ce
qui suit:

HamletAA = \lyricmode { Cou -- cou. __ _ _ }
\displayMusic \ HamletAA
==>
(make-music 'SequentialMusic
  'elements (list (make-music 'EventChord
                   'elements (list (make-music 'LyricEvent
                                    'duration (ly:make-duration 2 0 1 1)
                                    'text "Cou")
                                   (make-music (quote HyphenEvent))))
                  (make-music 'EventChord
                   'elements (list (make-music 'LyricEvent
                                    'duration (ly:make-duration 2 0 1 1)
                                    'text "cou.")
                                   (make-music (quote ExtenderEvent))))
                  (make-music 'EventChord
                   'elements (list (make-music 'LyricEvent
                                    'duration (ly:make-duration 2 0 1 1)
                                    'text " ")))
                  (make-music 'EventChord
                   'elements (list (make-music 'LyricEvent
                                    'duration (ly:make-duration 2 0 1 1)
                                    'text " ")))))

Il va plutôt s'agir de chercher les infos intéressantes dans cette
expression musicale.

Le problème sera de décider si __ est au milieu ou à la fin d'un mot,
de même pour les _.

Voici une ébauche de fonctions, montrant ces problèmes :

#(define (extract-lyrics music)
   (let ((strings (list))
         (no-space #t))
     (music-map (lambda (m)
                  (cond ((eqv? (ly:music-property m 'name) 'LyricEvent)
                         (let ((str (ly:music-property m 'text)))
                           (set! strings
                                 (cons str
                                       (if no-space
                                           strings
                                           (cons " " strings))))
                          (set! no-space #f)))
                         ((eqv? (ly:music-property m 'name)  
'HyphenEvent)
                          (set! no-space #t))))
                music)
     (apply string-append (reverse! strings))))

#(define (display-lyrics music)
    (newline)
    (display (extract-lyrics music)))

#(display-lyrics HamletAA)
#(display-lyrics TitaniaAA)
#(display-lyrics HamletAB)
==>
Coucou.
Bon    jour !
Comment va ?

Par ailleurs, il est possible dans l'absolu de faire automatiquement la
liste d'identifiant ayant un certain nom. Mais ici, cela nécessiterait
de modifier le code c++ pour ajouter des accesseurs.

---

From: "Valentin Villenave" <[email-masked]>
Date: Tue, 26 Feb 2008 10:50:43 +0100

> Ce n'est pas avec des regex que tu t'en sortiras, comme le montre ce

Oulalala ! Hum... mon propos était justement d'éviter que le lyricmode
soit parsé, autrement dit de pouvoir partir du code source en tant que
string...

>  Il va plutôt s'agir de chercher les infos intéressantes dans cette

Est-ce que ce ne serait pas plus simple, justement, qu'à aucun moment
ça ne se transforme en expression musicale ? On pourrait stocker les
lyrics, par exemple, au moyen d'une fonction \lyricmodeAlternative qui
prendrait en argument la chaînes de caractères, et ne la passerait au
"vrai" lyricmode que si on le lui demande ?

>  de modifier le code c++ pour ajouter des accesseurs.

Alors ça ça serait génial (et sûrement utile pour bien d'autres choses
que pour les lyrics). Mais ça nécessite sûrement d'y réfléchir
davantage...

Cordialement,
Valentin