• 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ü

Funktion für \with?

Begonnen von derburn, Mittwoch, 13. April 2011, 09:50

Vorheriges Thema - Nächstes Thema

derburn

Hallo Lilys,

seit Lilypond 2.13 gibt es ja die Möglichkeit, Variablen für \with zu definieren, sodass man gleiche Staff-Properties nicht dauernd schreiben muss.
Wie sieht es aber für sich ändernde Properties aus?

Für die Übersichtlichkeit bei Drums- & Percussion-Notationen ist es z.B. oft interessant, die Stems alle nach oben zeigen zu lassen und eine feste Höhe zu definieren. Diese Höhe kann dummerweise variieren, wenn z.B. nur Instrumente mit besonders hohen staff positions (z.B. Hihats) oder besonders tiefen staff positions (z.B. Bassdrums) benutzt werden.

In folgendem Beispiel löse ich das Problem damit, mehrere Variablen mit unterschiedlichen Höhen zu definieren, was aus programmiertechnischer Sicht doch recht albern ist... ;)

Versuchsweise definiere ich auch eine music-function, die das Problem lösen soll.
Aktiviert man aber den momentan auskommentierten DrumStaff, der die Funktion aufruft, bekommt man einen Syntaxfehler 'unexpected \with'.

Und hier das Beispiel:

\version "2.13.51"

beamPropsHigh = \with {
        \remove Clef_engraver
        \override Stem #'direction = #UP
        \override Beam #'positions = #'(4.5 . 4.5)
        \override StaffSymbol #'staff-space = #'1.15
}

beamPropsMiddle = \with {
        \remove Clef_engraver
        \override Stem #'direction = #UP
        \override Beam #'positions = #'(3.5 . 3.5)
        \override StaffSymbol #'staff-space = #'1.15
}

beamPropsLow = \with {
        \remove Clef_engraver
        \override Stem #'direction = #UP
        \override Beam #'positions = #'(2.5 . 2.5)
        \override StaffSymbol #'staff-space = #'1.15
}

test = #(define-music-function (parser location beamPos) (pair?)
  #{ 
    \with {
      \remove Clef_engraver
      \override Stem #'direction = #UP
      \override Beam #'positions = #'$beamPos
      \override StaffSymbol #'staff-space = #'1.15
    } % with
  #})

eins = \drummode { bd8 hh16  hh16  sn8   bd8   bd8 hh16  hh16    sn8   ssh8 }
zwei = \drummode { bd8 ssh16 ssh16 sn8   bd8   bd8 ssh16 ssh16   sn8   ssh8 }
drei = \drummode { bd4             cglo8 cglo8 bd8 cglo16 cglo16 cglo4      }

\score { <<
  \new DrumStaff \with { \beamPropsHigh } <<   
      \set Staff.instrumentName = \markup { "1 "}
      \new DrumVoice { \eins }
    >>  % DrumStaff

  \new DrumStaff \with { \beamPropsMiddle } <<   
      \set Staff.instrumentName = \markup { "2 "}
      \new DrumVoice { \zwei }
    >>  % DrumStaff

  \new DrumStaff \with { \beamPropsLow } <<   
      \set Staff.instrumentName = \markup { "3 "}
      \new DrumVoice { \drei }
    >>  % DrumStaff

%  \new DrumStaff \with { \test #'(4.5 . 4.5) } <<   
%      \set Staff.instrumentName = \markup { "1b "}
%      \new DrumVoice { \eins }
%    >>  % DrumStaff

>> % score
  \layout {
    indent = 1\cm
    \context {
      \Score
      \remove "System_start_delimiter_engraver"
      } % context
    }
} % score


Hat jemand eine Idee, wie man das Problem lösen kann?

Viele liebe Grüße,
Manuel