Autor Thema: Integer Variablen benutzen  (Gelesen 1666 mal)

infranator

  • Member
Integer Variablen benutzen
« am: Montag, 15. April 2013, 21:39 »
Hallo Leute,

es müsste doch irgendwie möglich sein in Lilypond integer zu benutzen.
Ich würde gerne folgendes:

RestD = R4*5*14
CompD = \comp #(* 5 14)
SncD = s4*5*14

zum Beispiel so aufschreiben:
i=14
RestD = R4*5*$i
CompD = \comp #(* 5 '$i')
SncD = s4*5*$i

Warum?
Aus Faulheit  ;)

harm6

  • Member
Re: Integer Variablen benutzen
« Antwort #1 am: Montag, 15. April 2013, 22:33 »
Hallo infranator,

LilyPond akzeptiert in ihren eigenen Variablen keine Prozeduren.
Insoweit ist:
Zitat
RestD = R4*5*$i
CompD = \comp #(* 5 '$i')
SncD = s4*5*$i
prinzipiell nicht möglich.

Du kannst natürlich scheme bemühen, mußt dabei aber beachten, daß die Zahlen hinter einer MultiMeasure- bzw spacer-Rest immer eine Dauer angeben.

Z.B.:

\version "2.16.2"

RestD =
#(define-music-function (parser location n)(integer?)
;; R4*5*n
(make-music
          'MultiMeasureRestMusic
          'duration (ly:make-duration 2 0 (* 5 n))
          'articulations '()))

{
\time 1/4
\RestD #2
}
funktioniert.

Aber ist das wirklich eine Erleichterung?


Gruß,
  Harm

P.S. Was \comp ist ahne ich nicht. Hast Du ja nicht geschrieben.

Be-3

  • Member
Re: Integer Variablen benutzen
« Antwort #2 am: Montag, 15. April 2013, 22:40 »
Hallo infranator,

ich würde so etwas ganz "altmodisch" als Scheme-Funktion über make-music definieren - da kannst Du mit Variablen rechnen, so viel Du willst:

i=14

#(define RestD
   (make-music 'MultiMeasureRestMusic 'duration (ly:make-duration 2 0 (* 5 i))))

#(define SncD
   (make-music 'SkipEvent 'duration (ly:make-duration 2 0 (* 5 i))))

Vielleicht gibt es noch einen moderneren Weg mit define-music-function in der #{ ... #}-Umbegung...

Viele Grüße
Torsten

PS: Ah, Harm hat das quasi auch geschrieben und ist mir zuvorgekommen. Mit dem kleinen Unterschied, daß ich wie gewünscht die globale Variable i benutze.
Und \comp kenne ich auch nicht. ;)

PPS: Wozu braucht man eigentlich die #'articulations? Ich weiß, \displayMusic gibt sie mit aus, aber warum?
« Letzte Änderung: Montag, 15. April 2013, 22:47 von Be-3 »

harm6

  • Member
Re: Integer Variablen benutzen
« Antwort #3 am: Montag, 15. April 2013, 23:05 »
Hallo Torsten,

Zitat von: Torsten
PPS: Wozu braucht man eigentlich die #'articulations? Ich weiß, \displayMusic gibt sie mit aus, aber warum?

Ganz ehrlich?

Ich war zu faul nachzuprüfen warum sie da stehen und habe sie der Sicherheit wegen drin gelassen, ebenfalls ohne zu prüfen, ob man sie hier weglassen kann. ;)

Hab' ich aber jetzt nachgeholt. :)

Die leere Liste der 'articulations kann gefüllt werden mit MultiMeasureRestText/fermataMarkup o.ä.

Beispiel:

\version "2.16.2"

{
\time 1/4
\displayMusic {
\override MultiMeasureRestText #'padding = #5
R4_"right"^\fermataMarkup
}
}

gibt folgendes aus:

(make-music
  'SequentialMusic
  'elements
  (list (make-music
          'ContextSpeccedMusic
          'context-type
          'Bottom
          'element
          (make-music
            'OverrideProperty
            'pop-first
            #t
            'grob-property-path
            (list (quote padding))
            'grob-value
            5
            'symbol
            'MultiMeasureRestText))
        (make-music
          'MultiMeasureRestMusic
          'duration
          (ly:make-duration 2 0 1)
          'articulations
          (list (make-music
                  'MultiMeasureTextEvent
                  'direction
                  -1
                  'text
                  "right"
                  'tags
                  '())
                (make-music
                  'MultiMeasureTextEvent
                  'direction
                  1
                  'tweaks
                  (list (cons (quote text) #<procedure #f (grob)>)
                        (cons (quote outside-staff-priority) 40)
                        (cons (quote outside-staff-padding) 0)))))))

fermataMarkup kann man in /ly/property-init.ly nachschlagen.

Man könnte also darüber nachdenken eine Funktion, wie aus meinem vorangegangenen post, so zu erweitern, daß MultiMeasureText an die MultiMeasureRest gehängt werden kann.

Aber ist das sinnvoll?


HTH, ;)
  Harm
« Letzte Änderung: Montag, 15. April 2013, 23:08 von harm6 »

infranator

  • Member
Re: Integer Variablen benutzen
« Antwort #4 am: Dienstag, 16. April 2013, 11:56 »
Zitat
i=14

#(define RestD
   (make-music 'MultiMeasureRestMusic 'duration (ly:make-duration 2 0 (* 5 i))))

#(define SncD
   (make-music 'SkipEvent 'duration (ly:make-duration 2 0 (* 5 i))))

Super, so etwas hatte ich mir erhofft! Vielen Dank an euch beide.
Ich hoffe irgendwann diesen Scheme Kram zu verstehen.
\comp habe ich aus dem LSR, kann natürlich keiner wissen  ;)
http://lsr.dsi.unimi.it/LSR/Item?id=332