Taktstriche, zwei Arten von

Begonnen von erich, Samstag, 29. Juli 2017, 09:22

« vorheriges - nächstes »

erich

Hallo allen

Ich hatte das Problem mit dem Taktstrich am Ende einer Zeile
beim Umrastern schon angesprochen. Nun fällt mir auf, dass auch
in der Zeilenmitte ein weiteres Problem auftaucht:

Es fehlt der abschließende Taktstrich

Nun mag man das Problem für etwas esotherisch halten; ich möchte dazu
jedoch anmerken, dass ich schon mal ein ähnliches hatte:
Ich wollte die Wiederholungszeichen rot einfärben, damit man sie besser
finden kann, und da trat der Fall ein, dass es am Ende einer Zeile nicht
befriedigend zu lösen war.

Mir scheint, man braucht konzeptuell zwei Arten von Taktstrichen,
- solche am Ende und
- solche am Anfang der Zeile
In der Mitte einer Zeile könnten sie dann überlagert werden.

Gruß
Erich

p.s. Man hätte das Problem auch schon unter LP 2.14 bemerken können; unter 1.6.2 "Einzelne Systeme verändern" tritt der Fall auch schon auf, nur man merkt es dort kaum.


harm6

Zitat
Ich hatte das Problem mit dem Taktstrich am Ende einer Zeile
beim Umrastern schon angesprochen. Nun fällt mir auf, dass auch
in der Zeilenmitte ein weiteres Problem auftaucht:

Es fehlt der abschließende Taktstrich

Hier weiß ich nicht was Du meinst. Der Taktstrich ist doch da, nur mit falscher Größe. Dein Bild zeigt nur ein weiteres Beispiel für issue 3609.
https://sourceforge.net/p/testlilyissues/issues/3609/
Lösbar mit BarLine.bar-extent

Zitat
Ich wollte die Wiederholungszeichen rot einfärben, damit man sie besser
finden kann, und da trat der Fall ein, dass es am Ende einer Zeile nicht
befriedigend zu lösen war.
Code oder link bitte.

Zitat
Mir scheint, man braucht konzeptuell zwei Arten von Taktstrichen,
- solche am Ende und
- solche am Anfang der Zeile
In der Mitte einer Zeile könnten sie dann überlagert werden.

LilyPond macht das bereits. Genauer gesagt hat jede Definition eines spezifischen Taktstrichs vier Setzungen: für das Verhalten am Zeilenanfang, in der Mitte der Zeile, am Zeilenende und für den SpanBar.
Was Du Dir mit der "Überlagerung" vorstellst erschließt sich mir nicht. Das Problem ist doch, daß die Größe der Taktstriche nach dem folgenden Staff ausgerichtet werden und nie nach dem vorangegangenen.
Das ist wieder issue 3609, siehe oben.

Gruß,
  Harm


erich

#2
Hallo Harm

Hier zunächst mein Code für das Beispiel

\version "2.19.52"
\language "nederlands"
\paper {indent = 0
        line-width = 40}
