Autor Thema: glissando zwischen einzelnen Akkordtönen  (Gelesen 1967 mal)

chf

  • Member
glissando zwischen einzelnen Akkordtönen
« am: Mittwoch, 22. August 2012, 18:47 »
Liebe Freunde,

dieses Problem ähnelt einem von mir früher angesprochenen ( "miniglissando").
Im Prinzip funktioniert  die damalige Lösung, aber der Sekundabstand der fraglichen Töne ist problematisch.
Ich hatte den Gedanken,   "c" und "e"  auf die andere Seite zu verschieben, so dass sie quasi innen gegenüberstehen.
Das wäre zwar gegen die Regel, aber deutlich. Nur weiß ich nicht, wie's geht.
Oder wisst ihr eine "saubere" Lösung?

Gruß
chf

Be-3

  • Member
Re: glissando zwischen einzelnen Akkordtönen
« Antwort #1 am: Mittwoch, 22. August 2012, 23:37 »
Das wäre zwar gegen die Regel, aber deutlich. Nur weiß ich nicht, wie's geht.
Oder wisst ihr eine "saubere" Lösung?

Hallo Christa,

naja, man könnte man die Notenköpfe verschieben, indem man im Akkord mittels \tweak die #'X-offset-Werte der betroffenen Noten verändert und dann noch vorher mit \once\override NoteHead #'stem-attachment = #'(1 . -0.5) dafür sorgt, daß der Notenhals weit genug bis zum C hinunterreicht (durch die Schrägstellung der Notenköpfe würde sonst eine kleine Lücke entstehen).
Aber das wäre - wie Du sagst - gegen die Regel. ???

Um den erwünschten Effekt ohne Regelverstoß erzielen zu können, würde ich die tiefste Stimme einzeln mit Hals nach unten notieren, dann wird sie sogar automatisch nach rechts verschoben und schafft somit genügend Platz für die Glissando-Linien. Man braucht sie noch nicht einmal künstlich zu verlängern.
Für den Akkord im oberen Teil habe ich die rechten und linken Y-Werte der bound-details passend gesetzt, damit alle drei Linien erstens zusammenfallen und zweitens dort, wo man es möchte. Durch die Zweiteilung in der << ... \\ ... >>-Umgebung hat man jedenfalls bei Bedarf volle Kontrolle über beide Striche, im bloßen <...>-Akkord hätte man das nicht.

Das "gliss."-Markup habe ich aus Übersichtlichkeitsgründen vorangestellt und den Winkel etwas mehr an die Steigung der Glissando-Linien angenähert.

\version "2.14.2"

\relative c {
        \clef "treble_8"
        \time 6/4
       
        \once\override TextScript #'extra-offset = #'(2.2 . 2.5) s1*0_\markup \rotate #10 { \bold \italic "gliss."}
        << { \once \override Glissando #'(bound-details left Y) = #-2.4
                 \once \override Glissando #'(bound-details right Y) = #-1.9
                 <d bes' e>2 \glissando <e a bes'>1-\tweak #'padding #1 \fermata }  \\
               { c2 \glissando d1 }
        >>
}

Das hat jetzt nicht mehr viel mit Deinem ursrpünglichen Coding zu tun, aber ich habe sowieso nicht verstanden, was die doppenlten \once \override Glissando #'(bound-details left Y)-usw.-Befehle bewirken sollen und das Ergebnis war ja auch eher ein Zickzack-Strich als zwei Glissando-Striche... ;)

Viele Grüße
Torsten

harm6

  • Member
Re: glissando zwischen einzelnen Akkordtönen
« Antwort #2 am: Mittwoch, 22. August 2012, 23:46 »
Hallo,

ich habe mal folgende Funktionen entworfen:

\version "2.14.2"

#(define (radians->degree radians)
  (/ (* radians 180) PI))

