Subject: Boucle sur fichier maître

From: Jean-Marc LEGRAND - DEV & d'Adam <[email-masked]>
Date: Wed, 27 May 2020 11:48:58 +0200

Bonjour à toute la liste !

Bon, j'en ai marre : je suis en train de graver une série d'une 40taine
d'exemples musicaux de quelques mesures chacun, et je copie colle donc
une quarantaine de fois le même \score dans mon fichier maître : 618
lignes de code qui pourraient être réduites à une 20taine...

C'est vraiment un code pattern épouvantable, donc je me dis que certains
d'entre vous ont certainement trouvé un truc.

Je pourrais faire un petit script python à côté pour faire tourner la
boucle, mais je me demande :

  * s'il y aurait moyen de le faire au sein du fichier maître lilypond
    (idéal) ;
  * ou de créer la boucle dans Frescobaldi (ça, ça doit pouvoir se faire
    dans le menu Gravure personnalisée, en bash... ya plus qu'à
    apprendre à faire ça).

Je vais creuser un peu, mais s'il existe une solution clé en main, je
suis preneur...

Bonne journée à vous !

JMarc

---

From: Jean Abou Samra <[email-masked]>
Date: Wed, 27 May 2020 05:17:45 -0700 (MST)

Bonjour,

Tout dépend de ce que contient votre \score. Un petit extrait ?

Il y a plusieurs moyens de réaliser cela, mais le plus évident et standard
est le recours à un bloc \layout ou \paper − ou les deux − en en-tête. Ils
s'appliqueront alors à tous vos \score
(http://lilypond.org/doc/v2.20/Documentation/notation/the-layout-block).

Bien d'autres techniques sont possibles, comme le recours à des champs
\header personnalisés, ou encore, s'il y faut vraiment les grands moyens,
une fonction Scheme. Bref, il nous faudrait votre \score pour vous aider
mieux, cela dépendra de ce que vous y avez mis. Mais en général, on peut
tout faire en restant à l'intérieur de LilyPond (à condition d'être prêt à
écrire du Scheme pour les cas avancés).

Cordialement,
Jean Abou Samra

--
Sent from: http://lilypond-french-users.1298960.n2.nabble.com/

---

From: Éditions IN NOMINE <[email-masked]>
Date: Wed, 27 May 2020 14:42:08 +0200

Bonjour, et merci à Jean pour sa réponse.

Je me suis mal exprimé, et effectivement ai omis de vous donner un snippet.

Voici, pour chaque exemple, le \score que j'ai :

\score {
  \new PianoStaff \with {instrumentName = \titreX} <<
    \new Staff = "right" {\rightX}
    \new Staff = "left" {\leftX}
    >>
    \layout {
      indent = 25\mm
      \context {
        \PianoStaff
        \consists #Span_stem_engraver
        }
        \context {
        \PianoStaff
        \override StaffGrouper.staff-staff-spacing.basic-distance = #10
        }
      }
    }

où X change à chaque exemple.

La boucle porterait sur X qui prendrait les valeurs dans une liste,
genre : [A, B, C, ..., Y, Z, AA, AB, ...],

sachant que titreX, rightX et leftX sont implémentés dans un fichier à
part notes.ly.

Merci d'avance !

JMarc

PS : je survis très bien sans solution, pas de souci :-P, mais je trouve
ça vraiment pas propre.

---

From: Jean Abou Samra <[email-masked]>
Date: Wed, 27 May 2020 06:15:08 -0700 (MST)

Bonjour,

Plusieurs solutions sont effectivement envisageables, mais voici la mienne
avec une music-function simple :

% Fichier principal

\version "2.21.2"

\paper {
  indent = 25\mm
}

\layout {
  \context {
    \PianoStaff
    \consists #Span_stem_engraver
    \override StaffGrouper.staff-staff-spacing.basic-distance = 10
  }
}

