Hallo allerseits,
ich möchte eine Funktion schreiben, die einen Faktor als Argument nimmt und als Rückgabewert eine entsprechend skalierte Longa zurückgibt. Folgendes geht nicht:\version "2.22.2"
lll =
#(define-music-function (factor) (number?)
(ly:make-duration -2 0 factor))
<<
{
c'\lll #3/4 c'4
}
\repeat unfold 32 a4
>>
Ich habe verschiedenes probiert und dabei eine Merkwürdigkeit festgestellt. Und zwar tun die folgenden beiden Dinge nicht das gleiche, beim zweiten Beispiel heißt es stattdessen ,,ignoring non-music expression":
\version "2.22.2"
foo = #(ly:make-duration -2 0 1)
{ c'\foo c'4 }
{ c'#(ly:make-duration -2 0 1) c'4 }
Was mach ich falsch?
Viele Grüße
Malte
P. S.: Ja, in diesem Beispiel könnte ich \longa*3/4 schreiben, aber ich möchte in verschiedenen Ausgaben verschiedene Dauern stehen haben und dafür verschiedene Versionen dieser Funktion schreiben.
Hallo Malte,
lll =
#(define-music-function (factor) (number?)
(ly:make-duration -2 0 factor))
scheitert, weil Du eine Dauer auszugeben versuchst. Eine music-function muß aber etwas ausgeben das bei der Prüfung mit ly:music? positiv retourniert. Aber:
\void \displayScheme #(ly:music? (ly:make-duration -2 0 3/4))
gibt #f zurück.
Warum
{ c'#(ly:make-duration -2 0 1) c'4 }
fehl geht hab' ich im Moment nicht auf der Pfanne, aber
{ c'$(ly:make-duration -2 0 1) c'4 }
funktioniert.
Als Funktion also:
\version "2.22.2"
lll =
#(define-scheme-function (factor) (number?)
(ly:make-duration -2 0 factor))
<<
{
c'$(lll 3/4)
c'4
}
\repeat unfold 32 a4
>>
HTH,
Harm
Hallo Harm,
danke für deine Antwort! Tatsächlich hatte ich es auch mit define-scheme-function probiert, weil ich mir so etwas gedacht habe; da es aber nicht funktioniert hat, dachte ich, ich müßte bei letzterem noch den Rückgabetyp angeben oder so und habe dazu nichts gefunden. Daß $ statt # bzw. LilyPond-Syntax mit \ funktioniert, darauf wäre ich nicht gekommen, danke!
Etwas merkwürdig: Irgendwie scheint die Dauer an sich nicht das Problem zu sein,
\displayMusic \lll #3/4zeigt, daß ein NoteEvent mit der korrekten Dauer erzeugt wird. Nur sobald das in etwas größeren Kontext (z. B. SequentialMusic) gepackt wird, gehts nicht mehr:
\displayMusic { \lll #3/4 }
Einfache Ersetzungen wie
longa = #(ly:make-duration -2 0 1)sind übrigens kein Problem (c'\longa tut ja, was es soll), erst als Funktion mit einem Argument wirds komisch, da geht die LilyPond-Syntax nicht mehr.