Autor Thema: Funktion für \with?  (Gelesen 1906 mal)

derburn

  • Member
Funktion für \with?
« am: Mittwoch, 13. April 2011, 09:50 »
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