Autor Thema: Glissando über Haltebogen hinweg  (Gelesen 3027 mal)

Philipp Sobecki

  • Member
Glissando über Haltebogen hinweg
« am: Dienstag, 6. Dezember 2011, 15:32 »
Hallo,

ich würde gerne ein Glissando über Haltebögen hinwegnotieren. Im Anhang befindet sich ein Bild, auf dem ich zwei Einsatzgebiete zeigen will.

Es wäre super, wenn mir jemand helfen könnte, das in Lilypond umzusetzen, oder aber grundsätzlich eine andere Notationsmöglichkeit des gliss. geben könnte.

Viele Grüße,
Philipp

kilgore

  • Member
Re: Glissando über Haltebogen hinweg
« Antwort #1 am: Dienstag, 6. Dezember 2011, 16:24 »
Lieber Philipp.

Hier eine zwei Stimmige Methode.  Den Kopflosen Hals tu ich in einer zweite Stimme um eine durchgehende Glissando in der ersten Stimme zu erstellen. 

Gruß
kil

\version "2.14.2"


\relative c' {
  << { \stemNeutral
       \override Rest #'staff-position = #0
      r2. b'4\glissando s4 g4 r2  }
    \\
    { s1
      \once \override NoteHead #'transparent = ##t
      \stemUp
      a4 s2.
    }
  >>
}

\relative c' {
  << { \stemNeutral
       \override Rest #'staff-position = #0
       \times 2/3 { a'4\glissando c8\glissando } 
       \once \override TupletNumber #'transparent = ##t
       \times 2/3 { s8 a4 }
     }
    \\
    { s4
      \once \override NoteHead #'transparent = ##t
      \stemUp
      \times 2/3 { b8 \hideNotes a4 \unHideNotes }
     
    }
  >>
}

harm6

  • Member
Re: Glissando über Haltebogen hinweg
« Antwort #2 am: Mittwoch, 7. Dezember 2011, 01:03 »
Hallo Philipp,

es hat auf Anregung von Mike Solomon auf der devel-list mal eine Diskussion gegeben, eine Möglichkeit zu implementieren, die genau das macht was Dir (so glaube ich) vorschwebt.

Unter
http://lists.gnu.org/archive/html/lilypond-devel/2011-06/pdfdjegCnwZ1Y.pdf
kann man sehen was gedacht war.

(Lange) Diskussion hierzu :
http://lists.gnu.org/archive/html/lilypond-devel/2011-06/msg00810.html
und
http://lists.gnu.org/archive/html/lilypond-devel/2011-07/msg00231.html
oder auch:
http://codereview.appspot.com/4661061/#ps1

Ich weiß allerdings nicht, was draus geworden ist, denn der letzte Beitrag hier liegt vier Monate zurück und in "2.15.20" ist nichts entsprechendes zu finden.

Han-Wen Nienhuys dortiger Vorschlag:
Zitat
Can you try a minimal implementation first? For example,

* Have a stem property that determines the end of the stem. Currently, we have

    y2 = Staff_symbol_referencer::get_position (lh);

for that. This feature is generic and cleanly implemented with a
callback. Should be a separate patch.

* Have a mechanism for glissando engraver to ignore note-heads. Maybe
a boolean property: #'glissando-note

Then, in your .ly file you do the following

* Have an engraver (by preference written in Scheme) that hooks up the
glissandi with the stems.

* Create normal beamed 16th notes with #'glissando-note on their note-heads.

* Hook a callback on that, that looks at the glissando's slope and the
stem's X position to determine where the stem starts printing

* Make the noteheads very small and invisible.

hope this helps.

übersteigt allerdings meine Kenntnisse.

Insoweit solltest Du kilgores Vorschlag mit der zweiten Stimme versuchen oder meinen folgenden:

\version "2.14.2"
\pointAndClickOff

gliss = #(define-music-function (parser location control)(pair?)     
  (let((y-off (car control))
       (slope (cdr control)))
  #{
   \once\override TextSpanner #'style = #'line
   \once\override TextSpanner #'extra-offset = #(cons 0 $y-off)
   \once\override TextSpanner #'thickness = #1.5
   
   \override TextSpanner #'bound-details =
      #`((left . ((Y . 0)
                  (padding . 1.5)
                  ))
         (right . ((Y . ,$slope)
                   (padding . 2.5)
                   (attach-dir . ,RIGHT)
                   )))
  #}))


