Subject: BarNumber et mesure à cheval sur 2 lignes

From: Éditions IN NOMINE<[email-masked]>
Date: Wed, 15 Sep 2010 17:27:14 +0200

Bonjour à toute la liste !

Je me cogne à un petit pb qui a l'air bête comme chou : j'ai une ligne 
qui se termine par 2 temps + \bar":|:" puis retour à la ligne pour la 
seconde partie qui commence donc par une demi mesure.

L'usage répandu et assez élégant, quand on numérote en début de ligne, 
c'est que le chiffre en tête de cette seconde ligne soit le n° de la 
première mesure complète de la dite ligne (j'espère que ce n'est pas 
confus !). Or je n'arrive pas à atteindre ce résultat.

Un petit bout de code :

\version "2.13"
{\clef bass \time 2/2
c4 c c d e2 d c4 e d d c2 \bar ":|" \break
r4 c d4 d d d a,2 a, d4 c b, a, g,1 \break
c4 c c d e2 d c4 e d d c1 \bar "|."
}

Il devrait y avoir un chiffre 5 en début de seconde ligne, en fait...
Une solution sioux dans \layout serait impeccable, parce que je n'ai pas 
vraiment envie de toucher aux fichiers de notes (il s'agit d'extractions 
de parties séparées).

Merci d'avance !
JMarc

---

From: Phil Hézaine <[email-masked]>
Date: Wed, 15 Sep 2010 20:18:32 +0200

