[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.
W-A-MOZART-Idomeneo-R-di-Cr-ta.ly
Description: Text Data