#(define startGliss startTextSpan)
#(define stopGliss stopTextSpan)

stemGliss = #(define-music-function (parser location control)(number?)
#{
        \once \override NoteHead #'Y-extent = #(cons 0 $control)
        \once \override NoteHead #'transparent = ##t
        \once \override Stem #'Y-extent = #'(0 . 0)
#})


\relative c' {

    \gliss #'(-3.8 . -1)
    \partial 4*1 b'\startGliss
    \stemGliss #0.3
    \once \override NoteHead #'X-extent = #'(-0.8 . 0.1)
    g
    g\stopGliss r2

        }

\relative c' {
        \override Score.Glissando #'thickness = #1.5
    \times 2/3 {
            a'4\glissando
            \gliss #'(-5.67 . -1)
            c8 \startGliss
    }
    \times 2/3 {
            \stemGliss #0.3
            a8 
            \once \override Stem #'X-extent = #'(-2 . 0)
            a4\stopGliss
    }
}
\relative c' {
        % helper:
        % \override  Stem #'color = #red \override  Stem #'layer = #6
       
        \gliss #'(-5.6 . 4.7)
        c1\startGliss
        \stemGliss #0
        e16
        \stemGliss #0.3
        e
        \stemGliss #0.6
        e
        \stemGliss #0.9
        e
                   
        \stemGliss #-0.2
        g
        \stemGliss #0.1
        g
        \stemGliss #0.5
        g
        \stemGliss #0.7
        g
        \once \override Stem #'X-extent = #'(-1.5 . 0)
        \stemGliss #0.4
        b
        \stemGliss #0.1
        b
        \stemGliss #-0.2
        b
        \stemGliss #-0.5
        b
        \stemGliss #0.6
        d
        \stemGliss #0.3
        d
        \stemGliss #0
        d
        \stemGliss #-0.3
        d
        e1\stopGliss
}

\gliss ist eine Funktion die den TextSpanner benutzt. Als Argument wird ein pair erwartet. Der erste Wert sollte benutzt werden, um den Spanner an den Ausgangsnotenkopf anzupassen. Der zweite für den Zielnotenkopf.
\gliss muß vor die Note gesetzt werden, von dem aus das glissando starten soll, direkt hinter diese Note muß \startGliss um das Glissando auch zu starten. Zum Ende des glissandos muß \stopGliss hinter die Zielnote gesetzt werden. (\startGliss und \stopGliss sind die umdefinierten Befehle \startTextSpan und \stopTextSpan).
\stemGliss ist eine Funktion die es ermöglicht die Notenhälse an die glissando-Linie bündig anzupassen (also eher eine kosmetische Sache, genauso wie die anderen override-Befehle mit 'X-extent)

Es ist sehr schade, daß die Diskussion auf der devel-list nicht zu einem greifbaren Ergebnis geführt hat, denn der obige Code ist sehr fragil und automatisiert ist auch überhaupt nichts.

Aber naja, es funktioniert (irgendwie ...)

Gruß,
  Harm

P.S. Deine eigentliche Frage:
Zitat
ich würde gerne ein Glissando über Haltebögen hinwegnotieren
versteh ich allerdings nicht (ich hab mich an Dein Bild gehalten):
Was meinst Du hier mit Haltebögen? In Deinem Bild tauchen keine auf!?
« Letzte Änderung: Mittwoch, 7. Dezember 2011, 01:09 von harm6 »

Philipp Sobecki

  • Member
Re: Glissando über Haltebogen hinweg
« Antwort #3 am: Donnerstag, 8. Dezember 2011, 12:51 »
Hallo,

vielen Dank für die Hilfe! Das ist echt super, wie viel Engagement einem hier entgegenkommt.

Ich habe das erste Beispiel auf meine Partitur übertragen, und es klappt schonmal ganz gut. Die Hilfslinie unten und eine der Klammern oben müssten noch weg. Vielleicht kann mir ja jemand sagen, was hier faul ist.

PS: Mit Haltebögen meine ich, dass man bei meinem Triolenbeispiel die zwei Achtel mit einem Haltebogen verbinden könnte. Leider ist die Gefahr dabei hoch, dass man es missversteht.

\relative c'{
<< { \clef bass
\override Rest #'staff-position = #0
\times 4/5{c,,2\p\glissando( e\glissando cis4\glissando} |
\once \override  TupletNumber #'transparent = ##t
\times 4/5{s f2\glissando d\glissando} |
\times 4/5{fis8)-+ r d'8\>[ ais~] <f' ais,~>[ <a ais,~>] <cis ais,~>[ <fis,, ais>~]~ <fis ais>4~} |
} \\
{
s1
\once \override NoteHead #'transparent = ##t
\stemUp\times 4/5{ d4 \hideNotes f2 d2\unHideNotes}

} >>
}