#(define ((gliss-plus-text text) grob)
  (let* ((text-stencil (grob-interpret-markup grob text))
         (spanner-stencil (ly:line-spanner::print grob))
         (left-bound-info (ly:grob-property grob 'left-bound-info))
         (y-left (cdar left-bound-info))
         (right-bound-info (ly:grob-property grob 'right-bound-info))
         (y-right (cdar right-bound-info))
         (slant (if (> y-right y-left) 1 -1))
         (spanner-stencil-x-length (interval-length (ly:stencil-extent spanner-stencil X)))
         (spanner-stencil-y-length (interval-length (ly:stencil-extent spanner-stencil Y)))
         (alpha (radians->degree (atan (/ spanner-stencil-y-length spanner-stencil-x-length))))
         (spanner-center-X (interval-center (ly:stencil-extent spanner-stencil X)))
         (label-center-X (interval-center (ly:stencil-extent text-stencil X))))
  (ly:stencil-combine-at-edge
    spanner-stencil
    Y UP
    (ly:stencil-translate
      (ly:stencil-rotate text-stencil (* slant alpha) 0 0)
      (cons (- spanner-center-X label-center-X) 0))
    (* -9 spanner-stencil-y-length))))

glissTweak =
#(define-music-function (parser location minimum-length)(number?)
#{
        \once \override Glissando #'after-line-breaking =
          #(lambda (grob)
            (let ((gliss-count (ly:grob-property grob 'glissando-index)))
             (if (or (eq? 0 gliss-count)
                     (eq? 1 gliss-count))
               (if (eq? 1 gliss-count)
                 (ly:grob-set-property! grob 'extra-offset '(-1 . 0.2))
                 (ly:grob-set-property! grob 'stencil (gliss-plus-text (markup #:italic #:bold "gliss."))))
               (ly:grob-set-property! grob 'style 'none))))
        \once \override Glissando #'(bound-details right padding) = #1.5
        \once \override Glissando #'(bound-details left padding) = #2
        \once \override Glissando #'normalized-endpoints = #'(-0.5 . 1.1)
        \once \override Glissando #'minimum-length = $minimum-length
        \once \override Glissando #'springs-and-rods = #ly:spanner::set-spacing-rods
        $(make-music 'EventChord 'elements (list (make-music 'GlissandoEvent)))
#})

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

\relative c {
        \clef "treble_8"
        \glissTweak #5 <c d bes' e >2
       
        \once \override Script #'padding = #1
        <d e a bes'>1\fermata
}


Erklärung:

Die #5 in \glissTweak #5 ist der Wert der 'minimum-length.
Ein \glissando als post-event-Aufruf ist nicht mehr nötig, sondern bereits integriert.
Der Text wird automatisch zentriert und hat den richtigen Steigungswinkel, auch bei veränderter 'minimum-length.

Mögliche Probleme:
Ich mußte über 'extra-offset gehen. 'extra-offset ist eigentlich die allerletzte Möglichkeit, die man versucht. Ich hoffe es gibt keine Probleme damit.
Ganz generell sind die Definitionen ganz auf das aktuelle Problem zugeschnitten, d.h. die meisten Werte sind hard-coded. Die Übertragung dieses Codes auf andere Situationen ist kaum erfolgversprechend. (Man hätte es durchaus verallgemeinern können, aber das hätte zu einer Unzahl von zusätzlichen Argumenten geführt.)

HTH,
  Harm

P.S.
Während ich diesen Beitrag schrieb bemerkte ich, daß Torsten eine eigene Lösung via 2. Stimme gepostet hat.
Jetzt hast Du die Qual der Wahl. :)

chf

  • Member
Re: glissando zwischen einzelnen Akkordtönen
« Antwort #3 am: Donnerstag, 23. August 2012, 12:37 »
Hallo Harm und Torsten,

herzlichen Dank!
Leider war wohl aus meiner Frage eine Unklarheit entstanden - das Glissando sollte nur von c zu e führen. Die Variante mit der zweiten Stimme hatte ich auch versucht, allerdings wollte ich "stemUp" erzwingen, das ging daneben.
Nun habe ich Torstens Variante angepasst, und die sieht richtig gut aus...
Harms Funktion werde ich gut bewahren, vielleicht kommt mal eine gleiche Situation.

Grüße
Christa

harm6

  • Member
Re: glissando zwischen einzelnen Akkordtönen
« Antwort #4 am: Freitag, 24. August 2012, 01:59 »
Hallo Christa,

wenn Du das glissando nur zwischen c und e haben willst, ist Torsten's Methode die beste.

Ich habe mich aber noch weiter mit dem Thema beschäftigt, mit dem Ziel eine Funktion zu entwerfen, die es ermöglicht die Glissandi einzeln anzusprechen.

Hier das Ergebnis:

\version "2.15.39"

#(define (radians->degree radians)
  (/ (* radians 180) PI))

#(define ((gliss-plus-text padding text) grob)
  (let* ((text-stencil (grob-interpret-markup grob text))
         (spanner-stencil (ly:line-spanner::print grob))
         (left-bound-info (ly:grob-property grob 'left-bound-info))
         (y-left (cdar left-bound-info))
         (right-bound-info (ly:grob-property grob 'right-bound-info))
         (y-right (cdar right-bound-info))
         (slant (if (> y-right y-left) 1 -1))
         (spanner-stencil-x-length (interval-length (ly:stencil-extent spanner-stencil X)))
         (spanner-stencil-y-length (interval-length (ly:stencil-extent spanner-stencil Y)))
         (alpha (radians->degree (atan (/ spanner-stencil-y-length spanner-stencil-x-length))))
         (spanner-center-X (interval-center (ly:stencil-extent spanner-stencil X)))
         (label-center-X (interval-center (ly:stencil-extent text-stencil X))))
  (ly:stencil-combine-at-edge
    spanner-stencil
    Y UP
    (ly:stencil-translate
      (ly:stencil-rotate text-stencil (* slant alpha) 0 0)
      (cons (- spanner-center-X label-center-X) 0))
    (+ (* -0.5 spanner-stencil-y-length) padding))))

glissTweak =
#(define-music-function (parser location lst)(pair?)
#{
       \once \override Glissando #'after-line-breaking =
          #(lambda (grob)
            (let ((gliss-count (ly:grob-property grob 'glissando-index)))
            (map (lambda (x)
              (let ((gliss-nmbr (car x))
                    (property-value-alist (cdr x)))
                (if (eq? gliss-nmbr gliss-count)
                  (map (lambda (y) (ly:grob-set-property! grob (car y) (cdr y))) property-value-alist)
                  #f)))
;;           $lst))) ;; für Version "2.14.2"
              lst)))
       $(make-music 'EventChord 'elements (list (make-music 'GlissandoEvent)))
#})

tweakedGliss = { 
        \once \override Glissando #'minimum-length = #8
        \once \override Glissando #'springs-and-rods = #ly:spanner::set-spacing-rods
}

\relative c' {
        \override TextScript #'font-size = #-2

        <c e g bes d>2\glissando^"\"no tweaks\""
        <d, a' fis' c' e'>
       
        \tweakedGliss
        \glissTweak
          #`((0 . ((color . ,red)
                   (normalized-endpoints . (0 . 0.8))
                   (stencil . ,(gliss-plus-text -1.8 (markup #:italic #:fontsize -8 "gliss.")))))
             (1 . ((style . zigzag)))
             (2 . ((style . trill)
                   (color . (0.5 0.5 0.5))))
             (3 . ((style . dashed-line)))
             (4 . ((stencil . ,(gliss-plus-text 0 (markup #:italic #:fontsize -8 "gliss.")))
                   (normalized-endpoints . (0 . 0.7))
                   (color . ,green))))
        <c' e g bes d>2^"\"some tweaks\""
        <d, a' fis' c' e'>
       
        \once \override Glissando #'(bound-details right arrow) = ##t
        \glissTweak
          #`((0 . ((style . dashed-line)
                   (normalized-endpoints . (0 . -2.1))))
             (1 . ((stencil . #f)))
             (2 . ((stencil . #f)))
             (3 . ((stencil . #f)))
             (4 . ((style . dashed-line)
                   (normalized-endpoints . (0 . -1.5)))))
        <c' e g bes d>2^"\"some other tweaks\""
        <d, a' fis' c' e'>

}

Ich habe "2.15.39" benutzt aber für "2.14.2" braucht man nur eine Zeile zu ändern (siehe Kommentar im Code). Der output von "2.14.2" ist der neueren Version aber unterlegen.

Es will mir jedoch nicht gelingen die Länge eines einzelnen glissando-Striches zu verändern (wenn man mal davon absieht, daß eine Neukonstruktion des stencil schon erfolgversprechend ist - das ist aber viel zu umständlich)

Gruß,
  Harm


chf

  • Member
Re: glissando zwischen einzelnen Akkordtönen
« Antwort #5 am: Samstag, 25. August 2012, 13:30 »
Danke, Harm  - auch im Sinne meiner zukünftigen Arbeiten!
Christa