\score{
  <<
    \new Staff \with {\remove "Time_signature_engraver"
           \override StaffSymbol.line-positions = #'(-4 -2 0 2 4)}
    \new Voice { c'1
    \stopStaff
        \override Staff.StaffSymbol.line-positions = #'(-8 -6 -4 -2 0)
    \startStaff
    c'1
    }
  >>
}



mir ist nicht klar, wie das mit
Zitat
Lösbar mit BarLine.bar-extent
gehen soll. Ich möchte auch am Ende des ersten Teils einen vollständigen Taktstrich setzen können.

Wenn Du mir das zeigen kannst, erübrigen sich vielleicht alle weiteren Erörterungen.

Gruß
Erich

p.s. Unter Überlagerung möchte ich das Setzen beider Taktstriche an den gleichen horizontalen Ort verstehen, sodass sie sich gegenseitig nach oben und unten ergänzen.

erich

Hallo Harm,
Du meinst es wohl so:

\version "2.19.52"
\language "nederlands"
\paper {indent = 0
        line-width = 40}
\score{
  <<
    \new Staff \with {\remove "Time_signature_engraver"
           \override StaffSymbol.line-positions = #'(-4 -2 0 2 4)}
    \new Voice { c'1
    \stopStaff
        \override Staff.StaffSymbol.line-positions = #'(-8 -6 -4 -2 0)
    \startStaff
    \once \override Staff.BarLine.bar-extent = #'(-4 . 2)
   
    c'1
    }
  >>


Das ist aber eher ein work around.

aber vielen  Dank

Erich

harm6

Zitat
Das ist aber eher ein work around.

Natürlich!!
Issue 3609 ist ein ungelöster bug. Also braucht man einen workaround, was sonst?
Eigentlich sollte die BarLine nach rechts und links auf den Staff schauen, um sich auszurichten. Das wäre die Lösung für issue 3609. Aber wenn ich wüßte wie man das macht hätte ich längst einen patch dazu eingereicht.

Gruß,
  Harm

erich

Hallo Harm

Zitat
Eigentlich sollte die BarLine nach rechts und links auf den Staff schauen, um sich auszurichten.

jaaaaaaaaaaaaaa, sollte; weißt Du, ob daran gearbeitet wird?

Gruß
Erich

harm6

Zitat
jaaaaaaaaaaaaaa, sollte; weißt Du, ob daran gearbeitet wird?

Man kann nie sicher sein, ob nicht irgendjemand dran arbeitet. Mir ist allerdings nichts bekannt.

Aber ich hab mal einen Versuch gemacht für etwas Automatismus zu sorgen.
Funktioniert aber nur für einfache Taktstriche wie "|", "||", ".", "|."
Wiederholungszeichen, "S", "k" sind nicht korrekt umsetzbar. Obs überhaupt geht? Zumindest habe ich bislang noch nichts zielführendes gefunden.

Aber hier der Code den ich bislang habe:


\version "2.19.64"

#(define (correct-bar-lines-engraver context)
  ;; Works only for simple BarLines like "|", "||", ".", "|."
  (let ((staff-y-exts '()))
    (make-engraver
     (acknowledgers
      ((staff-symbol-interface engraver grob source-engraver)
       (set! staff-y-exts
             (cons (ly:grob-property grob 'Y-extent) staff-y-exts)))
      ((bar-line-interface engraver grob source-engraver)
       (if (> (length staff-y-exts) 1)
           (let ((before (first staff-y-exts))
                 (now (second staff-y-exts)))
             (ly:grob-set-property! grob 'before-line-breaking
               (lambda (grob)
                 (ly:grob-set-property! grob 'bar-extent
                   (case (ly:item-break-dir grob)
                     ((0)
                        (cons
                          (min (car before) (car now))
                          (max (cdr before) (cdr now))))
                     ((-1) now)
                     ((1) before)))))
             (set! staff-y-exts (drop-right staff-y-exts 1)))
            '())))
     ((finalize translator)
      (set! staff-y-exts '())))))

\layout {
  \context {
  \Score
    %% uncommenting next line will show not matching dots for opening/closing
    %% repeat-sgns
    %defaultBarType = #":..:"
  }
  \context {
    \Staff
    \consists \correct-bar-lines-engraver
  }
}

\score {
  %% While using a context with SpanBars the SpanBar at line-end is missing
  %% https://sourceforge.net/p/testlilyissues/issues/2876/
  \new PianoStaff
  <<
    \new Staff
    {
      \repeat unfold 12 {
        c'1
        \stopStaff
        \override Staff.StaffSymbol.line-positions = #'(-8 -6 -4 -2 0)
        \startStaff
        d'4 e' f' g'
        \stopStaff
        \override Staff.StaffSymbol.line-positions = #'(-4 -2 0 2 4)
        \startStaff
        e'2 c'
        \stopStaff
        \override Staff.StaffSymbol.line-positions = #'(-2 0 2 4 6 8 10)
        \startStaff
      }
      c'1
    }
    \new Staff \repeat unfold 37 R1
  >>
}


HTH,
  Harm

erich

Hallo Harm,

wenn ich in Deinen Code die beiden Zeilen

\include "dodecapitchnames.ly"
#(ly:parser-set-note-names  dodecaPitchNames)

einfüge, geschieht etwas, wie ich es nicht erwarten würde; mal wird es 12-ton gesetzt mal nicht.
Ich will ja immer alle Noten in 12-Ton-Notation setzen und zwar immer 3 volle Linien und 3 gestrichelte im Wechsel.

Mir scheint, bis dahin ist es noch ein weiter Weg.

Gruß
Erich

harm6

Zitat von: erich am Sonntag, 30. Juli 2017, 11:10
Hallo Harm,

wenn ich in Deinen Code die beiden Zeilen

\include "dodecapitchnames.ly"
#(ly:parser-set-note-names  dodecaPitchNames)

einfüge, geschieht etwas, wie ich es nicht erwarten würde; mal wird es 12-ton gesetzt mal nicht.
Ich will ja immer alle Noten in 12-Ton-Notation setzen und zwar immer 3 volle Linien und 3 gestrichelte im Wechsel.

Mir scheint, bis dahin ist es noch ein weiter Weg.

Gruß
Erich

Ich habe keine Ahnung wovon Du sprichst. Wenn ich obigen code einfüge erhalte ich u.a.:

Zitat von: terminalerror: cannot find file: `dodecapitchnames.ly'
error: GUILE signaled an error for the expression beginning here
#
(ly:parser-set-note-names  dodecaPitchNames)
Unbound variable: dodecaPitchNames

Nichtsdestotrotz hier die erweiterte Fassung meines obigen Codes, soweit ich das sehen kann steht nur noch issue 2876 im Weg.


\version "2.19.64"

%% Some not public function from bar-line.scm
%% Redefened here with some debugging-syntax to make
%% bar-line::my-compound-bar-lines work without too much c/p
#(define string->string-list (@@ (lily) string->string-list))
#(define strip-string-annotation (@@ (lily) strip-string-annotation))
#(define get-span-glyph (@@ (lily) get-span-glyph))
#(define replacement-char (@@ (lily) replacement-char))
#(define glyph->stencil (@@ (lily) glyph->stencil))

%% extended bar-line::compound-bar-line from bar-line.scm
%% 'corr-arg' as a new argument will be used to translate parts of the stencil
#(define (bar-line::my-compound-bar-lines grob bar-glyph extent corr-arg)
  "Build the bar line stencil."
  (let* ((line-thickness (layout-line-thickness grob))
         (kern (* (ly:grob-property grob 'kern 1) line-thickness))
         (bar-glyph-list (string->string-list
                          (strip-string-annotation bar-glyph)))
         (span-glyph (get-span-glyph bar-glyph))
         (span-glyph-list (string->string-list span-glyph))
         (neg-stencil empty-stencil)
         (stencil empty-stencil)
         (is-first-neg-stencil #t)
         (is-first-stencil #t))

    ;; We build up two separate stencils first:
    ;; (1) the neg-stencil is built from all glyphs that have
    ;;     a replacement-char in the span bar
    ;; (2) the main stencil is built from all remaining glyphs
    ;;
    ;; Afterwards the neg-stencil is attached left to the
    ;; stencil; this ensures that the main stencil starts
    ;; at x = 0.
    ;;
    ;; For both routines holds:
    ;; we stack the stencils obtained by the corresponding
    ;; single glyphs with spacing 'kern' except for the
    ;; first stencil
    ;; (Thanks to Harm who came up with this idea!)
    (for-each (lambda (bar span)
                (if (and (string=? span (string replacement-char))
                         is-first-stencil)
                    (begin
                      (set! neg-stencil
                            ;; stencil-translation is added
                            (ly:stencil-translate-axis
                              (ly:stencil-combine-at-edge
                                neg-stencil
                                X
                                RIGHT
                                (glyph->stencil bar grob extent)
                                (if is-first-neg-stencil 0 kern))
                              corr-arg
                              Y))
                      (set! is-first-neg-stencil #f))
                    (begin
                      (set! stencil
                            (ly:stencil-combine-at-edge
                              stencil
                              X
                              RIGHT
                              (glyph->stencil bar grob extent)
                              (if is-first-stencil 0 kern)))
                      (set! is-first-stencil #f))))
              bar-glyph-list span-glyph-list)
    ;; if we have a non-empty neg-stencil,
    ;; we attach it to the left side of the stencil
    (and (not is-first-neg-stencil)
         (set! stencil
               (ly:stencil-combine-at-edge
                stencil
                X
                LEFT
                neg-stencil
                kern)))
      stencil))
     
%% extended ly:bar-line::print from bar-line.scm
%% 'y-corr' is added as an argument to let 'bar-line::my-compound-bar-lines'
%% use it
#(define ((ly:my-bar-line::print y-corr) grob)
  "The print routine for bar lines."
  (let* ((glyph-name (ly:grob-property grob 'glyph-name))
         (extent (ly:grob-property grob 'bar-extent '(0 . 0))))

    (if (and glyph-name
             (> (interval-length extent) 0))
        (bar-line::my-compound-bar-lines grob glyph-name extent y-corr)
        #f)))

%% the engraver will reset bar-extent with respect to changed
%% Staff.line-positions
%% uses the 'ly:my-bar-line::print' to get the dots in repeat-signs correct
#(define (correct-bar-lines-engraver context)
  ;; Limitation: does not work for bar-lines containg "[", "]", "S", "k"
  (let ((staff-y-exts '()))
    (make-engraver
     (acknowledgers
      ((staff-symbol-interface engraver grob source-engraver)
       (set! staff-y-exts
             (cons (ly:grob-property grob 'Y-extent) staff-y-exts)))
      ((bar-line-interface engraver grob source-engraver)
       (if (> (length staff-y-exts) 1)
           (let* ((before (first staff-y-exts))
                  (now (second staff-y-exts))
                  (corr (- (interval-center now) (interval-center before))))
             (ly:grob-set-property! grob 'before-line-breaking
               (lambda (grob)
                 (let ((break-dir (ly:item-break-dir grob)))
                   (if (>= break-dir -1)
                       (ly:grob-set-property! grob 'after-line-breaking
                         (lambda (grob)
                           (ly:grob-set-property! grob 'stencil
                             (ly:my-bar-line::print
                               (if (= break-dir -1)
                                   (interval-center now)
                                   corr))))))
                   
                   (ly:grob-set-property! grob 'bar-extent
                     (case break-dir
                       ((0)
                          (cons
                            (min (car before) (car now))
                            (max (cdr before) (cdr now))))
                       ((-1) now)
                       ((1) before))))))
                     
             (set! staff-y-exts (drop-right staff-y-exts 1)))
            '())))
     ((finalize translator)
      (set! staff-y-exts '())))))
     
%% Avoid sticking out staff-lines, i.e. don't take ":" into account for
%% calculating the X-extent
#(define new-bar-x-ext
  (lambda (grob)
    (let* ((glyph (ly:grob-property grob 'glyph-name))
           (orig-ext (ly:stencil-extent (ly:bar-line::print grob) X))
           (ext #f))
      (if (string-contains glyph ":")
          (let ((raw-bar (string-trim-both  glyph #\:)))
            (ly:grob-set-property! grob 'glyph-name raw-bar)
            (set! ext (ly:stencil-extent (ly:bar-line::print grob) X))
            (ly:grob-set-property! grob 'glyph-name glyph)
            (ly:grob-set-property! grob 'extra-spacing-width orig-ext)
            ext)
          orig-ext))))
     
\layout {
  \context {
  \Score
    defaultBarType = ":..:"
  }
  \context {
    \Staff
    \consists \correct-bar-lines-engraver
    \override BarLine.X-extent = #new-bar-x-ext
  }
}


\score {
  %% While using stop/startStaff and a context with SpanBars the SpanBar at
  %% line-end is missing. See:
  %% https://sourceforge.net/p/testlilyissues/issues/2876/
  \new PianoStaff
  <<
    \new Staff
    {
      \repeat unfold 12 {
        c'1
        \stopStaff
        \override Staff.StaffSymbol.line-positions = #'(-8 -6 -4 -2 0)
        \startStaff
        d'4 e' f' g'
        \stopStaff
        \override Staff.StaffSymbol.line-positions = #'(-4 -2 0 2 4)
        \startStaff
        e'2 c'
        \stopStaff
        \override Staff.StaffSymbol.line-positions = #'(-2 0 2 4 6 8 10)
        \startStaff
      }
      c'1
    }
    \new Staff \repeat unfold 37 R1
  >>
}


-Harm

erich

Hallo Harm,

ich hatte mich geirrt; ich werde dir berichten, wie weit ich komme.

vielen , vielen Dank

Erich

erich

Hallo Harm

vielen Dank! es funktioniert jetzt !

Gruß
Erich

harm6

Schön das zu hören :)
Wenn ich jetzt auch noch mit issue 2876 zu Rande käme...
Auch denke ich das noch ein bißchen Feinabstimmung notwendig ist.
Du wirst ein paar Problemchen sehen wenn es Taktwechsel gibt. Wahrscheinlich auch bei Schlüssel- bzw Vorzeichenwechseln.

Gruß,
  Harm

erich

Ja, Harm, Problemchen beim Taktwechsel ist mir schon aufgefallen.