Viele Grüße,
Philipp

harm6

  • Member
Re: Glissando über Haltebogen hinweg
« Antwort #4 am: Donnerstag, 8. Dezember 2011, 23:13 »
Hallo Philipp,

Zitat
Die Hilfslinie unten und eine der Klammern oben müssten noch weg. Vielleicht kann mir ja jemand sagen, was hier faul ist.

Die Hilfslinie geht über \once \override NoteHead #'no-ledgers = ##t
Bei den n-tolen-Klammern muß man die Klammer und die Nummer außschließen. ich habe das so gemacht:

tupletOff = {
  \once \override TupletNumber #'stencil = ##f
  \once \override TupletBracket #'stencil = ##f
}
vordefiniert und an entsprechender Stelle eingefügt.

Ansonsten habe ich noch eine Reihe von Befehlen eingefügt, einerseits um das Ganze etwas schöner zu machen, andererseits um die log-Warnungen abzustellen (\stemDown eingefügt, \override NoteColumn #'ignore-collision = ##t wäre auch möglich gewesen)

Der ganze Code sieht dann so aus:

\version "2.14.2"

tupletOff = {
  \once \override TupletNumber #'stencil = ##f
  \once \override TupletBracket #'stencil = ##f
}

\relative c'{
<< { \clef bass
\override Rest #'staff-position = #0
\slurDown
\times 4/5{c,,2\p\glissando( e\glissando cis4\glissando} |
\tupletOff
\times 4/5{s f2\glissando d\glissando} |
\times 4/5{fis8)-+ r d'8[ ais~] <f' ais,~>[ <a ais,~>] <cis ais,~>[ <fis,, ais>~]~ <fis ais>4~} |
} \\
{
s1
\once \override NoteHead #'transparent = ##t
\once \override NoteHead #'no-ledgers = ##t
\tupletUp
\stemUp\times 4/5{ d4 \hideNotes
\stemDown f2 d2\unHideNotes}

} >>
}

Ich hatte die Frage auch auf die englische Liste gestellt, in der Hoffnung, daß es vielleicht neue Entwicklungen gibt. Und in der Tat gibt es ein neues property: 'glissando-skip welches erlaubt, daß ein glissando eine NoteColumn passieren kann. Das ganze funktioniert allerdings nur mit einer der neueren Entwicklerversionen, führt aber dazu, daß der eigentliche Code stark vereinfacht werden kann (eine zweite Stimme ist auch nicht nötig). In folgendem Beispiel habe ich dieses neue property benutzt, indem ich es mit in eine Funktion gepackt habe: \stemGliss (ähnlich wie in meiner obigen Antwort mit kleinen Anpassungen der höheren Version wegen):

\version "2.15.20"

stemGliss = #(define-music-function (parser location control)(number?)
#{
        \once\override NoteColumn #'glissando-skip = ##t
        \once \override NoteHead #'transparent = ##t
        \once \override NoteHead #'no-ledgers = ##t
        \once \override NoteHead #'Y-extent = #(cons 0 control)
#})

\relative c'{
        \clef bass
        \override Rest #'staff-position = #0
        \times 4/5{ c,,2\p\glissando( e\glissando cis4\glissando} |
        \times 4/5{ \stemGliss #0.7 d f2\glissando d\glissando } |
        \times 4/5{fis8)-+ r d'8[ ais~] <f' ais,~>[ <a ais,~>] <cis ais,~>[ <fis,, ais>~]~ <fis ais>4~} |
}

Gruß,
  Harm

Philipp Sobecki

  • Member
Re: Glissando über Haltebogen hinweg
« Antwort #5 am: Sonntag, 11. Dezember 2011, 16:43 »
Das ist ja super! Es funktioniert wunderbar. Vielen Dank dafür!

Jetzt gibt's nur noch das Problem, dass manche Noten inkl. Vorzeichen so nah beieinanderliegen, dass keine Glissandolinie sichtbar ist. Im u.g. Beispiel wären das die Noten h', dis'' und cis''. Lässt sich da etwas machen?

