Subject: TR: nuances et bémol dans une fonction de groupe de notes

From: "Daniel Bernair \(Belgacom.net\)" <[email-masked]>
Date: Sat, 24 Nov 2018 16:37:55 +0100

Retransmission de ma demande pour contrôle de messagerie
inopérante.

Daniel Bernair

De : Daniel Bernair (Belgacom.net)
<[email-masked]> 
Envoyé : lundi 19 novembre 2018 09:06
À : ([email-masked]) <[email-masked]>
Objet : nuances et bémol dans une fonction de groupe de
notes 

Bonjour à tous,

Je me suis servi d’un snippet de Lilypond pour créer une
séquence des notes : 4. 4 8 qui revient fréquemment. Voir
les deux fichiers en annexe.

J’ai encodé normalement la portée soprani puis pour les alti
j’ai voulu gagner du temps et créé une variable myR et deux
fonctions strA et strB pour 4. 4 8. 

Je dois indiquer des notions de nuances sur certaines notes
du groupe voir la mesure 10 mais cela ne marche pas. 

Comment puis-je faire ?

Pour compléter ma question précédente, voici trois problèmes
supplémentaires : mesure 14 bes! est refusé par lilypond qui
ignore l’instruction

Attendait pitch, (make-music (quote NoteEvent) (quote
force-accidental) #t (quote duration) (ly:make-duration 3 0
1) (quote pitch) (ly:make-pitch -1 6 -1/2)) trouvé

\strB g c c \strB 

bes! a a %14

mesure 15 de même si dans le groupe il y a un silence le
groupe est ignoré

Attendait pitch, (make-music (quote RestEvent) (quote
duration) (ly:make-duration 3 0 1)) trouvé

\strB g c c \strB bes 

r a %15

de même en mesure 16 le lien entre a4.  et a4 provoque une
erreur identique :

Attendait pitch, (make-music (quote NoteEvent) (quote
articulations) (list (make-music (quote TieEvent))) (quote
pitch) (ly:make-pitch -1 5 0) (quote duration)
(ly:make-duration 1 1 1)) trouvé

g2.^\cresc \strB 

a~ a a %16

Comment faire ? 

Merci de votre aide.

Daniel Bernair

---

From: Valentin Villenave <[email-masked]>
Date: Sat, 24 Nov 2018 18:48:42 +0100

> fonctions strA et strB pour 4. 4 8.

Attention, ces fonctions attendent un argument ly:pitch, c’est-à-dire
seulement une hauteur sans rien d’autre (donc le point d’exclamation,
la liaison ou les silences provoquent une erreur).

En fait, utiliser ly:pitch apporte souvent plus d’inconvénients que
d’avantages (il a été conçu pour des cas très spécifiques, tels que
après \relative). Ici, on cherche à redéfinir la propriété 'duration
de n’importe quel événement : note, silence, accord, pouvant comporter
des articulations, des liaisons ou des altérations forcées, des
nuances etc. Il faut donc utiliser ly:music.

Dans un même ordre d’idées, je proposerais de détecter automatiquement
si le rythme doit s’appliquer à plusieurs notes différentes ou à une
seule note (qui doit alors être répétée), plutôt que de définir deux
fonctions différentes \strA et \strB.

> Comment puis-je faire ?

Ci-dessous une proposition ; j’ai également corrigé quelques petites
choses (notamment un double ~~) ; il n’y a pas besoin d’indiquer les
nuances avec ^\p lorsque \dynamicUp s’en charge déjà.

Au passage, privilégiez les pièces jointes .ly aux PDF (voire le code
directement dans le message comme ci-dessous).

% -------------

\version "2.18.2"

\header {
  title = "Idomeneo, Ré di Créta"
  subtitle = "Acte III, Scène I N° 18"
  composer = "W.A. MOZART"
  arranger = "Transcription pour EVI Laetare : Daniel Bernair"
}

global = {
  \key d \minor
  \time 12/8
  \tempo "Allegro assai" 4=100
}
myR = {r4 r8 r4}

% Largement inspiré de
% http://lists.gnu.org/archive/html/lilypond-user/2012-03/msg00621.html

