Autor Thema: Klammern für Hemiole  (Gelesen 1423 mal)

iugin

  • Member
Klammern für Hemiole
« am: Samstag, 6. Dezember 2014, 16:42 »
Hallo miteinander

ich wollte, dank diesen Post, eine Funktion definieren, mit der ich Hemiolen zeigen kann.
Die Syntax wäre:
\hemiola #1 {c d}{e f}{g a}Jetzt: Mit viel Copy-Paste und viel Schweiss habe ich etwas gebastelt das funktioniert (hat):
(kompiliert nicht)
\version "2.18.2"

\layout {
  \context {
    \Voice
    \consists "Horizontal_bracket_engraver"
  }
}

#(define (add-grouping dir note-event)
   "Add an NoteGroupingEvent to the articulations of `note-event',
  which is supposed to be a NoteEvent expression."
   (set! (ly:music-property note-event 'articulations)
         (cons (make-music 'NoteGroupingEvent
                 'span-direction dir)
           (ly:music-property note-event 'articulations)))
   note-event)

#(define (helper ls1 ls2)
   "Add a NoteGroupingEvent with the direction -1 to the first
    and one with the direction 1 to the last NoteEvent of
    a SequentialMusic expression"
   (if (eq? 1 (length ls1))
       ; wenn ls1 nur noch aus einem element besteht
       ; Schluss mit der Selbstaufrufung, das Ende von der Klammer
       ; an die letzte Note hängen und das ganze umdrehen
       (reverse (cons (add-grouping 1 (car ls1)) ls2))
       (if (null? ls2)
           ; ls2 ist noch leer, das heißt (car ls1) ist das
           ; erste Element in der Liste. Start der klammer an die
           ; Note hängen und weiter
           (helper
            (cdr ls1)
            (cons (add-grouping -1 (car ls1)) ls2))
           ; (car ls1) ist weder das letzte noch das erste
           ; Element in der Liste. Nichts verändern und ein
           ; Element weiter gehen
           (helper
            (cdr ls1)
            (cons (car ls1) ls2)))))

bracketize = #(define-music-function (parser location music) (ly:music?)
                (make-music
                 'SequentialMusic
                 'elements
                 (helper (ly:music-property music 'elements) '())))


#(define (add-bracket direction m)
   (case (ly:music-property m 'name)
     ((NoteEvent) (set! (ly:music-property m 'articulations)
                        (cons (make-music 'TextScriptEvent
                                'direction
                                direction
                                'text
                                (markup
                                 #:line
                                 (#:path 0.1
                                   (list (list (quote moveto) -1 0)
                                     (list (quote lineto) -0.5 1)
                                     (list (quote lineto) 1.5 1)
                                     (list (quote lineto) 2 0)))))
                          (ly:music-property m 'articulations)))
       m)
     ((EventChord)(set! (ly:music-property m 'elements)
                        (cons (make-music 'TextScriptEvent
                                'direction
                                direction
                                'text
                                (markup
                                 #:line
                                 (#:path 0.1
                                   (list (list (quote moveto) -1 0)
                                     (list (quote lineto) -0.5 1)
                                     (list (quote lineto) 1.5 1)
                                     (list (quote lineto) 2 0)))))
                          (ly:music-property m 'articulations)))
       m)
     (else #f)))

hemiola =
#(define-music-function (parser location direction m1 m2 m3) (number? ly:music? ly:music? ly:music?)
   #{
     \override HorizontalBracket.direction = $direction

     #(if (eq? 1 (length (ly:music-property m1 'elements)))
          (map-some-music add-bracket direction m1)
          #{ \bracketize $m1 #}
          )

     #(if (eq? 1 (length (ly:music-property m2 'elements)))
          (map-some-music add-bracket direction m2)
          #{ \bracketize $m2 #}
          )

     #(if (eq? 1 (length (ly:music-property m3 'elements)))
          (map-some-music add-bracket direction m3)
          #{ \bracketize $m3 #}
          )

     \revert HorizontalBracket.direction
   #}
   )

{
  \new Staff {
    \hemiola #1 {c}  {d c} {c d}
  }
}

Der Code ist vielleicht Horror, hat aber funktioniert bis ich in der Prozedur add-bracket die Direktion der Klammern beeinflussen wollte. Und so kompiliert den Code nicht mehr, ich verstehe aber nicht wieso.
Mit
#(define (add-bracket m)
  [...]
     #(if (eq? 1 (length (ly:music-property m1 'elements)))
          (map-some-music add-bracket m1)
        [...]
geht hingegen.
Nur eine Bemerkung: ich musste auch diese add-bracket schreiben, weil die Klammer funktionieren nur mit mehrere Noten.

Ich hoffe, man versteht, was ich meine.

Ich danke euch für die Hilfe, und wünsche euch einen schönen Abend

Liebe Grüsse

Eugenio

fugenkomponist

  • Member
Re: Klammern für Hemiole
« Antwort #1 am: Samstag, 6. Dezember 2014, 16:52 »
Hast du dir mal Ligatur-Klammern angesehen? http://lilypond.org/doc/v2.18/Documentation/notation-big-page.de.html#ligatures Die  werden doch auch für Hemiolen verwendet, oder?

Hab dein Problem wegen Zeitmangel jetzt nicht ganz nachvollzogen, ob das das ist, was du willst, es würde die Sache aber möglicherweise erheblich vereinfachen ;)

iugin

  • Member
Re: Klammern für Hemiole
« Antwort #2 am: Samstag, 6. Dezember 2014, 19:51 »
Hallo Fugenkomponist

das ist ein sehr guter Hinweis! Ich kannte das nicht.
Ich kann es natürlich so machen, möchte trotzdem eine Antwort auf meine Frage, weil es vor allem um Scheme geht.
Dein Vorschlag funktioniert aber auch gut. Nur, bei nur einer Note, sieht komisch aus:
{ \[ c \] }Ich kann aber mit \markup arbeiten, habe aber das gleiche Problem, das ich vorher geschildert habe.
Und: kann ich die Ligaturen unten den Noten zeichnen?

Liebe Grüsse

Eugenio

iugin

  • Member
Re: Klammern für Hemiole
« Antwort #3 am: Sonntag, 7. Dezember 2014, 20:03 »
Hallo fugenkomponist

deine Idee war super. Ein bisschen googlen und habe das geunden.
Dann angepasst:
\version "2.18.2"
hemiola =
#(define-music-function (parser location direction m1 m2 m3) (number? ly:music? ly:music? ly:music?)
   #{
      \override LigatureBracket #'stencil = #ly:line-spanner::print
  \override LigatureBracket #'bound-details =
    #`((left (Y . 0)
             (padding . -0.2)
             (text . ,(make-draw-line-markup '(0 . -0.7)))
             (attach-dir . ,LEFT))
       (left-broken (end-on-note . #t)
                    (padding . -2)
                    (text . #f))
       (right (Y . 0)
              (padding . -0.2)
              (text . ,(make-draw-line-markup '(0 . -0.7)))
              (attach-dir . ,RIGHT))
       (right-broken (text . #f)))
  \override LigatureBracket #'left-bound-info =
    #ly:line-spanner::calc-left-bound-info
  \override LigatureBracket #'right-bound-info =
    #ly:line-spanner::calc-right-bound-info
  \override LigatureBracket #'Y-offset =
    #ly:side-position-interface::y-aligned-side
  \override LigatureBracket #'side-axis = #Y
 \[ $m1 \] \[ $m2 \] \[ $m3 \]
   #}
   )

{
  \new Staff {
    \hemiola #1 {c'}  {c' c'} {c' c' c' c'}   
  }
}

Es funktioniert! Jetzt muss ich nur schauen, wie ich die Ligaturen unten bringe. Ich muss sicher all die \override anpassen, es kommt...
Dann möchte ich verstehen, wieso mein Beispiel nicht funktioniert hat.
Wenn aber die Syntax der Ligatur ändert (habe gelesen, irgendwann wird
Zitat
c\[ c\]
statt
Zitat
\[ c c \]
) muss ich es ändern. Aber jetzt läuft prima.

Danke für den Hinweis und schönen Abend

Eugenio