Funktion mit Rückgabewert ly:duration?

Begonnen von Malte, Mittwoch, 24. August 2022, 13:25

« vorheriges - nächstes »

Malte

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.

harm6

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

Malte

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.