define-music-function mit Duration als Parameter - wie? gelöst

Begonnen von Manuela, Sonntag, 21. Oktober 2018, 16:45

« vorheriges - nächstes »

Manuela

Hi,

ich möchte eine Funktion schreiben, die als Parameter eine Dauer und einen musikalischen Ausdruck enthält. Gedacht ist an eine Folge von Noten ohne Dauerangabe, der eine Dauer zugewiesen werden soll.

Folgendes funktioniert nicht:

\version "2.19.80"

myMus = { c e f }
myDur =
#(define-music-function (d music)(ly:duration? ly:music?)
   #{
    <>$(ly:duration->string d) $music
   #}
    )

\myDur #(ly:make-duration 4) \myMus


Ich erhalte als Fehlermeldung

Warnung: Nicht-musikalischer Ausdruck wird ignoriert
    <>
      $(ly:duration->string d) $music


Ich nehme an, das kommt daher, dass ein String keine zulässige Angabe einer Notendauer ist. Ich habe keine passende Funktion gefunden, die eine zulässige Notendauer erzeugt, wie muss ich die Funktion formulieren? Vll. gibt es ja eine ganz andere Lösung,
Danke für eure Unterstützung
Danke für eure Hilfe
viele Grüße
-- Manuela

harm6

Hallo Manuela,

offensichtlich versuchst Du die gerade gültige default Dauer zu beeinflussen.
LilyPond setzt diese ja auch immer auf den zuletzt gesehenen Wert, ich weiß aber nicht wie und wo das geschieht und wie man das dann auslesen kann.
Insofern hier ein anderer Ansatz, der die Notenwerte getreu der Eingabe neu setzt.
Die Eingabe kann in ly-Syntax einfach als Notenwert erfolgen.


\version "2.19.82"

myMus = { c e <f a> }


myDur =
#(define-music-function (d music)(ly:duration? ly:music?)
  (map-some-music
   (lambda (m)
     (and (music-is-of-type? m 'rhythmic-event)
          (begin
           (ly:music-set-property! m 'duration d)
           m)))
     music))

\myDur 8. \myMus


Gruß,
  Harm

Manuela

Danke für eure Hilfe
viele Grüße
-- Manuela