[edit] Mist, es gibt noch ein zweites Problem: "Programmierfehler: overwriting glissando". Das kommt bei mir zweimal. Die betroffene Stelle ist unklar.
« Letzte Änderung: Sonntag, 11. Dezember 2011, 16:59 von Philipp Sobecki »

harm6

  • Member
Re: Glissando über Haltebogen hinweg
« Antwort #6 am: Montag, 12. Dezember 2011, 00:02 »
Hallo Philipp,

Du solltest immer den Code mit der Versions-Nummer posten. Wie Du schon anhand meiner letzten Antwort verstanden haben solltest, hängt das Vorgehen mitunter stark von der Version ab, die benutzt wird. Ein Bild zusätzlich zu posten ist sehr gut um zu illustrieren was man haben will, aber entscheidend ist der Code. Im übrigen finde ich es lästig den Code erst schreiben zu müssen, den Du verbessert haben möchtest.

Nachdem das nun gesagt ist zu Deiner Frage:

1. Lösungsmöglichkeit:
Nach der Notation Reference (ich habe nach glissando gesucht) und der Internals Reference->Glissando

\version "2.14.2"
\relative c' {
        \override Glissando #'minimum-length = #5
        \override Glissando #'springs-and-rods = #ly:spanner::set-spacing-rods 
        \times 8/9 {
        ees'8\glissando [
        \once \override Glissando #'bound-details #'right #'padding = #2.5
        f\glissando
        des] \glissando
        ees\glissando [
        \once \override Glissando #'bound-details #'right #'padding = #2.5
        b\glissando 
        \once \override Glissando #'bound-details #'right #'padding = #2.5
        dis] \glissando
        cis\glissando
        a16 r8.
        }
}

Auf zumindest die ersten zwei Befehle hättest Du also selbst kommen können! Hier im Forum ist das auch schon thematisiert worden.

2. Lösungsmöglichkeit

Man kann das Ganze auch in eine Funktion packen:

\version "2.14.2"
glissLength =
#(define-music-function (parser location length-padright)(pair?)
#{
        \once \override Glissando #'minimum-length = #$(car length-padright)
        \once \override Glissando #'springs-and-rods = #ly:spanner::set-spacing-rods 
        \once \override Glissando #'bound-details #'right #'padding = #$(cdr length-padright)
        $(make-music 'EventChord 'elements (list (make-music 'GlissandoEvent)))
#})

\relative c' {
        \times 8/9 {
        \glissLength #'(5 . 1.5) ees'8 [
        \glissLength #'(5 . 2.5) f
        \glissLength #'(5 . 1.5) des ]
        \glissLength #'(5 . 1.5) ees [
        \glissLength #'(6 . 2.5) b
        \glissLength #'(6 . 2.5) dis  ]
        \glissLength #'(5 . 1.5) cis
        \glissLength #'(5 . 1.5) a16 r8.
        }
}

Um es zu demonstrieren habe ich jetzt jedes Glissando so gemacht. Tatsächlich wird man die Funktion sinnvollerweise nur dort einsetzen wo es Probleme mit der Länge und/oder den Vorzeichen gibt.

3. Lösungsmöglichkeit (nur für "2.15.20" )

Hier ist die Sache noch einfacher:

\version "2.15.20"
\relative c' {
       \override Glissando #'minimum-length = #5
       \override Glissando #'springs-and-rods = #ly:spanner::set-spacing-rods
       \override Glissando #'bound-details #'right #'end-on-accidental = ##t

        \times 8/9 {
        ees'8\glissando
        [f\glissando
        des\glissando ]
        ees\glissando
        [b\glissando
        dis\glissando  ]
        cis\glissando
        a16 r8.
        }
}

Zitat
Mist, es gibt noch ein zweites Problem: "Programmierfehler: overwriting glissando". Das kommt bei mir zweimal. Die betroffene Stelle ist unklar.

Ohne Code kann ich da nichts zu sagen.

HTH,
  Harm

Philipp Sobecki

  • Member
Re: Glissando über Haltebogen hinweg
« Antwort #7 am: Donnerstag, 15. Dezember 2011, 12:42 »
Du hast natürlich Recht, sorry wegen der ungenauen Angaben.

Ich hab's jetzt hinbekommen. Ich hatte fälschlicherweise einige Zeilen dieser Art stehen: \stemGliss a4\glissando. Das \glissando musste weg.


Vielen Dank nochmal für die Hilfe!