Autor Thema: Haltebogen nur in Klammer zwei  (Gelesen 4246 mal)

chf

  • Member
Haltebogen nur in Klammer zwei
« am: Freitag, 17. Mai 2013, 17:47 »
Liebe Freunde,

wie kann ich lily zwingen, den Haltebogen vor der Klammer anzusetzen?
Gibt es eine "legale" Möglichkeit, oder muss ich mit laissezVibrer schummeln?

Schöne Pfingsten!
chf

eluze

  • Member
Re: Haltebogen nur in Klammer zwei
« Antwort #1 am: Freitag, 17. Mai 2013, 18:40 »
hallo!

hast du \set tieWaitForNote = ##tschon probiert?

Eluze

chf

  • Member
Re: Haltebogen nur in Klammer zwei
« Antwort #2 am: Freitag, 17. Mai 2013, 19:56 »
Hallo Eluze,

ja, habe ich.
Das gibt einen Bogen über die Klammer eins hinweg...
Da frage ich mich gerade, ob ich eine falsche Vorstellung von der Sache habe...?
Im Manuskript ist der Bogen angedeutet, eben wie \laissezVibrer.

Gruß
chf

eluze

  • Member
Re: Haltebogen nur in Klammer zwei
« Antwort #3 am: Freitag, 17. Mai 2013, 21:44 »
versteh ich richtig: du möchtest das e im \repeat volta-teil bis in die 2. klammer halten, aber in der 1. klammer wegbleichen?

schau mal ob das snippet http://lsr.dsi.unimi.it/LSR/Item?id=613 weiterhilft!

Eluze

chf

  • Member
Re: Haltebogen nur in Klammer zwei
« Antwort #4 am: Samstag, 18. Mai 2013, 19:44 »
Du versteht richtig.

Mit dem Snippet komme ich zu keinem Ergebnis ; vielleicht bin ich auch nur zu blöd, es auf meinen code anzuwenden?
Allerdings habe ich meine Noten in das Exempel eingefügt...

chf

eluze

  • Member
Re: Haltebogen nur in Klammer zwei
« Antwort #5 am: Sonntag, 19. Mai 2013, 10:44 »
also - nun habe ich das snippet etwas genauer angeschaut: man könnte es nun händisch etwas anpassen, kommt aber kaum darum herum, die ausdehnung des zu vermeidenden objekts selbst zu definieren.

deshalb meine empfehlung,  die dash-definition zu verwenden:
\relative c' {
  \set tieWaitForNote = ##t
  \repeat volta 2 {
    c4
    \once \override Tie.dash-definition = #'(
      (0 0.45 1 1)
      (0.45 0.8 0 0)
      (0.8 1.0 1 1)
      )
    e~
  }
  \alternative {
    {g d | c1}
    { \set Timing.measureLength = #(ly:make-moment 2 4)  e4 d c1}
  }
}

wenn jemand zeit und lust hätte, die länge der soliden/ausgeblendeten abschnitte zu berechnen (das könnte vielleicht von der 1. volta-klammer übernommen werden?) …

gruss
Eluze

chf

  • Member
Re: Haltebogen nur in Klammer zwei
« Antwort #6 am: Sonntag, 19. Mai 2013, 12:08 »
Danke!

Das ist immerhin plausibel. Mal sehen, was der Verleger dazu sagt...
Diese Idee war mir wieder aus dem Sinn geschwunden.

Im Handbuch gibt es eine Definition mit Unterbrechung (gerade entdeckt!), die mir entgegen den Abbildungen das gewünschte Ergebnis zeigt.
EIn Zufall, für den ich keine Ereklärung weiß.
 Wenn ich die passend kriegte...

Hier gibt es eine Fehlermeldung, die mich überfordert (ist vielleicht der Fehler ein Nutzen?): 
"Programmierfehler: lower bezier extract value not less than upper value: curve may have bad shape"

chf
« Letzte Änderung: Sonntag, 19. Mai 2013, 12:38 von chf »

Be-3

  • Member
Re: Haltebogen nur in Klammer zwei
« Antwort #7 am: Sonntag, 19. Mai 2013, 13:16 »
Hallo zusammen,