example = #(define-music-function (instrument-name lh rh) (string? ly:music?
ly:music?)
  #{
    \new PianoStaff \with { instrumentName = #instrument-name } <<
      \new Staff = "right" { #lh }
      \new Staff = "left" { #rh }
  #})

% \include "notes.ly"
% où notes.ly contiendra :

\example "Piano" \relative { c'1 } \relative { d'1 }
\example "Clavecin" \relative { e'1 } \relative { f'1 }
% etc., les entrées étant de la forme
% \example "Nom de l'instrument" <expression musicale de la main gauche>
<main droite>

Plus sur les fonctions musicales :
http://lilypond.org/doc/v2.21/Documentation/notation/substitution-function-examples

Cordialement,
Jean Abou Samra

---

From: Éditions IN NOMINE <[email-masked]>
Date: Wed, 27 May 2020 15:19:50 +0200

Merci Jean ! Je vais tester ça et je reviens vers la liste.

JMarc

---

From: Valentin Villenave <[email-masked]>
Date: Wed, 27 May 2020 16:40:49 +0200

> Merci Jean ! Je vais tester ça et je reviens vers la liste.

Encore plus automatisé peut-être :

%% cf https://lists.gnu.org/archive/html/lilypond-user-fr/2020-05/msg00304.html

%%%%

\layout {
  indent = 25\mm
  \context {
    \PianoStaff

titreA = "toto"
rightA = { b }
leftA = { g }

titreB = "tata"
rightB = { a }
leftB = { f }

%%%%

serie = #`(a b c d e f g h i j k l)

chercheMorceau  =
#(define-void-function (nom) (symbol?)
   (define (symbol-append . args)
     (let ((symbols (map symbol->string args)))
       (string->symbol
        (apply string-append
               (cons (car symbols)
                     (map string-upcase (cdr symbols)))))))
   (let* ((rightX (ly:parser-lookup (symbol-append 'right nom)))
          (leftX (ly:parser-lookup  (symbol-append 'left nom)))
          (titreX (ly:parser-lookup (symbol-append 'titre nom))))
     (if (and (ly:music? rightX)
              (ly:music? leftX)
              (markup? titreX))
         (add-music #{
           \new PianoStaff \with {instrumentName = $titreX } <<
             \new Staff = "right" { $rightX }
             \new Staff = "left" { $leftX }
                    #}))))

#(map chercheMorceau serie)

%%%%

V.

---

From: Jean Abou Samra <[email-masked]>
Date: Wed, 27 May 2020 09:29:42 -0700 (MST)

Bonjour,

vvillenave wrote
>              \new Staff = "left" { $leftX }

Par curiosité, pourquoi des $ ici ? À vrai dire, je n'ai jamais totalement
compris la différence entre # et $...

Cordialement,
Jean Abou Samra

---

From: Pierre Perol-Schneider <[email-masked]>
Date: Wed, 27 May 2020 18:45:27 +0200

Bonsoir Jean,

Le mer. 27 mai 2020 à 18:30, Jean Abou Samra <[email-masked]> a écrit :
 ...

> compris la différence entre # et $...

Quelques explications ici :
http://lilypond.1069038.n5.nabble.com/Difference-between-and-td160964.html
Cordialement,
Pierre

---

From: Valentin Villenave <[email-masked]>
Date: Wed, 27 May 2020 19:03:26 +0200

> http://lilypond.1069038.n5.nabble.com/Difference-between-and-td160964.html

LOOOL, avec d’authentiques morceaux de dak -- j’adore :-D

Au demeurant, ce n’est plus exactement vrai aujourd’hui.
L’explication la plus actuelle se trouve ici :
http://lilypond.org/doc/v2.21/Documentation/extending-big-page#lilypond-scheme-syntax

Autrefois, $truc était absolument nécessaire pour les variables
locales (par exemple (let ((machin chose)) blablabla) ou équivalent)
dans un bloc #{ #}.  Par la suite (l’époque dont parle Pierre), c’est
devenu une question de moment d’évaluation : il était possible d’avoir
une valeur différente pour $machin ou #machin selon que #(define
machin "tagada") était placé plus haut ou plus bas dans le fichier
source. Puis encore plus tard il est devenu possible de définir
carrément au niveau lilypond tagada = "tsoin tsoin" et d’appeler
ensuite #(markup tagada) dans du Scheme, donc en gros aujourd’hui
c’est rarissime de tomber sur une mauvaise surprise lorsqu’on utilise
#.

V.

---

From: Éditions IN NOMINE <[email-masked]>
Date: Fri, 29 May 2020 11:36:47 +0200

Bon bah, ça fonctionne au quart de poil avec cette dernière version. EN
plus, j'arrive à comprendre le code !

Un grand, grand merci à Jean et Valentin !

JMarc