Deutsches Lilypond Forum (Archiv)
Allgemein => Fragen zu Funktionen => Thema gestartet von: chf 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
-
hallo!
hast du \set tieWaitForNote = ##tschon probiert?
Eluze
-
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
-
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
-
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
-
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
-
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
-
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
-
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!
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! :)
-
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
-
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
-
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
-
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
-
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
-
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
-
hallo Christa
ist ja klar - die volta-klammer ist über dem ersten systen (staff) und bis zum zweiten geht's natürlich ganz weit hinunter!
ich habe deinen code (nach korrekturen >:( ) mit #'(-8 . -30) ersetzt und es funktioniert wieder. (probier mal den trick von Torsten mit .9 setgray aus, damit du siehst wieviel es eigentlich braucht)
alternativ könntest du auch die volta-klammer aus dem Scor in den Staff context versetzen (und transparent machen) und wieder mit normaleren zahlen operieren
Eluze
-
die Freude ist getrübt. Warum funktioniert die Geschichte wunderbar in dem einstimmigen Beispiel,
nicht aber im vierstimmigen Satz?
Liebe Christa,
laß die Freude nicht getrübt sein, Pfingsten ist noch nicht vorbei und die Erleuchtung kommt bestimmt noch. ;)
Im vierstimmigen Satz war Dein "weißes Rechteck" einfach nicht weit genug nach unten ausgedehnt - deshalb wurde der Bogen nicht wie gewünscht verdeckt.
Im Gegensatz dazu war es aber so hoch, daß es stattdessen das System darüber "mit erwischt" hat.
Ich habe, um das zu illustrieren, das weiße Recheck grau eingefärbt und somit kenntlich gemacht. Links Deine Variante, rechts meine Veränderung (siehe Bild im Anhang).
Das entsprechend geänderte Coding:
\version "2.16.1"
\paper {
#(layout-set-staff-size 17.3)
%page-count = 1
%system-count = #2
indent = #0
top-margin = #14
inner-margin = #14
outer-margin = #18
two-sided = ##t
%bottom-margin = #23
ragged-last-bottom = ##t
ragged-right = ##f
%ragged-last = ##t
tagline = ##f
%first-page-number = #3
print-page-number = ##f
print-first-page-number = ##t
oddHeaderMarkup = \markup \fontsize #2 \fill-line { \null \on-the-fly #not-first-page \fromproperty #'page:page-number-string }
evenHeaderMarkup = \markup \fontsize #2 \fill-line { \fromproperty #'page:page-number-string \null }
}
rochade = \once \override Score.BreakAlignment #'break-align-orders =
#(make-vector 3
'(left-edge
ambitus
breathing-sign
clef
time-signature
staff-bar
key-cancellation
key-signature
custos))
padTsBar = \once \override Score.TimeSignature #'space-alist = #'(
(first-note fixed-space . 2.0)
(right-edge extra-space . 0.5)
(staff-bar minimum-space . 3.0))
raus = \once \override DynamicText #'extra-offset = #'(+1.0 . -0.0)
ignore = \override NoteColumn #'ignore-collision = ##t
\markup \fill-line \bold \fontsize #2.5 { "168. Du hast uns, Herr, gerufen" \null \null }
\markup \fill-line { }
\markup \fill-line { }
upper = \relative c' {
\clef treble
\key f \major
\time 2/2
\override Score.BarNumber #'transparent = ##t
\override Score.BarLine #'hair-thickness = #1.425
\override Score.BarLine #'thick-thickness = #4.5
%\override Score.BarLine #'transparent = ##t
%\override Score.TimeSignature #'stencil = #'()
\overrideProperty #"Score.NonMusicalPaperColumn"
#'line-break-system-details #'(
(alignment-distances . (13)))
\numericTimeSignature
<<{\partial 4 d4 d e f g a2 a4 a bes bes c c a2. \bar ":|" \repeat volta 2 {a4 a a d d
\break
\overrideProperty #"Score.NonMusicalPaperColumn"
#'line-break-system-details #'(
(alignment-distances . (13)))
c2 a4 a f2} \alternative {{g2 | a2.}{ d,2 | d1}}
\break
\overrideProperty #"Score.NonMusicalPaperColumn"
#'line-break-system-details #'(
(alignment-distances . (13)))
}\\
{a4 d2. e4 f e d f~f2 g4. f8 e2. e4 f2 a4 g a g f2~f4 e d f e2. d4 bes a1 }>>
\revert Score.BarLine #'transparent \bar "|."
}
% 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
#}))
lower = \relative c {
\clef bass
\key f \major
\numericTimeSignature
<<{f4 g2 bes c f,4 e d d' a b cis2. cis!4 d2. e4~e a,2 c4~
c
\set tieWaitForNote = ##t
\hideCurvesFrom #'Score.VoltaBracket #'(-0.2 . 0.2) #'(14 . -14)
\tieUp a~
bes d | cis2.
\revertHideCurvesFrom #'Score.VoltaBracket
\set Timing.measurePosition = #(ly:make-moment 2 4)
a4 g | fis1
}
\\
{d4 bes2 g d'4 c bes a g2 e a2. a4 d c bes2 c d~d4 c bes e, a2. bes4 c d1 }>>
\revert Staff.BarLine #'transparent \bar "|."
}
music = {
\new StaffGroup \with {
\override StaffGrouper #'staff-staff-spacing #'basic-distance = #3
\override StaffGrouper #'staff-staff-spacing #'stretchability = #30
\override ScoreSystem-System-Spacing #'basic-distance = #100
%\override StaffGrouper #'staffgroup-staff-spacing #'basic-distance = #7
}
<<
\new Staff <<\upper >>
\new Staff <<\lower >>
>>
}
\score {
\music
\midi {
\context {
\Score
tempoWholesPerMinute = #(ly:make-moment 110 4)
}
}
\layout { }
}
\markup "Kurt Rommel, 1967"
Mit dem rechten und linken Padding (der erste Pair-Parameter) kannst du durch leichte Anpassungen erreichen, daß mehr oder weniger vom Bogen sichtbar wird.
Viele Grüße
Torsten
PS: Ah, Eluze ist mir zuvorgekommen. :)
Dann mußt Du ja jetzt quasi eine Doppel-Erleuchtung haben ;)