• Willkommen im Forum „Archiviertes Lilypond Forum (2017)“.
 

Dies ist das Archiv des alten Forums (bis März 2017). Das aktuelle Forum ist unter lilypondforum.de zu finden.
This is the archive of the old forum (until March 2017). You can find the current forum at lilypondforum.de.

Hauptmenü

Datentyp pair? in einer Funktion

Begonnen von stefanhuglfing, Samstag, 29. März 2014, 15:54

Vorheriges Thema - Nächstes Thema

stefanhuglfing

ich Versuche gerade, mir eine Funktion zu basteln und habe Schwierigkeiten mit dem Datentyp "pair"

Ich möchte der Funktion zwei Werte übergeben. Der erste soll für die Anzahl der Noten stehen, der zweite für die Länge.
So (mit den Typen "integer" und "duration") funktioniert es:


version "2.18.2"

ph = #(define-music-function (parser location z d )
        (integer? ly:duration? )
        #{
          {
           \repeat unfold $z { b' $d }
          }
        #})
 
\ph 12 8


Aber wenn ich versuche, beide Werte zu einem Paar zusammenzufassen, wird der zweite Wert nicht mehr als Notenwert erkannt:


\version "2.18.2"

ph = #(define-music-function (parser location zd )
        (pair? )
        #{
          {
           \repeat unfold #(car zd) { b' #(cdr zd) }
          }
        #})
 
\ph #'(12 . 8)


Geht der Datentyp "pair" vielleicht gar nicht innerhalb von lilypond?
Oder kann ich irgendwie den zweiten Wert als "ly:duration" festlegen?

harm6

Hallo,

ZitatGeht der Datentyp "pair" vielleicht gar nicht innerhalb von lilypond?
Oder kann ich irgendwie den zweiten Wert als "ly:duration" festlegen?

In Deiner ersten Funktion taucht der Notenwert, 8 für die achtel, innerhalb von LilyPond auf. Er wird deshalb als achtel, ohne Punktierung und ohne Skalierung verstanden.

In Deiner zweiten Funktion taucht die 8 innerhalb des scheme-Datentyps pair auf und wird deshalb als Zahl verstanden, und nicht als Notenwert.
Du kannst einen Notenwert draus machen, indem Du ein paar vordefinierte proceduren benutzt, den dot-count und 'duration factor' festlegst, wobei das allerdings optional ist.

Das führt zu:

\version "2.18.2"

ph = #(define-music-function (parser location zd) (pair?)
  (let ((dur (ly:make-duration (ly:intlog2 (cdr zd)) 0 1 1)))
    ;(write dur)
    #{
      {
      \repeat unfold #(car zd) { b' $dur }
      }
    #}))
 
\ph #'(12 . 8)


Du wirst aber Schwierigkeiten bekommen, falls Du punktierte bzw skalierte Notenwerte (Triolen etc) benutzen willst.

HTH,
  Harm