Subject: Création d'une fonction simple

From: Seventies <[email-masked]>
Date: Wed, 18 Nov 2020 14:28:30 -0700 (MST)

Bonsoir à l'équipe,
Un peu gêné de poser une question aussi simple, mais voilà, je n'ai plus
utilisé Lily depuis longtemps (sauf pour des travaux simples), et ici, je
cherche à générer une fonction simple de substitution, et je ne retrouve
plus la syntaxe. C'est élémentaire, mais, ...
Je cherche à introduire dans les parties séparées d'un sextuor les
indications d'archet, mais pas dans la conductrice.
Il 'suffit' donc de construire une fonction du genre
\fUpBow {a4(}
qui remplacerait la séquence suivante :

\tag #'partScore {
  a4( \upbow
}
\elseTag #'partScore {
  a4(
}

Je me doute que ça doit commencer par un
fUpBow = #(define-music-function (parser location note) (ly:music?)
  #{

Mais pour le reste, tous mes essais conduisent à des erreurs.

Merci d'avance,

Jean-François

-----
Liste des partitions LilyPond en http://www.espace-midi.com/lilypond
--
Sent from: http://lilypond-french-users.1298960.n2.nabble.com/

---

From: Gilles Thibault <[email-masked]>
Date: Fri, 20 Nov 2020 03:03:11 +0100

> qui remplacerait la séquence suivante :

Bonjour.
Je ne sais pas si c'est ça que vous voulez :

         %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\version "2.20.0"

%%%%%%%%%%%%%% sans la fonction

music = {
\tag #'score {
   a4( \upbow a)
}
\tag #'part {
   a4( a)
}
}

{ \music }

{ \keepWithTag #'score \music  }

{ \keepWithTag #'part \music  }

%%%%%%%%%%%%%% avec une fonction

fUpBow = #(define-music-function (note) (ly:music?)
   #{
   \tag #'score { $note \upbow }
   \tag #'part { $note } #})

music = { \fUpBow a4( a) }

{ \music }

{ \keepWithTag #'score \music }

{ \keepWithTag #'part \music }

         %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

2 petites remarques :

1) la fonction \elseTag n'existe pas mais ça fait peut-être référence à 
ça :

    http://lsr.di.unimi.it/LSR/Item?id=381

J'avais fait cette fonction il y a des années, mais je ne l'utilise plus 
car avec arranger.ly on n'a plus besoin des \tag
[simplement (if (part? 'score) music1 music2))]
Sur des gros projets, la gestion des \tag peut devenir un gros 
casse-tête

2) Pour 2.18, la déclaration de la fonction fUpBow devra effectivement 
rajouter les paramètres parser et location

   ...

3) (ok j'avais dis 2 )

j'ai bien aimé le lien espace-midi à la fin du message. Bravo. Énorme 
travail.

-- 
Gilles

---

From: Seventies <[email-masked]>
Date: Fri, 20 Nov 2020 03:37:31 -0700 (MST)

C'est effectivement ce que je cherchais, mais la syntaxe était fort loin dans
a mémoire.
Grand merci donc pour cette solution.
Pour le reste, j'utilise énormément la fonction complémentaire elseTag pour
différencier les sorties "parties séparées" et "conductrice". Avec une
gestion rigoureuse des fichiers insérés, ça ne pose pas de problème, et je
n'ai pas encore investi dans arranger.ly :-(
Mais il est vrai que si on multiplie les variables, les fonctions tag et
elseTag deviennent vite un lourd casse-tête ...

Encore une fois merci pour ce code, je le mettrai en œuvre dès ce soir,

Jean-François

-----

---

From: Seventies <[email-masked]>
Date: Fri, 20 Nov 2020 10:52:20 -0700 (MST)

Voilà, juste une remarque, mais c'était un peu le point faible de mes essais
: je voudrais que la note soit transmise comme argument de la fonction, et
non comme une constante.

La fonction ressemblerait donc à ceci :

cUpbow =
#(define-music-function (parser location note) (ly:music?)
   #{
     \tag #'partScore {
       $note \upbow
     }
     \elseTag #'partScore {
       $note
     }
   #}
   )

éventuellement, en remplaçant le \upbow par un markup {\musicglyph ... } si
c'est plus simple.

Mais évidemment, ça coince syntaxiquement au niveau du \upbow, et je ne sais
pas comment introduire cet argument à l'intérieur d'une fonction scheme.

L'exposé du problème n'était pas tout à fait clair, je pense qu'ici, c'est
plus explicite, je m'en excuse.

Cordialement,

Jean-François

-----

---

From: Gilles Thibault <[email-masked]>
Date: Wed, 25 Nov 2020 01:35:48 +0100

> : je voudrais que la note soit transmise comme argument de la fonction, 

je ne comprends pas, ce n'était pas le cas ?

> #(define-music-function (parser location note) (ly:music?)

Ben ça, je ne vois pas de raisons que ça ne marche pas.
La seule chose qui peut se passer, c'est qu'on ne peut pas mettre une 
note sans rythme car sinon Lilypond la considère comme un "pitch" 
(ly:pitch?)

\cUpbow c4  % Ok, "c4" est une "music (ly:music?)
\cUpbow c   % Erreur. "c" n'est plus considéré comme une "music"
             % mais comme un "pitch".

-- 
Gilles

---

From: Seventies <[email-masked]>
Date: Fri, 27 Nov 2020 03:57:35 -0700 (MST)

Je dois avouer ma presque complète ignorance du Scheme, de la technique de
transmission des arguments, surtout plus s'il s'agit d'un argument musical.

cUpbow =

Cet fonctionne, je ne dois pas être loin du but, mais si je fais un appel :
  cUpbow (e4)  --  avec la variable #'partScore définie
j'obtiens  \upbow unexpected EVENT_IDENTIFIER et une erreur fatale
Par contre si #'partScore n'est pas défini, tout se passe bien.

J'ai parcouru la documentation, il y a des exemples bien plus complexes, que
je comprends et que je sais modifier, mais pas un seul exemple aussi simple
que d'utiliser une note transmise comme argument, à laquelle ajouter un
\markup - puisque le \upbow peut aisément être remplacé par un \markup ;-(

Jean-François

-----

---

From: Philhar <[email-masked]>
Date: Fri, 27 Nov 2020 14:40:37 -0700 (MST)

Bonsoir,

En utilisant simplement une variable, cela semble répondre à la demande:

% définition des variables
ub = \tag #'part \upbow
db = \tag #'part \downbow

% utilisation dans music:
music = { c4\ub d2\db e4 }

% sorties

Les indications figurent dans la partie, et pas dans le conducteur.

Cordialement,
Michel

---

From: Gilles Thibault <[email-masked]>
Date: Fri, 27 Nov 2020 22:48:19 +0100

>   cUpbow (e4)

\cUpbow e4      % la barre oblique, et pas de parenthèse pour la note

-- 
Gilles