ich finde Eluzes Ansatz mit den dash-definitions sehr elegant, weil er mit relativ wenig Aufwand dort ansetzt, wo das Problem entsteht, nämlich beim Bogen, und die dafür vorgesehenen Einstellmöglichkeiten nutzt.

Trotzdem ein kleiner Änderungsvorschlag in anderer Sache, nämlich dem halben Takt in der zweiten Klammer, dem Christa schon per \partial zuleibe rücken wollte. Das provoziert allerdings LilyPond-Warnungen.
Ich würde statt Eluzes
  \set Timing.measureLength = #(ly:make-moment 2 4)
lieber
  \set Timing.measurePosition = #(ly:make-moment 2 4)
benutzen, denn antsatt den Takt auf 2/4 umzustellen, scheint es mir vorteilhafter, einfach die Position innerhalb des Taktes zu verstellen. Das kommt dem realen Ereingis näher (schließlich geht es erst ab der Hälfte los, die erste Hälfte steht vor den Voltenklammern. Vor allem aber stimmt die Taktnumerierung und das Ende der zweiten Klammer, ohne daß man die Taktlänge wieder zurücksetzen müßte.


Mit dem Snippet komme ich zu keinem Ergebnis

Der Vollständigkeit halber eine Begründung:
Das liegt wohl daran, daß das Snippet nicht auf das allgemeine Ausblenden von Teilbögen um des Ausblenden Willens ausgerichtet, sondern für den Kollisionsfall gedacht ist.
Und ein Bogen unter dem Notensystem kollidiert niemals mit einer Voltenklammer über dem Notensystem.
Die Lösung benutzt eine weißes Rechteck, das den Bogen überdeckt.

Ausweg: wenn man den zweiten Parameter (die Y-Werte) von \hideCurvesFrom entsprechend klein (negativ!) einstellt, kommt man weit genug herunter, um den Haltebogen zu überdecken:

(Ich habe übrigens vorher per convert-ly das Snippet auf Christas 2.16er-Stand gebracht).

\version "2.16.1"

% LSR In 2_13_0 and earlier, the following
% LSR warning may be triggered multiple times:
% LSR  warning: Ignoring grob for slur: <grob>. avoid-slur not set?
% LSR This issue has been resolved in 2_13_1

#(define (parse-grob-sym grob-sym)
   (let* ((grob-str (symbol->string grob-sym))
          (dot-index (string-index grob-str #\.))
          (context (if dot-index
                       (string-take grob-str dot-index)
                       "Voice"))
          (grob (if dot-index
                    (substring grob-str (+ dot-index 1))
                    grob-str)))
     (cons context grob)))

hideCurvesFrom =
#(define-music-function
   (parser location grob-sym x-padding y-padding)
   (symbol? pair? pair?)
   (let* ((context (car (parse-grob-sym grob-sym)))
          (top-grob (cdr (parse-grob-sym grob-sym))))
     #{
        \override Tie #'layer = #-2
        \override Slur #'layer = #-2
        \override PhrasingSlur #'layer = #-2

        \override $context . $top-grob #'avoid-slur = #'ignore
        \override $context . $top-grob #'layer = #-1
        \override $context . $top-grob #'stencil =
        #(lambda (grob)
           (define (get-stil-proc alist)
             ;; removes the first 'stencil entry from the grob-property
             ;; alist, implicitly created by this callback:
             ;;   (stencil . #<procedure #f (grob)>)
             ;; and then retrieves the original 'stencil procedure.
             (let ((stil-proc (ly:assoc-get 'stencil alist)))
               (if (procedure-name stil-proc)
                   stil-proc
                   (begin (set! alist (assoc-remove! alist 'stencil))
                          (get-stil-proc alist)))))
           (let* ((basic-props (ly:grob-basic-properties grob))
                  (stil-proc (get-stil-proc basic-props))
                  (this-stil (stil-proc grob)))
              (if (ly:stencil? this-stil)
                  (let* ((stil-x-ext (ly:stencil-extent this-stil 0))
                         (stil-y-ext (ly:stencil-extent this-stil 1))
                         (box-x-ext (cons (- (car stil-x-ext) (car x-padding))
                                          (+ (cdr stil-x-ext) (cdr x-padding))))
                         (box-y-ext (cons (- (car stil-y-ext) (car y-padding))
                                          (+ (cdr stil-y-ext) (cdr y-padding))))
                         (box-w (- (cdr box-x-ext) (car box-x-ext)))
                         (box-h (- (cdr box-y-ext) (car box-y-ext))))
                    (ly:stencil-add
                     (ly:make-stencil
                      (list 'embedded-ps
                            (ly:format
                             (string-append "gsave\n"
                                            "currentpoint translate\n"
                                            "1 setgray\n"
                                            "~4f ~4f ~4f ~4f rectfill\n"
                                            "grestore\n")
                             (car box-x-ext)
                             (car box-y-ext)
                             box-w
                             box-h))
                      stil-x-ext
                      stil-y-ext)
                     this-stil))
                  '())))
     #}))

revertHideCurvesFrom =
#(define-music-function (parser location grob-sym) (symbol?)
   (let ((context (car (parse-grob-sym grob-sym)))
         (top-grob (cdr (parse-grob-sym grob-sym))))
     #{
        \revert Tie #'layer
        \revert Slur #'layer
        \revert PhrasingSlur #'layer
        \revert $context . $top-grob #'avoid-slur
        \revert $context . $top-grob #'layer
        \revert $context . $top-grob #'stencil
     #}))

%%%%%%%%%%%%%%%%%% EXAMPLE %%%%%%%%%%%%%%%%%%


\relative c' {
  \repeat volta 2 {
    c4
    \set tieWaitForNote = ##t
    \hideCurvesFrom #'Score.VoltaBracket #'(-0.2 . 0.2) #'(-8 . -10)
    e~ }
  \alternative {
    { g d | c1 | }
    { \revertHideCurvesFrom #'Score.VoltaBracket     
       \set Timing.measurePosition = #(ly:make-moment 2 4) 
       e4 d | c1 }
    }
}

Der einzige Vorteil gegenüber Eluzes Ansatz ist allerdings, daß die Anfangspositionen (mit gewolltem leichten "Überlapp") sich an der tatsächlichen Breite der Voltenklammer) orientieren, unabhängig davon, wie die Zeile gerade gedehnt oder gestaucht wird.

Viele Grüße
Torsten

eluze

  • Member
Re: Haltebogen nur in Klammer zwei
« Antwort #8 am: Sonntag, 19. Mai 2013, 13:37 »
Zitat
Das provoziert allerdings LilyPond-Warnungen.
genau das hat mich genervt und ich habe auf die schnelle aus einem anderen programm etwas markiert und eingefügt, ohne genau hinzuschauen - natürlich ist measurePosition genauer!

Zitat
Ausweg: wenn man den zweiten Parameter (die Y-Werte) von \hideCurvesFrom entsprechend klein (negativ!) einstellt, kommt man weit genug herunter, um den Haltebogen zu überdecken
sehr schön! ich hatte schon befürchtet, dass eine umständliche scheme-funktion geschrieben werden müsste - deine lösung finde ich einfach genial! :)

Be-3

  • Member
Re: Haltebogen nur in Klammer zwei
« Antwort #9 am: Sonntag, 19. Mai 2013, 14:09 »
sehr schön! ich hatte schon befürchtet, dass eine umständliche scheme-funktion geschrieben werden müsste - deine lösung finde ich einfach genial! :)

Danke, aber so genial war sie auch wieder nicht, eher Herumprobieren mit den Werten.
Meine Lösung funktioniert zwar, aber das weiße Rechteck hat schon etwas seltsame Abmessungen... (man sieht sie bloß nicht) ;)

Ein wenig wollte ich der Sache noch auf den Grund gehen, und wenn man in der Definition von \hideCurvesFrom die Stelle
"1 setgray\n"
durch
"0.9 setgray\n"
ersetzt, kann man das ansonsten unsichtbare Postscript-Rechteck sehen (und auch, daß es in meinem Lösungsvorschlag unnötig überdimenioniert ist).
Bei einem Y-padding von #'(0 . 0) hat die Box genau die Abmessungen und Höhe der Voltenklammer. Durch Änderung dieses Padding-Pairs läßt sich die Box passend dimensionieren und verschieben.

Viele Grüße
Torsten

chf

  • Member
Re: Haltebogen nur in Klammer zwei
« Antwort #10 am: Sonntag, 19. Mai 2013, 18:37 »
Hallo Eluze und Torsten,

heißesten Dank für euere Unermüdlichkeit und für das Ergebnis,
derweil ich den herrlichen Pfingesttag im Garten genoss!

Gruß
Christa


eluze

  • Member
Re: Haltebogen nur in Klammer zwei
« Antwort #11 am: Sonntag, 19. Mai 2013, 22:01 »
Zitat
derweil ich den herrlichen Pfingesttag im Garten genoss!
ja, bei dermassen viel sonne fürchtete ich mich vor dem sonnenbrand :D

Torsten: wäre das was fürs LSR!? die frage taucht ja ziemlich häufig auf und der trick mit dem \laissezVibrer oder \repeatTie bedarf meist auch weiterer anpassungen.

super wäre es, wenn man die maximale vertikale distanz des slurs/ties vom zu verbergenden objekt bestimmen und automatisch in die \hideCurvesFrom funktion einbauen könnte - aber auch so ist sie schon sehr brauchbar!

gruss
Eluze

Be-3

  • Member
Re: Haltebogen nur in Klammer zwei
« Antwort #12 am: Montag, 20. Mai 2013, 12:41 »
super wäre es, wenn man die maximale vertikale distanz des slurs/ties vom zu verbergenden objekt bestimmen und automatisch in die \hideCurvesFrom funktion einbauen könnte - aber auch so ist sie schon sehr brauchbar!

Hallo Eluze,

es wäre wohl gegen die Intention von \hideCurvesFrom, automatisch (d. h. generell) die vertikale Distanz zum Bogen zu bestimmen bzw. einfach die Box über die gesamte Systemhöhe auszudehnen...
Denn eigentlich soll ja bloß vermieden werden, daß die Bögen ein Objekt durchkreuzen. Und das tun sie ja nicht, wenn sie weiträumig am betroffenen Objekt vorbeilaufen. ;)
Wir haben das Snippet nur für unsere Zwecke mißbraucht, und in Wirklichkeit interessierte uns ja nur die Ausdehnung des Taktes...
Vielleicht wäre es besser, Deinen dash-definition-Ansatz zu verwenden und die Positionen flexibel zu berechnen (also keine festen Abstände, sondern eher "bis zum Taktanfang/Ende"... Ich habe aber momentan keine Idee, wie man das sinnvoll anfangen könnte...

Viele Grüße
Torsten

eluze

  • Member
Re: Haltebogen nur in Klammer zwei
« Antwort #13 am: Montag, 20. Mai 2013, 18:45 »
Zitat
es wäre wohl gegen die Intention von \hideCurvesFrom, automatisch (d. h. generell) die vertikale Distanz zum Bogen zu bestimmen bzw. einfach die Box über die gesamte Systemhöhe auszudehnen...
Denn eigentlich soll ja bloß vermieden werden, daß die Bögen ein Objekt durchkreuzen. Und das tun sie ja nicht, wenn sie weiträumig am betroffenen Objekt vorbeilaufen.

hallo Torsten

in unserem speziellen fall bin ich da anderer meinung: wir wollen verhindern dass der bogen in der ganzen 1. klammer überhaupt gezeichnet wird!

aber um nicht noch eine funktion zu schreiben sollte man im snippet darauf hinweisen, was eine sinnvolle vertikale dimension ist (z.b. Y-padding von #'(0 . -12) reicht dann für das e mit haltebogen auf der 6. saite der gitarre

aber zugegeben, das kann auch komisch aussehen, dann kann man jedoch den parameter auf 0 setzten oder die funktion weglassen.

gruss
Eluze

chf

  • Member
Re: Haltebogen nur in Klammer zwei
« Antwort #14 am: Montag, 20. Mai 2013, 19:26 »
Ihr Lieben,

die Freude ist getrübt. Warum funktioniert die Geschichte wunderbar in dem einstimmigen Beispiel,
nicht aber im vierstimmigen Satz?
Ich wollte den entsprechenden Ausschnitt senden, aber da kommt eine ganz wunderliche Fehlermeldung.
So entschuldigt bitte, dass ich euch mit dem kompltten code bombardiere.

Im pdf seht ihr auch das mir unerklärliche Bild - die ausgeblendeten Notenlinien.

Christa