define pitch

Begonnen von Köbi, Dienstag, 1. August 2017, 19:33

« vorheriges - nächstes »

Köbi

Hi, wie kann ich einer Variablen in diesem Fall einen Wert zuordnen? Statt


transposeTo = bes,

\transpose c \transposeTo { f' }


würde ich gerne


#(if (not (defined? 'transposeTo)) (define transposeTo bes))

\transpose c \transposeTo { f' }


verwenden. Die Variable soll nur initialisiert werden, wenn es sie noch nicht. Gibt es irgendwo eine Beschreibung zu diesen Datentypen? Konkret suche ich noch die Syntax für boolean:


#(if (not (defined? 'headerBreakbefore)) (define headerBreakbefore ##t))

\header {
  breakbefore = \headerBreakbefore
}


Das funktioniert nämlich leider auch nicht.

harm6

Hallo,

Du schmeißt LilyPond-Syntax und scheme (genauer: guile) durcheinander.
Das geht natürlich, aber man muß schon korrekt anzeigen wo man sein möchte.

Zum ersten Beispiel (pitch):
bes ist ein Notenname in lily-syntax, in guile ist er nicht definiert.
Am einfachsten kann man das ans Laufen kriegen, indem man lily-syntax in guile mittels #{ #} aufruft:

#(if (not (defined? 'transposeTo)) (define transposeTo #{ bes #}))

\transpose c \transposeTo { f' }


Zum zweiten Beispiel:

##t ist quasi das lily-boolean für true.
#t ist das guile-boolean für true.
Sobald der Lilyparser ein #-Zeichen sieht schickt er was folgt zum guile-interpreter.
Ich schrieb quasi, denn LilyPond kriegt ##t gar nicht zu sehen, was nachdem ersten # kommt ist guile.

Wegen dem rot markierten #-Zeichen bist Du also in guile, dann ist das grün markierte aber in der falschen "Sprache".
#(if (not (defined? 'headerBreakbefore)) (define headerBreakbefore ##t))
In guile ist ##t nicht definiert!
Also entweder #{ ##t #} (aber warum der Umstand) oder gleich #t.

Führt zu:

#(if (not (defined? 'headerBreakbefore)) (define headerBreakbefore #t))


  \header {
    title = "This is my Title"
    subtitle = "This is my Subtitle"
    copyright = "This is the bottom of the first page"
  }
  \score {
    \repeat unfold 4 { e'' e'' e'' e'' }
    \header {
      piece = "This is the Music"
      breakbefore = \headerBreakbefore
    }
  }


Gruß,
  Harm

Köbi

Vielen Dank Harm! Konnte es umsetzen. Und diesen konkreten Fall habe ich auch begriffen, was natürlich nicht heisst, dass ich das nächste mal wieder über dasselbe stolpere...