#(define (extract-all-durations music)
   (map! (lambda (m) (ly:music-property m 'duration))
     (extract-music music
       (lambda (m) (ly:duration?
                    (ly:music-property m 'duration))))))

applyRhythm =
#(define-music-function (rhythm music)
   (ly:music? ly:music?)
   (let* ((r-elements (ly:music-property rhythm 'elements))
          (m-elements (ly:music-property music 'elements))
          (m (if (null? m-elements)
                 (ly:music-deep-copy
                  (make-sequential-music
                   (make-list
                    (length r-elements)
                    music)))
                 music))
          (durations (extract-all-durations rhythm))
          (l durations))
     (for-some-music
      (lambda (n)
        (and (pair? l)
             (if (ly:duration? (ly:music-property n 'duration))
                 (begin
                  (set! (ly:music-property n 'duration) (car l))
                  (set! l (cdr l))
                  (if (null? l) (set! l durations))
                  #t)
                 #f)))
      m)
     m))

str =
#(define-music-function (music) (ly:music?)
   #{ \applyRhythm {s4. s4 s8} $music #})

sopranoVoice = \relative c'' {
  \global
  \dynamicUp
  % En avant la musique !
  \clef soprano
  R1.*4 %4
  r4 r8 r4 d,8\f d4. d4 d8 \break %5
  f4. f4 f8 a4. a4 a8 %6
  d4. d, r4 r8 r4 d'8 %7
  d4. cis r4 r8 r4 e8 %8
  e4. d r4 r8 r4 f8\p %9
  f4. f4 f8 e4. e4 e8\f \break %10
  ees2. ees4.~ ees4 ees8 %11
  ees4. c r2. %12
  r r4 r8 r4 d8\p %13
  d4. d4 d8 d4. d4 d8 %14
  d4. d4 d8 d4. r4 d8 %15
  d2.\cresc d4.( d4) d8\! \break %16
}

altoVoice = \relative c' {
  \global
  \dynamicUp
  % En avant la musique !
  \clef alto
  R1.*4 %4
  \myR d8\f d4. d4 d8 %5
  \str f \str a %6
  \str {f d a'} f4. d %7
  \myR g8 e4. cis %8
  \myR a'8 f4. d %9
  \myR b'8\p \str {e, a a}   %10
  a2. a4.~ a4 a8 %11
  a4. a r2. %12
  r2. \myR a8\p %13
  \str {g c c} \str {bes! a a} %14
  \str {g c c}  \str {bes r a} %15
  g2.\cresc \str {a~ a a\!} %16

}

<<
  \sopranoVoice
  \altoVoice

% ----------------------

Avec le code que je vous propose, il n’est pas possible d’attacher une
nuance à une note répétée sans que la nuance ne soit répétée elle
aussi. Du coup, voici une petite astuce qui pourrait vous être utile :
plutôt que de faire
  \str bes\mp
vous pouvez utiliser un accord vide, comme ceci :
  <>\mp \str bes

Cordialement,
V. V.

---

From: "Daniel Bernair \(Belgacom.net\)" <[email-masked]>
Date: Sun, 25 Nov 2018 11:21:44 +0100

Merci Valentin. Je viens de faire un copier-coller dans Frescobaldi et compiler mais je reçois une erreur de compilation voici:
"Démarrage lilypond-windows.exe 2.18.2 [Sans titre]...
Traitement de « c:/users/daniel/appdata/local/temp/frescobaldi-hl1dt7/tmpuyvw1p/document.ly »
Analyse...C:/Program Files (x86)/LilyPond/usr/share/lilypond/current/scm/ly-syntax-constructors.scm:56:23: In expression (apply (ly:music-function-extract fun) parser ...):
C:/Program Files (x86)/LilyPond/usr/share/lilypond/current/scm/ly-syntax-constructors.scm:56:23: Wrong number of arguments to #<procedure #f (music)>
Arrêté avec le code de retour 1."
Et voici ce que j'obtiens en clicquant sur le numéro de ligne en erreur :
";;;;
;;;; LilyPond is free software: you can redistribute it and/or modify
;;;; it under the terms of the GNU General Public License as published by
;;;; the Free Software Foundation, either version 3 of the License, or
;;;; (at your option) any later version.
;;;;
;;;; LilyPond is distributed in the hope that it will be useful,
;;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
;;;; GNU General Public License for more details.
;;;;
;;;; You should have received a copy of the GNU General Public License
;;;; along with LilyPond.  If not, see <http://www.gnu.org/licenses/>.

;; TODO: use separate module for syntax
;; constructors. Also create wrapper around the constructor?
(defmacro define-ly-syntax (args . body)
  `(define-public ,args ,@body))

;; A ly-syntax constructor takes two extra parameters, parser and
;; location. These are mainly used for reporting errors and
;; warnings. This function is a syntactic sugar which uses the
;; location arg to set the origin of the returned music object; this
;; behaviour is usually desired
(defmacro define-ly-syntax-loc (args . body)
  `(define-public ,args
     (let ((m ,(cons 'begin body)))
       (set! (ly:music-property m 'origin) ,(third args))
       m)))
;; Like define-ly-syntax-loc, but adds parser and location
;; parameters. Useful for simple constructors that don't need to
;; report errors.
(defmacro define-ly-syntax-simple (args . body)
  `(define-public ,(cons* (car args)
                          'parser
                          'location
                          (cdr args))
     (let ((m ,(cons 'begin body)))
       (set! (ly:music-property m 'origin) location)
       m)))

;; Music function: Apply function and check return value.
;; args are in reverse order, rest may specify additional ones
;;
;; If args is not a proper list, an error has been flagged earlier
;; and no fallback value had been available.  In this case,
;; we don't call the function but rather return the general
;; fallback.
(define-ly-syntax (music-function parser loc fun args . rest)
  (let* ((sig (ly:music-function-signature fun))
         (pred (if (pair? (car sig)) (caar sig) (car sig)))
         (good (proper-list? args))
------>   Instruction 56 : ---->       (m (and good (apply (ly:music-function-extract fun)
                             parser loc (reverse! args rest)))))
    (if (and good (pred m))
        (begin
          (if (ly:music? m)
              (set! (ly:music-property m 'origin) loc))
          m)
        (begin
          (if good
              (ly:parser-error parser
                               (format #f (_ "~a function cannot return ~a")
                                       (type-name pred) m)
                               loc))
          (and (pair? (car sig)) (cdar sig))))))
Merci pour toute indication.
Daniel Bernair
-----Message d'origine-----
De : [email-masked] <[email-masked]> De la part de Valentin Villenave
Envoyé : samedi 24 novembre 2018 18:49
À : Daniel Bernair (Belgacom.net) <[email-masked]>
Cc : [email-masked]
Objet : Re: nuances et bémol dans une fonction de groupe de notes

On 11/24/18, Daniel Bernair (Belgacom.net) <[email-masked]> wrote:
> J’ai encodé normalement la portée soprani puis pour les alti j’ai 
> voulu gagner du temps et créé une variable myR et deux fonctions strA 
> et strB pour 4. 4 8.

Attention, ces fonctions attendent un argument ly:pitch, c’est-à-dire seulement une hauteur sans rien d’autre (donc le point d’exclamation, la liaison ou les silences provoquent une erreur).

En fait, utiliser ly:pitch apporte souvent plus d’inconvénients que d’avantages (il a été conçu pour des cas très spécifiques, tels que après \relative). Ici, on cherche à redéfinir la propriété 'duration de n’importe quel événement : note, silence, accord, pouvant comporter des articulations, des liaisons ou des altérations forcées, des nuances etc. Il faut donc utiliser ly:music.

Dans un même ordre d’idées, je proposerais de détecter automatiquement si le rythme doit s’appliquer à plusieurs notes différentes ou à une seule note (qui doit alors être répétée), plutôt que de définir deux fonctions différentes \strA et \strB.

> Comment puis-je faire ?

Ci-dessous une proposition ; j’ai également corrigé quelques petites choses (notamment un double ~~) ; il n’y a pas besoin d’indiquer les nuances avec ^\p lorsque \dynamicUp s’en charge déjà.

Au passage, privilégiez les pièces jointes .ly aux PDF (voire le code directement dans le message comme ci-dessous).

% -------------

\version "2.18.2"

\header {

global = {
  \key d \minor
  \time 12/8

% Largement inspiré de

applyRhythm =

str =

}

<<
  \sopranoVoice
  \altoVoice

% ----------------------

Avec le code que je vous propose, il n’est pas possible d’attacher une nuance à une note répétée sans que la nuance ne soit répétée elle aussi. Du coup, voici une petite astuce qui pourrait vous être utile :
plutôt que de faire
  \str bes\mp
vous pouvez utiliser un accord vide, comme ceci :
  <>\mp \str bes

Cordialement,
V. V.

---

From: "Daniel Bernair \(Belgacom.net\)" <[email-masked]>
Date: Sun, 25 Nov 2018 11:30:25 +0100

Je viens de corriger dans la source envoyée la définition de variable str en mettant les instruction entre  { ..... }  et la compilation passe.
Désolé j'aurais pu faire cela avant d'envoyer le message précédent.
Amicalement,
Daniel Bernair

---

From: Valentin Villenave <[email-masked]>
Date: Sun, 25 Nov 2018 11:46:01 +0100

On 11/25/18, Daniel Bernair (Belgacom.net) <[email-masked]> wrote:
> Merci Valentin. Je viens de faire un copier-coller dans Frescobaldi et
> compiler mais je reçois une erreur de compilation

Ah oui ! C’est de ma faute, j’ai pris l’habitude de la syntaxe des
versions récentes (au passage, je vous recommande de passer à
2.19.quelquechose un de ces jours).

Le code que je vous ai envoyé devrait fonctionner sous 2.18 en
ajoutant "parser location" dans la première parenthèse après
define-music-function, comme ceci :

% ------------------

\version "2.18.2"

\header {

global = {
  \key d \minor
  \time 12/8

% Largement inspiré de

applyRhythm =
#(define-music-function (parser location rhythm music)
   (ly:music? ly:music?)

str =
#(define-music-function (parser location music) (ly:music?)
   #{ \applyRhythm {s4. s4 s8} $music #})

}

<<
  \sopranoVoice
  \altoVoice

% ----------------

Cordialement,
V. Villenave.

---

From: "Daniel Bernair \(Belgacom.net\)" <[email-masked]>
Date: Sun, 25 Nov 2018 12:15:42 +0100

Merci Valentin, cela fonctionne très bien. 
Mon souci est le suivant : j'ai des crevasses dans le bout des doigts et cela me fait souffrir assez bien en utilisant le clavier ou la souris. C'est pour cela que j'encode les notes sous le nom germanique (un caractère au lieu de deux) et que j'essaye des petites variables qui ne m'embrouillent pas trop la source. Je vais également examiner ces définitions de fonction pour comprendre un peu plus.
J'essayerai de passer à la 2.19 sans trop tarder.
Merci et amicalement.
Daniel Bernair