lilypond-user-fr
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

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


From: Daniel Bernair \(Belgacom.net\)
Subject: RE: nuances et bémol dans une fonction de groupe de notes
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 : address@hidden <address@hidden> De la part de Valentin Villenave
Envoyé : samedi 24 novembre 2018 18:49
À : Daniel Bernair (Belgacom.net) <address@hidden>
Cc : address@hidden
Objet : Re: nuances et bémol dans une fonction de groupe de notes

On 11/24/18, Daniel Bernair (Belgacom.net) <address@hidden> 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 {
  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.

Attachment: W-A-MOZART-Idomeneo-R-di-Cr-ta.ly
Description: Text Data


reply via email to

[Prev in Thread] Current Thread [Next in Thread]