Autor Thema: Circle-padding als variable einsetzen...  (Gelesen 2482 mal)

hosios

  • Member
Circle-padding als variable einsetzen...
« am: Dienstag, 26. Juli 2011, 15:56 »
Hallo,

Der Titel dieses Themas ist vielleicht nicht so erklärend. Weiss aber nicht wie ich das in einem Satz erklären soll was ich sagen will.

Mein Problem:

Ich möchte folgenden code mehrmals einsetzen. (Es geht um Gruppenanweisungen bei Kanons)
Wenn ich ihn direkt in der Staff umgebung reintippe klappt es super,

\new Staff   
\relative c' {
\key f \major
\time 4/4
\autoBeamOff
c'4^\markup { \override #'(circle-padding . 0.5) \circle { "1." }  } d c d  \bar "|."  }
}

wenn ich es aber als einer Variable definiere, (Datei Definitions.ly, aufgerufen mit \include) bekomme ich folgende Fehlermeldung:

Definitions.ly:136:7: error: syntax error, unexpected \markup
um = {
       \markup { \override #'(circle-padding . 0.5) \circle { "1." }  } }
Definitions.ly:136:52: error: unknown escaped string: `\circle'
um = { \markup { \override #'(circle-padding . 0.5)
                                                    \circle { "1." }  } }
Uniscore.ly:56:20: error: syntax error, unexpected MUSIC_IDENTIFIER
      c'4^
                    \um  d c d  \bar "|."  }


Was mache ich falsch?

andre Variabeln die ich eingesetz habe funktionieren gut, wie z.B:

dcafc = { \mark \markup { \center-column { "D.C." "al Fine" } } }

oder

tm = "Text u. Melodie: "

und auch noch:

cross = { \override Staff.NoteHead  #'style = #'cross }

harm6

  • Member
Re: Circle-padding als variable einsetzen...
« Antwort #1 am: Dienstag, 26. Juli 2011, 16:34 »
Hallo Paul,

das ist ein Klammerproblem:

um
= \markup { \override #'(circle-padding . 0.5) \circle { "1." }  }

funktioniert.
Im übrigen funktionieren auch:

dcafc = \mark \markup { \center-column { "D.C." "al Fine" } }
cross = \override Staff.NoteHead  #'style = #'cross

Warum in der Definition für um das Einklammern schädlich ist, aber in dcafc und cross nicht, weiß ich nicht so genau.
Vielleicht kann ja jemand anderer die Erklärung beisteuern.

Gruß,
  Harm

hosios

  • Member
Re: Circle-padding als variable einsetzen...
« Antwort #2 am: Dienstag, 26. Juli 2011, 18:35 »
Danke,

hatte schon so viel probiert (über 'ne Stunde rumgespielt) aber auf diese Lösung wäre ich glaub nicht gekommen.

Ist doch Merkwürdig, das mit den Klamern.

hosios

  • Member
Re: Circle-padding als variable einsetzen...
« Antwort #3 am: Dienstag, 26. Juli 2011, 19:05 »
Das funktioniert jetzt sehr gut.

bin jetzt auf ein neues Problem gestossen.

Manchmal kommt das so aus, dass ich diese Variable verschieben möchte. z.B.  wenn ich \halign # 3 in der Definition hinzufüge bekomme ich was ich will

um = \markup { \override #'(circle-padding . 0.5) \circle \halign # 3 { "1" }  }

Aber das ist dann immer so wenn ich \um im Dokument brauche.

Ist da eine Möglichkeit, dass ich das nach belieben im Dokument mit \um gebrauchen kann?  (Ok, ich weiss, dass es geht, aber ich weiss nicht wie. )  :D

Danke

harm6

  • Member
Re: Circle-padding als variable einsetzen...
« Antwort #4 am: Dienstag, 26. Juli 2011, 22:18 »
Neben der banalen Möglichkeit verschiedene um einzeln und mit verschiedenen Werten zu definieren, hilft nur eine Funktion.

\version "2.14.1"

umI = #(define-music-function (parser location hAlign mrkp) (number? string?)
(make-music
'TextScriptEvent
'text
(markup
   (#:override (cons 'circle-padding 0.5)
    #:halign hAlign
    #:circle
        mrkp))
))

\relative c' {
c'1^\markup { \override #'(circle-padding . 0.5) \halign #3 \circle { "1." } }
d^\umI #-0.6 #"2."
c
}

Gruß,
  Harm

hosios

  • Member
Re: Circle-padding als variable einsetzen...
« Antwort #5 am: Mittwoch, 27. Juli 2011, 03:39 »
Vielen Dank, Harm

Zu der banalen Möglichkeit hätte ich auch kommen können, sorry. Eigentlich hatte ich ja auch schon selber so eine Lösung gebraucht.

Aber die Zweite ist ja natürlich viel eleganter, und ich kann die für jede Situation anpassen.

Thanks.

Paul

Heinz

  • Member
Re: Circle-padding als variable einsetzen...
« Antwort #6 am: Freitag, 29. Juli 2011, 11:11 »
Hallo zusammen,

was ich noch nicht kapiert habe, ist, wie man eine veränderte Eigenschaft innerhalb eines \markup-Blockes durch eine Variable ersetzt. - Ohne Variable geht´s:
\version "2.15.0"

\markup {
\override #'(baseline-skip . 10)
\column {
"Zeile 1"
"Zeile 2"
}
}

Mit Variable geht´s nicht:
\version "2.15.0"

Zeilenabstand = \override #'(baseline-skip . 10)

\markup {
\Zeilenabstand
\column {
"Zeile 1"
"Zeile 2"
}
}

Wie kann ich das denn bewerkstelligen? Habe auch schon mit Klammern erfolglos rumprobiert…

Fragt
Heinz.

harm6

  • Member
Re: Circle-padding als variable einsetzen...
« Antwort #7 am: Freitag, 29. Juli 2011, 16:36 »
Hallo Heinz,

es wäre besser Du würdest einen neuen Thread angefangen haben, denn es handelt sich um ein anderes Problem.

Nichtsdestotrotz hier meine Antwort:
Wenn man die Definition für \column in define-markup-commands.scm nachschlägt erhält man:

(define-markup-command (column layout props args)
  (markup-list?)
  #:category align
  #:properties ((baseline-skip))
  (let ((arg-stencils (interpret-markup-list layout props args)))
    (stack-lines -1 0.0 baseline-skip
                 (remove ly:stencil-empty? arg-stencils))))


Dort sieht man dann #:properties ((baseline-skip)) in der vierten Zeile. Es handelt sich dabei um ein property, welches mit zwei Methoden überschrieben werden kann:

1. Innerhalb einer context-Umgebung (\score, \staff, \voice oder auch nur \relative) mit [\once]\override TextScript #'baseline-skip = #10

\relative c' {
       
\override TextScript #'baseline-skip = #10

a'^\markup {\column
            {
"Zeile 1"
"Zeile 2"
            }
}
}

2. Innerhalb eines markups mit \override #'(baseline-skip . 10). Diese Konstruktion verhält sich aber ähnlich wie der \tweak-Befehl, was die Einsetzbarkeit in einer Variablen angeht: Geht nicht!

Ich denke lilypond versucht einen Befehl wie Dein Zeilenabstand = \override #'(baseline-skip . 10) als ein markup-command zu verstehen, was es nicht ist, und deshalb geht es schief.

Hier zeigen sich dann aber auch die Lösungsansätze:

1. Neues markup-command: Wenn man ein markup-command definiert, welches die baseline-skip manipuliert wird es klappen:

\version "2.14.1"

#(define-markup-command (baselineSkip layout props increment arg) (number? markup?)
    (interpret-markup layout props
(markup (#:override (cons 'baseline-skip increment) arg))))

%--------------------- Test ----------------------------------------------------

\markup {
\baselineSkip #10
\column {
"Zeile 1"
"Zeile 2"
}
}

2. Das Argument neu definieren: (von \override #'(baseline-skip . 10) )

\version "2.14.1"

%#(define zeilenAbstand '(baseline-skip . 10))
% oder so:
zeilenAbstand = #'(baseline-skip . 10)

%--------------------- Test ----------------------------------------------------

\markup {
\override #zeilenAbstand

\column {
"Zeile 1"
"Zeile 2"
}
}

3. Innerhalb eines context:

\version "2.14.1"

ZeilenAbstand = \override TextScript #'baseline-skip = #10

\relative c' {
       
        \ZeilenAbstand

a'^\markup {\column
            {
"Zeile 1"
"Zeile 2"
            }
}
}

Gruß,
  Harm

Heinz

  • Member
Re: Circle-padding als variable einsetzen...
« Antwort #8 am: Freitag, 29. Juli 2011, 17:09 »
Hallo Harm,

vielen Dank, echt super!
Daß man nur das Argument von \override in eine Variable packen kann (Dein zweiter Vorschlag), ist ja echt klasse - wär ich von selbst nie drauf gekommen.
Die Sache mit dem Kontext (Deine Nr. 3) habe ich auch in der Doku gelesen - kam in meinem Fall aber nicht in Frage, da ich mich ja nicht innerhalb eines Kontextes bewege. Und zu Nr. 1 kann ich nur sagen, daß mir das Programmieren von eigenen markup-commands bislang verschlossen geblieben ist...

Also nochmal: herzlichen Dank!

Gruß,
Heinz.