Boucle sur fichier maître

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

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/

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.

···

Le 27/05/2020 à 14:17, Jean Abou Samra a écrit :

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
(LilyPond Notation Reference: 4.2.1 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/

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

···

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

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

JMarc

···

Le 27/05/2020 à 15:15, Jean Abou Samra a écrit :

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 :
LilyPond Notation Reference: 5.6.2 Substitution function examples

Cordialement,
Jean Abou Samra

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

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

Encore plus automatisé peut-être :

%% cf Re: deux colonnes musique et texte

%%%%

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

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.

···

On 5/27/20, Éditions IN NOMINE <****@****> wrote:

Bonjour,

vvillenave wrote

           \new PianoStaff \with {instrumentName = $titreX } <<
             \new Staff = "right" { $rightX }
             \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

···

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

Bonsoir Jean,

...

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

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

···

Le mer. 27 mai 2020 à 18:30, Jean Abou Samra <****@****> a écrit :

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

Au demeurant, ce n’est plus exactement vrai aujourd’hui.
L’explication la plus actuelle se trouve ici :

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.

···

On 5/27/20, Pierre Perol-Schneider <****@****> wrote:

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

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

···

Le 27/05/2020 à 16:40, Valentin Villenave a écrit :

On 5/27/20, Éditions IN NOMINE <****@****> wrote:

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

Encore plus automatisé peut-être :

%% cf Re: deux colonnes musique et texte

%%%%

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

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.