box und Zeilenumbruch

Begonnen von chf, Sonntag, 1. November 2020, 19:49

« vorheriges - nächstes »

chf

\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

harm6

Wenn ich Deinen Code compiliere bekomme ich:


Einen Zusammenhang mir der formulierten Aussage sehe ich nicht.
Was willst Du?

-Harm

chf

#2
#(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...

Arnold

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

chf

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

harm6

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

chf

Hallo Harm und Vordenker Arnold,

herzlichen Dank!
Christa

Pusteblumi

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