Hallo Manuela,
auch von mir ein herzliches willkommen hier im Forum.
Wenn ich einen Akkord als Variable zuweise, so macht Lilypond immer Viertelnoten daraus, egal welche Länge die vorhergehende Note hatte. Was mache ich falsch?
Hier ein Beispiel:
\version "2.18.2"
FDur = < f' a c >
\score
{
\new Staff \relative c {
\clef bass
\key f \major
f,8 \FDur f, \FDur
}
}
Die Zuweisung:
FDur = < f' a c >
führt zu einer
statischen Variablen, da nicht nur die Tonhöhen, sondern auch die Dauern festgekloppt werden und nicht mehr einfach verändert werden können. LilyPond fällt auf den default zurück falls nirgendwo Dauern angegeben sind. Und das sind Viertel.
Siehe auch den output von
#(display-scheme-music FDur)
(make-music
'EventChord
'elements
(list (make-music
'NoteEvent
'duration
(ly:make-duration 2)
'pitch
(ly:make-pitch 0 3))
(make-music
'NoteEvent
'duration
(ly:make-duration 2)
'pitch
(ly:make-pitch -1 5))
(make-music
'NoteEvent
'duration
(ly:make-duration 2)
'pitch
(ly:make-pitch -1 0))))
Eugenios coding umgeht das scheinbar
\version "2.18.2"
FDur = #(define-music-function (parser location)()
#{
<f a c>
#}
)
\relative c'{
c2 \FDur
}
denn
FDur = #(define-music-function (parser location)()
#{
<f a c>
#}
)
\relative c'{
c2 \FDur
}
#(display-scheme-music FDur)returniert:
#<Music function #<procedure #f (parser location)>>
D.h. die
Funktion FDur wird erst evaluiert, wenn sie aufgerufen wird und übernimmt damit die aktuelle Tondauer von vorher oder den default.
Es gibt allerdings
keine Möglichkeit eigene Tondauern zu setzen.
Ich schrieb oben schon, daß es keine einfache Möglichkeit gibt eine einmal festgesetzte Dauer zu verändern, aber mit ein bißchen Aufwand geht es schon.
Führt allerdings dazu, daß Du die Dauer
immer angeben mußt und zwar als string, d.h. mit quotation-marks, z.B.: "8.", für eine punktierte Achtel.
Hier das coding:
\version "2.18.0"
#(use-modules (ice-9 regex))
%% c/p from define-markup-commands.scm
%% because it's not public
#(define (parse-simple-duration duration-string)
"Parse the `duration-string', e.g. ''4..'' or ''breve.'',
and return a (log dots) list."
(let ((match (regexp-exec (make-regexp "(breve|longa|maxima|[0-9]+)(\\.*)")
duration-string)))
(if (and match (string=? duration-string (match:substring match 0)))
(let ((len (match:substring match 1))
(dots (match:substring match 2)))
(list (cond ((string=? len "breve") -1)
((string=? len "longa") -2)
((string=? len "maxima") -3)
(else (log2 (string->number len))))
(if dots (string-length dots) 0)))
(ly:error (_ "not a valid duration string: ~a") duration-string))))
#(define (chord transpose-to chrd duration-string)
(let* ((parsed-dur-string (parse-simple-duration duration-string))
(duration
(ly:make-duration (car parsed-dur-string) (cadr parsed-dur-string))))
(music-map
(lambda (m)
(if (music-is-of-type? m 'note-event)
(begin
(ly:music-set-property! m 'duration duration)
(ly:music-property #{ \transpose c $transpose-to $m #} 'element))
m))
chrd)))
chrd-func =
#(define-scheme-function (parser location transpose-to chrd)
(ly:pitch? ly:music?)
(define-music-function (parser location duration-string)
(string?)
(chord transpose-to chrd duration-string)))
Dur = < c e g >
%% Using \chordmode is possible as well, may result in the need to transpose
%% differently
moll = \chordmode { c:m }
c-dur = \chrd-func c \Dur
d-dur = \chrd-func d \Dur
e-dur = \chrd-func e \Dur
f-dur = \chrd-func f \Dur
g-dur = \chrd-func g \Dur
c-moll = \chrd-func c, \moll
\score {
\new Staff \relative c {
\clef bass
\key f \major
\c-dur "4."
\d-dur "8"
\e-dur "16.."
\c-moll "32"
}
}Letztendlich scheint es nur die Möglichkeiten zu geben die Dauern
immer zu übernehmen oder
immer selbst anzugeben. Zumindest habe ich keine anderen Weg gefunden.
Gruß,
Harm