Autor Thema: Datentyp pair? in einer Funktion  (Gelesen 1355 mal)

stefanhuglfing

  • Member
Datentyp pair? in einer Funktion
« am: Samstag, 29. März 2014, 15:54 »
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

  • Member
Re: Datentyp pair? in einer Funktion
« Antwort #1 am: Samstag, 29. März 2014, 17:14 »
Hallo,

Zitat
Geht 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