\version "2.20.0"
#(define-markup-command (myBox layout props myWidth myHeight) (number? number?)
(interpret-markup layout props
(markup #:line (#:with-dimensions (cons 0 0)(cons 0 0)
(#:path 0.2
(list (list (quote moveto) -1.7 1)
(list (quote lineto) myWidth 1)
(list (quote lineto) myWidth (* myHeight -1))
(list (quote lineto) -1.7 (* myHeight -1))
(list (quote closepath))))))))
\relative c'' {
r8^\markup\myBox #34 #9 [ c8-. d,-. f-.] r8 g4-. d'8-. \break
e4-. a8-. b4-. r8
}
Liebe Freunde,
für mein layout wäre es sehr schön, wenn der Zeilenumbruch samt Box zustande käme. ???
Gruß
Christa
Wenn ich Deinen Code compiliere bekomme ich:
(https://i.imgur.com/2FCtBb6.png)
Einen Zusammenhang mir der formulierten Aussage sehe ich nicht.
Was willst Du?
-Harm
#(define-markup-command (myBox layout props myWidth myHeight) (number? number?)
(interpret-markup layout props
(markup #:line (#:with-dimensions (cons 0 0)(cons 0 0)
(#:path 0.2
(list (list (quote moveto) -1.7 1)
(list (quote lineto) myWidth 1)
(list (quote lineto) myWidth (* myHeight -1))
(list (quote lineto) -1.7 (* myHeight -1))
(list (quote closepath))))))))
\relative c'' {
r8^\markup\myBox #100 #9 [ c8-. d,-. f-.] r8 g4-. d'8-.
\break
e4-. a8-. b4-. r8
}
Die ganze Phrase soll in den Kasten...
Hallo Christa,
ich versuche jetzt erst einmal, das (was ich letztlich nur vermute) was du willst, in »technische Anforderungen« umzusetzen.
- Gegeben ist ein musikalischer Abschnitt (traditionell in einer Notenzeile notiert), welcher hervorgehoben bzw. markiert werden soll
- Diese Markierung soll durch ein »Rechteck« darum geschehen
- Diese Markierung soll automatisch mit der Notenschrift »wachsen und schrumpfen«, je nachdem wie sie durch den Randausgleich gedehnt oder gestaucht wird
- Auch ein Zeilenumbruch innerhalb des Bereichs soll unterstützt werden, in der Form, daß in der Anfangszeile ein rechts offenes Rechteck, in der Schlußzeile ein links offenes Rechteck steht
- Die vertikale Größe des Rechtecks muß nicht automatisch dimensioniert werden, es genügt auch, die beiden Abstandswerte von der Notenzeilenmitte manuell einzugeben
- Als »Zugabe« wäre es noch schön, wenn der Bereich des Rechtecks mit einer Hintergrundfarbe (ergo hinter den Noten) belegt werden könnte.
Ohne mich bereits in diese Aufgabe vertieft zu haben, könnte ich mir eine Lösung mit
zwei Linespannern (einer für die Linie unten, einer für die Linie oben) und entsprechende Start- und Ende-Grafiken (einfache senkrechte Linien) vorstellen.
Eine Hintergrundfarbfüllung damit (alleine) geht natürlich nicht.
startTextSpan & Co mit Linien an den Enden habe ich im Handbuch schon mal gesehen.
Eine farbliche Hinterlegung nur der Notenzeile (nicht darüber oder darunter) habe ich auch schon in irgendwelchen Beispiel-Schnipseln gesehen.Arnold
Zitatein Zeilenumbruch innerhalb des Bereichs soll unterstützt werden, in der Form, daß in der Anfangszeile ein rechts offenes Rechteck, in der Schlußzeile ein links offenes Rechteck steht
HA
Hallo Arnold,
s. Zitat:
Das ist mein Wunsch.
Alles andere kann ich in "myBox" jetzt schon regeln, und die Hintergrundunterlegung spielt für mich keine Rolle.
Christa
Hallo,
ich bin mal Arnold's Gedanken ein Stück weit gefolgt.
\version "2.20.0"
%% not in 2.20, but in more recent versions
#(define spanner-bounds-break-status
(lambda (spanner)
(cons
(ly:item-break-dir (ly:spanner-bound spanner LEFT))
(ly:item-break-dir (ly:spanner-bound spanner RIGHT)))))
#(define-public unbroken-spanner?
(lambda (spanner) (equal? '(0 . 0) (spanner-bounds-break-status spanner))))
#(define-public first-broken-spanner?
(lambda (spanner) (equal? '(0 . -1) (spanner-bounds-break-status spanner))))
#(define-public middle-broken-spanner?
(lambda (spanner) (equal? '(1 . -1) (spanner-bounds-break-status spanner))))
#(define-public end-broken-spanner?
(lambda (spanner) (equal? '(1 . 0) (spanner-bounds-break-status spanner))))
#(define-public not-first-broken-spanner?
(lambda (spanner) (positive? (car (spanner-bounds-break-status spanner)))))
#(define-public not-last-broken-spanner?
(lambda (spanner) (negative? (cdr (spanner-bounds-break-status spanner)))))
#(define-public unbroken-or-last-broken-spanner?
(lambda (spanner) (zero? (cdr (spanner-bounds-break-status spanner)))))
#(define-public unbroken-or-first-broken-spanner?
(lambda (spanner) (zero? (car (spanner-bounds-break-status spanner)))))
%% the box-stencil-procedure
#(define text-spanner::print-box
(lambda (grob)
(ly:grob-set-property! grob 'style 'solid)
(ly:grob-set-property! grob 'staff-padding '())
(ly:grob-set-property! grob 'outside-staff-priority '())
(let* ((stil (ly:line-spanner::print grob))
(stil-x-ext (ly:stencil-extent stil X))
(thick (ly:grob-property grob 'thickness 0.1))
(bound-details (ly:grob-property grob 'bound-details))
(left-b-d (assoc-get 'left bound-details '()))
(right-b-d (assoc-get 'right bound-details '()))
(left-pad (assoc-get 'padding left-b-d 0))
(right-pad (assoc-get 'padding right-b-d 0))
(details-y-extent (assoc-get 'y-extent bound-details))
(line-stil
(make-line-stencil
thick
0
(car details-y-extent)
0
(cdr details-y-extent)))
(left-vertical-line
(ly:stencil-translate-axis
line-stil
left-pad
X))
(right-vertical-line
(ly:stencil-translate-axis
line-stil
(- (cdr stil-x-ext) (/ thick 2))
X))
(up-horizontal-line
(ly:stencil-translate-axis
stil
(cdr details-y-extent)
Y))
(bottom-horizontal-line
(ly:stencil-translate-axis
stil
(car details-y-extent)
Y)))
(ly:grob-translate-axis! grob 0 Y)
(ly:stencil-add
up-horizontal-line
bottom-horizontal-line
(if (unbroken-or-first-broken-spanner? grob)
left-vertical-line
empty-stencil)
(if (unbroken-or-last-broken-spanner? grob)
right-vertical-line
empty-stencil)))))
%% the function
boxMe =
#(define-music-function (left-right bottom-up)(pair? pair?)
"Returns a box-like stencil for the @code{TextSpanner}-grob. For a box at line
break the box at line end is open to the right, the box at line begin is open to
the left.
The left and right borders are moveable by reasonable settings of
@var{left-right}.
The bottom and top borders are moveable by reasonable settings of
@var{bottom-up}."
#{
\override TextSpanner.bound-details.left.padding = #(car left-right)
\override TextSpanner.bound-details.right.padding = #(cdr left-right)
\override TextSpanner.bound-details.left-broken.padding = 0.25
\override TextSpanner.bound-details.right-broken.padding = 0.25
\override TextSpanner.bound-details.y-extent = #bottom-up
\override TextSpanner.stencil = #text-spanner::print-box
#})
%%%%%%%%%%%%%%%%%%%%%%
%% EXAMPLE
%%%%%%%%%%%%%%%%%%%%%%
{
\once \boxMe #'(-1 . -2) #'(-5 . 3)
b1\startTextSpan
\break
b1\stopTextSpan
\once \boxMe #'(-1 . -2) #'(-3 . 3)
b'1\startTextSpan
b'1\stopTextSpan
}
Nicht sehr automatisiert, aber verwendbar, imho.
HTH,
arm
Hallo Harm und Vordenker Arnold,
herzlichen Dank!
Christa
Hallo Christa,
ich bin etwas spät dran... aber mit diesen Fällen beschäftigt sich Snippet 1000 im LSR:
http://lsr.di.unimi.it/LSR/Item?id=1000
Daraus ist inzwischen ein Paket für openLilyLib geworden:
https://github.com/openlilylib/analysis
Dort gibt es das Modul "Frames". Hier ist eine Auflistung, was man damit alles anstellen kann:
https://github.com/openlilylib/analysis/blob/master/usage-examples/frames.pdf
Vielleicht wäre das auch für dich interessant.
Viele Grüße,
Klaus