> vraiment envie de toucher aux fichiers de notes (il s'agit d'extractions

Pas d'idée dans le \layout mais peut-être que:

   \set Score.currentBarNumber = #4 % Changer pour le chiffre voulu
   \bar "" % Permit first bar number to be printed

judicieusement placé pourrait "saucissonner" l'histoire.

c4 c c d e2 d c4 e d d c2 \bar ":|" \break
\set Score.currentBarNumber = #3   % Changer pour le chiffre voulu
\bar ""   % Permit first bar number to be printed
r4 c d4 d d d a,2 a, d4 c b, a, g,1 \break

Phil.

---

From: Éditions IN NOMINE <[email-masked]>
Date: Thu, 16 Sep 2010 09:10:02 +0200

Merci pour cette réponse, mais en fait, la succession de \bar ":|" et 
de \bar "" donne \bar"", et donc la barre de reprise disparait. Oh, il 
serait tout à fait possible de faire un truc du style :

version "2.13"
{\clef bass \time 2/2
c4 c c d e2 d c4 e d d c2*2 \bar ":|" \break
r4*2 c4*2 d4 d d d a,2 a, d4 c b, a, g,1 \break
c4 c c d e2 d c4 e d d c1 \bar "|."
}

pour ruser Lilypond et lui faire croire qu'il s'agit de mesures 
entières, mais encore une fois, je souhaite ne pas toucher au code 
musical. S'il n'y a pas de solution, je ferai comme ça quand-même.

A bientôt

JMarc

---

From: Éditions IN NOMINE<[email-masked]>
Date: Fri, 17 Sep 2010 15:23:39 +0200

Allez, je me lance ! Après lecture et étude approfondie de la doc 
Extensions (très bien faite mais un peu courte pour moi)... que dolor ! :-P
Toutes mes excuses par avance pour la longueur de ce post : je souhaite 
montrer ce qui se passe dans ma cervelle, alors forcément, ça prend du 
temps ! Le but peu visible est de trouver à terme une solution pour le 
sujet "BarNumber et mesure à cheval sur 2 lignes".

_Par où commencer... Par ce que je sais faire..._
Prenons ce bout de code :
\version "2.13"
{c4 c c d e2 d \bar "|."}

Si je veux écrire Bravo ! au-dessus du premier c4, *en Scheme*, voici 
comment je procède :
\version "2.13"
\displayMusic{
c4^"Bravo !" c c d e2 d \bar "|."
}
puis :
lilypond machin.ly>display.txt

Dans display.txt, je repère le code qui crée le Bravo ! :
(make-music
           '*EventChord*
           'elements
           (*list* (make-music
                   'NoteEvent
                   'duration
                   (ly:make-duration 2 0 1 1)
                   'pitch
                   (ly:make-pitch -1 0 0))
                 (make-music
                   'TextScriptEvent
                   'direction
                   1
                   'text
                   "Bravo !")
C'est donc dans une liste de propriétés liées à EventChord. Je fais un 
honteux plagiat de la doc (page 13 et suivantes) et je ponds la fonction 
du siècle :
bravo = #(define-music-function (parser location event-chord)(*ly:music?*)
;la variable est event-chord de type ly:music
"écrit Bravo ! au dessus de la note"
(let ((result-event-chord (ly:music-deep-copy event-chord)))
;declaration de la variable locale result-event-chord. On lui donne la 
valeur de music-deep copy
   (set! (ly:music-property result-event-chord 'elements)
     (cons (make-music *;ici je copie la partie de display.txt qui 
m'intéresse*
           'TextScriptEvent
           'direction
           1
           'text
           "Bravo !") (ly:music-property result-event-chord 'elements)))
   result-event-chord)
   )
et on modifie le code de la parto pour utiliser cette fonction :
\version "2.13"
{\bravo c4 c c d e2 d \bar "|."}

Et ça marche.
Le pied.

_Par où finir... Par ce que je ne sais pas faire..._
Maintenant, je souhaite en venir aux numéros de mesure. Même méthode :

Un petit \displayMusic sur le code suivant :
\version "2.13"
\displayMusic{
c4 c c d \break
\set Score.currentBarNumber=#50 e2 d \bar "|." }
}

J'obtiens le code interressant suivant (en partant "du haut") :
(make-music
   'SequentialMusic
   'elements
   (list (make-music
         ...)
*;la partie concernant le \break, qui est ratachée à un EventChord, 
comme plus haut*
         (make-music
           'EventChord
           'elements
           (list (make-music
                   'LineBreakEvent
                   'break-permission
                   'force)))
*;la partie concernant le n° de mesure, pas du tout de la même forme que 
plus haut ! >:o
*        (make-music
           'ContextSpeccedMusic
           'context-type
           'Score
           'element
           (make-music
             'PropertySet
             'value
             50
             'symbol
             'currentBarNumber))

Allons-y quand-même !

mesureD = #(define-music-function (parser location score)(ly:music?)
;question : la variable score et son type sont-ils bon ?
"force la numérotation en tête de ligne à 50"
(let ((result-score (ly:music-deep-copy score)))
   (set! (ly:music-property result-score 'elements)
         (cons  (make-music
             'PropertySet
             'value
             50
             'symbol
             'currentBarNumber) (ly:music-property result-score 'elements)))
   result-score)

Le hasard ayant pu de place en cette matière, ça plante complet à 
l'utilisation avec les messages suivants :
erreur de programmation : Envoi d'un non-événement au contexte
poursuite ; croisons les doigts.
erreur de programmation : Not a music type
poursuite ; croisons les doigts.
Avertissement : Classe d'événement inconnue : « property-set »

Or j'ai un mal fou à faire évoluer ce bourrin copier/coller...

Quelqu'un(e) saurait m'aider à trouver comment faire un bon 
raisonnement, avant que mon enthousiasme quasi-juvénile baisse drapeau ?

Merci d'avance !
JMarc

On 15/09/2010 17:27, Éditions IN NOMINE wrote:
> Une solution sioux dans \layout serait impeccable, parce que je n'ai 
> pas vraiment envie de toucher aux fichiers de notes (il s'agit 
> d'extractions de parties séparées).
>
> Merci d'avance !
> JMarc
>
>
> _______________________________________________
> liste de diffusion lilypond-user-fr
> [email-masked]
> http://lists.gnu.org/mailman/listinfo/lilypond-user-fr

---

From: "j-f.lucarelli" <[email-masked]>
Date: Fri, 17 Sep 2010 16:13:06 +0200

======= le 17-09-2010, 15:24:44 vous écriviez: =======

>raisonnement, avant que mon enthousiasme quasi-juvénile baisse drapeau ?

Bravo, ce petit tutoriel permet de découvrir bien des choses sur l'interface entre LilyPond et Scheme
Grand merci,

Jean-François

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

---

From: Éditions IN NOMINE<[email-masked]>
Date: Fri, 17 Sep 2010 17:03:45 +0200

Pas de mérite, vraiment : la doc 
<http://lilypond.org/doc/v2.13/Documentation/extending/interfaces-for-programmers> 
est assez explicite et "ils" expliquent bien comment partir de 0 sans 
pour autant réinventer le code.
Dois-je en déduire que tu ne pourras pas m'aider ? :'(

A bientôt !
JMarc

On 17/09/2010 16:13, j-f.lucarelli wrote:
>> plus haut !>:o

---

From: "j-f.lucarelli" <[email-masked]>
Date: Fri, 17 Sep 2010 18:13:49 +0200

???:Éditions_IN_NOMINE
????:17-09-2010 17:04:06
???:j-f.lucarelli
??:Lilypond User FR
??:Re: BarNumber et mesure à_cheval_sur_2_lignes

Pas de mérite, vraiment : la doc est assez explicite et "ils" expliquent bien comment partir de 0 sans pour autant réinventer le code. 
Dois-je en déduire que tu ne pourras pas m'aider ? :'( 

A bientôt !
JMarc

Je n'ai pas encore mis les mains dans le cambouis. Mais ce n'est pas l'envie qui manque.
Malheureusement, à 60 ans, l'assimilation de nouvelles techniques est très lente, et c'est ce qui me rebute un peu.
Alors, quand il y a une difficulté dans LilyPond, j'ai tendance à bricoler un peu, avec les risques d'une portabilité
défectueuse lors du passage à une version ultérieure.

Jean-François

---

From: Cécile Huneau <[email-masked]>
Date: Sat, 18 Sep 2010 03:46:06 +0200

Joli raisonnement. J'apporte ma très maigre contribution :

 >Le hasard ayant peu de place en cette matière, ça plante complet à 
l'utilisation
Dans ta fonction mesureD tu as oublié un bout, c'est pour cela que ça 
plante, il faut vraiment écrire toutes les lignes ci-dessous, car le 2e 
make-music est inclus dans le premier, il ne se suffit pas à lui-même. 
Donc :
         (make-music
           'ContextSpeccedMusic
           'context-type
           'Score
           'element
           (make-music
             'PropertySet
             'value
             50
             'symbol
             'currentBarNumber))

 >;question : la variable score et son type sont-ils bon ?
Explication, je reprends le début de ta fonction :

     ... )

Que tu utilises comme ceci :
{ do4 do do re mi2 re \mesureD do4 mi re re do1}
Telle qu'elle est écrite ta fonction attend un argument. Cet argument 
vient tout de suite après le nom de la fonction quand elle est appelée.
Quand tu avais utilisé ta fonction "bravo" elle prenait un argument, 
dans ton exemple {\bravo c4 c c d e2 d \bar "|."} il s'agissait de ce 
qui suivait, c'est à dire "c4", et ça tombe bien tu avais besoin d'une 
note où accrocher ton markup. Cet argument avait été baptisé 
"event-chord", parce que c'est un nom intelligent qui indique bien ce 
que contient l'argument, mais on aurait très bien pu lui donner un nom 
idiot. Cet exemple marche aussi :

bravo = #(define-music-function (parser location nom-idiot)(ly:music?)
(let ((pas-mieux (ly:music-deep-copy nom-idiot)))
   (set! (ly:music-property pas-mieux 'elements)
     (cons (make-music ;ici je copie la partie de display.txt qui 
m'intéresse
           'TextScriptEvent
           'direction
           1
           'text
           "Bravo !") (ly:music-property pas-mieux 'elements)))
   pas-mieux)
   )
\relative c' {\bravo c4 c c d e2 d \bar "|."}

Donc pour répondre à ta première partie de question, que ta variable 
s'appelle "score" ou "superqualifragnagnagna" on s'en fout, ce qui 
compte c'est que tu saches à quoi cela correspond. Pour le type, pas 
d'erreur, quand tu écris { do4 do do re mi2 re \mesureD do4 mi re re 
do1} ce qui suit \mesureD, donc dans mon exemple do4, est bien du type 
ly:music

Ma maigre contribution scheme s'arrête là... je suis trop une crasse.
Par contre si je peux me permettre : la numérotation m'a l'air 
programmée pour n'être affichable qu'aux changement de mesure effectifs, 
et non sur les barres de mesures. Donc tu peux forcer tout ce que tu 
veux avec des \break, indiquer à la main \bar "|" ou autre, ça ne 
t'affichera pas ton numéro en milieu de mesure.

C'est très porc (encore une fois) mais c'est un porc sioux et ça peut 
peut-être te dépanner en attendant mieux :

--- fichier partA.ly ---
\relative c'' {
     \time 4/4
     \partial 2
     c4 c c d e2 d c4 e d d c2 ~ \partsMesDeux c2 \bar ":|:" \partsBreak
     \partsMesSix d4 d \bar "|" d d a2 \partsMesQuatre a d4 c b a g2 ~ g2}

--- fichier partB.ly ---
\relative c'' {
     \time 4/4
     \partial 2
     c4 c c d e2 d c4 e d d c2 ~ \partsMesDeux c2 \bar ":|:" \partsBreak
     \partsMesSix d4 d \bar "|" d d a2 \partsMesQuatre a d4 c b a g2 ~ g2}

--- fichier score.ly ---
\version "2.13"

noTime = \once \override Staff.TimeSignature #'stencil = ##f

% Parties séparées
partsMesDeux = {\noTime \time 2/4}
partsMesQuatre = {\noTime \time 4/4}
partsMesSix = {\noTime \time 6/4}
partsBreak = \break

\score { \include "partA.ly" }
\score { \include "partB.ly" }

% Partition complète
partsMesDeux = {}
partsMesQuatre = {}
partsMesSix = {}
partsBreak = {}

\score {
<<
         \new Staff = "PartA" {\include "partA.ly"}
         \new Staff = "PartB" {\include "partB.ly"}
}

Comme tu peux le voir, tu touches à la partition... mais la bidouille 
spéciale parties séparées n'affecte pas le conducteur.
Bon, je retourne à mes Legos, c'est moins compliqué.
Cécile

---

From: Éditions IN NOMINE<[email-masked]>
Date: Mon, 20 Sep 2010 10:09:51 +0200

Bon, c'est lundi matin, il fait beau sur Lyon, donc ça devrait le faire...
Merci Cécile pour ta gentille contribution qui m'a bien éclairé. Je 
remets donc le couvert :

1. j'isole le code \displayMusic}
(make-music
           'ContextSpeccedMusic
           'context-type
           'Score
           'element
           (make-music
             'PropertySet
             'value
             50
             'symbol
             'currentBarNumber))

2. je construit ma fonction en coppiant/collant un exemple de la doc ce 
qui donne :
mesureD = #(define-music-function (parser location *event-chord*)(ly:music?)
"force la numérotation 50 en tête de portée après un break"
(let ((result-event-chord (ly:music-deep-copy *event-chord*)))
   (set! (ly:music-property result-event-chord 'elements)
     (cons *(make-music
           'ContextSpeccedMusic
           'context-type
           'Score
           'element
           (make-music
             'PropertySet
             'value
             50
             'symbol
             'currentBarNumber))* (ly:music-property result-event-chord 
'elements)))
   result-event-chord)
   )

3. je consulte les messages d'erreur de Lily :
Interprétation en cours de la musique...
erreur de programmation : *Envoi d'un non-événement au contexte*
poursuite ; croisons les doigts.
erreur de programmation : *Not a music type*
poursuite ; croisons les doigts.
Avertissement : *Classe d'événement inconnue : « context-specced-music »*

4. j'ouvre la fenêtre pour me jeter dans le vide...

Bon, je crois avoir trouvé d'où vient l'erreur :

Le fait est que le code
(make-music
           'ContextSpeccedMusic
           'context-type
           'Score (...)

que j'utilise dans ma fonction n'est pas rattaché au même "noeud" que 
celui utilisé dans la fonction Bravo!

Dans cette dernière, le code utilisé faisait partie d'une liste de 
propriétés de EventChord :
*(make-music
    'EventChord
    'elements *
   (list (make-music (mon code)...

Ma variable d'entrée était un élément EventChord...

Or dans la fonction mesureD, le code que je récupère est en-dehors de 
EventChord, et se rattache au "noeud" supérieur :
*(make-music
   'SequentialMusic
   'elements*
   (list (make-music
          ...)
...plusieurs :
         (make-music
         'EventChord
         ...)
*       (make-music
           'ContextSpeccedMusic
           'context-type
           'Score (...)*

Donc ce n'est pas la même chose, donc normal que ça plante : je referme 
la fenêtre pour l'instant !
D'où ma question : comment modifier ma fonction d'origine pour que ça 
fonctionne ?

J'ai l'impression de faire du parachute sans parachute, marrant...

Merci d'avance !
JMarc

Ci-dessous une réponse à Cécile pour sa proposition :
> programmée pour n'être affichable qu'aux changement de mesure 
> effectifs, et non sur les barres de mesures. Donc tu peux forcer tout 
> ce que tu veux avec des \break, indiquer à la main \bar "|" ou autre, 
> ça ne t'affichera pas ton numéro en milieu de mesure.
>
J'imagine la tête des Lego que tu fais ! Bravo pour cette solution : je 
vais m'en "contenter" le temps de percer les mystères des #(define...) !

A bientôt
JMarc

---

From: Éditions IN NOMINE<[email-masked]>
Date: Mon, 20 Sep 2010 14:41:24 +0200

Bon. J'ai branché le cerveau et j'ai trouvé, comme quoi mon intuition 
de ce matin était la bonne !

Après avoir mouliné quelques fonctions (j'ai les mains pleines de 
cambouis) et notamment comparé l'échelonnement des blocs (make-music des 
résultats de \displayMusic, je me suis (ré) aperçu du fait que le 
passage forçant le n° de mesure n'était pas dans un Event-Chord mais en 
dehors, et directement attaché à la racine 'SequentialMusic... comme 
toutes les notes d'ailleurs...

J'ai testé un truc tout bête : une fonction sans argument (p.18 de la 
doc pdf) qui ajoute un do là où il n'y en avat pas :

ajouterDo = #(define-music-function (parser location)()     ==>pas 
d'argument, donc
             "fonction sans argument insérant un c4"
             (make-music                                    ==>je 
copie/colle un bolc complet \displayMusic{c4}
            'EventChord
            'elements
            (list (make-music
                    'NoteEvent
                    'duration
                    (ly:make-duration 2 0 1 1)
                    'pitch
                    (ly:make-pitch -1 0 0))))
             )

et rien d'autre.

{
c4 s c d e2 d \bar "|." \break
c4 \ajouterDo c d e2 d \bar"|."
}

vous convaincra sûrement !

Je me dis donc qu'il suffit de faire la même chose pour mon mesureD, 
puisque le (music-make correspondant est au même niveau hiérarchique que 
(make-music 'Event-Chord... Allons-y :

mesureD =#(define-music-function (parser location)()       ==>une 
fonction sans argument
           "force BarNumber to 50 after a break"
            (make-music                                     ==>le 
copier/coller du \displayMusic
             'ContextSpeccedMusic
             'context-type
             'Score
             'element
               (make-music
               'PropertySet
               'value
               50
               'symbol
               'currentBarNumber))
          )

{c4 c c d \break
\mesureD e2 d \bar "|."
}

YES !!!

Merci pour votre soutient !

Dans nos prochains aventures extraordinaires, nous tâcherons d'aboutir 
au sujet de ce post, quand-même !

A bientôt
JMarc

---

From: Cécile Huneau <[email-masked]>
Date: Mon, 20 Sep 2010 18:53:09 +0200

Parce qu'au bout d'un moment à force d'essais et de petites fonctions 
de débutant on va finir par devenir bons... Si si j'y crois.
J'aurais fait beaucoup plus simple pour ta fonction :

mesureD = #(define-music-function (parser location)()
     #{ \set Score.currentBarNumber = 50 #} )

La lilypondienne laisse la parole à la musicienne : perso je n'aime pas 
voir un numéro de mesure en début de ligne dans les cas de mesures à 
cheval sur 2 lignes. J'ai toujours une grosse hésitation sur "oui mais 
l'éditeur à choisi d'écrire le numéro de la mesure en cours ou le 
suivant ?", si bien que je me retrouve quand même à compter depuis le 
système d'avant ou d'après, ou alors je choisis la solution de facilité 
: "nan finalement on va reprendre à la barre de reprise" :-p Ce que 
j'apprécie le plus c'est quand la mesure suivante (donc la 1ère entière 
du système) est numérotée.
Enfin... les goûts et les couleurs...
Cécile

Le 20/09/2010 14:41, Éditions IN NOMINE a écrit :
> cambouis) et notamment comparé l'échelonnement des blocs (make-music 
> des résultats de \displayMusic, je me suis (ré) aperçu du fait que le 
> passage forçant le n° de mesure n'était pas dans un Event-Chord mais 
> en dehors, et directement attaché à la racine 'SequentialMusic... 
> comme toutes les notes d'ailleurs...
>
> puisque le (music-make correspondant est au même niveau hiérarchique 
> que (make-music 'Event-Chord... Allons-y :
>

---

From: Cécile Huneau <[email-masked]>
Date: Mon, 20 Sep 2010 18:53:22 +0200

---

From: Éditions IN NOMINE<[email-masked]>
Date: Mon, 20 Sep 2010 19:26:26 +0200

>     #{ \set Score.currentBarNumber = 50 #} )
Ben oui, mais c'est moins drôle, comme ça ! Mettre des gants pour aller 
dans le cambouis, quel dommage ! :-P
> La lilypondienne laisse la parole à la musicienne : perso je n'aime 
> pas voir un numéro de mesure en début de ligne dans les cas de mesures 
> à cheval sur 2 lignes. J'ai toujours une grosse hésitation sur "oui 
> mais l'éditeur à choisi d'écrire le numéro de la mesure en cours ou le 
> système d'avant ou d'après, ou alors je choisis la solution de 
> facilité : "nan finalement on va reprendre à la barre de reprise" :-p 
Pareil, mais on subit souvent le saut de ligne, et il n'est pas très 
élégant, à mon sens, de laisser un chti bout de texte en fin de ligne 
après une barre de reprise... J'aime bien la ligne qui commence avec la 
levée de la seconde partie, comme au début de la partition... En fait, 
j'ai compulsé mes diverses bibles, dont les suites de Bach pour 
violoncelle (pour avoir des gavottes qui présentent ce pb) éditées chez 
Bärenreiter (décidément, je trouve leurs mises en page très belles), eh 
bien tous ont choisi de numéroter toutes les lignes en tête de système 
uniquement, et de résoudre notre pb en donnant le n° de la mesure n+1 en 
cas de mesure incomplète. Une sorte de consensus sur cette pratique m'a 
fait adopter, Panurge parmi tant d'autres (sautons du cochon au mouton 
!), ce système.
> Ce que j'apprécie le plus c'est quand la mesure suivante (donc la 1ère 
> entière du système) est numérotée.
Oui, mais si toutes les lignes sont numérotées, SAUF celle-ci, je trouve 
ça bizarre, non ?
> Enfin... les goûts et les couleurs...
Yes Madam' ! Ya qu'à choisir ! C'est fou ce que c'est dur ! Je te 
fouttrai pas de n° du tout, et hardi petit : rendez-vous au point d'orgue !
> Cécile
JMarc
PS : j'ai généralisé ta solution à mon édition en cours (tablatures 
allemandes de Gerle), en attendant la solution ultime. Mais en fait, ça 
n'est pas si lourd. Merci encore !

>> Dans nos prochains aventures extraordinaires, nous tâcherons 
>> d'aboutir au sujet de ce post, quand-même !
>>
>> A bientôt
>> JMarc
>>
>>
>