Schlüssel, Tonart und Takt in der Mitte des Wiederholungszeichens

Begonnen von chf, Mittwoch, 28. März 2018, 19:41

« vorheriges - nächstes »

chf

\version "2.18.2"
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Prove of concept:
% Abuse the breathing-sign as auxiliary-staff-bar
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

#(define (end-repeat-sign-ps my-grob)
  (let*
   ((sz (ly:grob-property my-grob 'font-size 0.0))
    (line-thickness (layout-line-thickness my-grob))
    (hair-thickness (* (ly:grob-property my-grob 'hair-thickness 1.9)
                       line-thickness))
    (thick-thickness (* (ly:grob-property my-grob 'thick-thickness 6.0)
                       line-thickness))
    (kern-width (* (ly:grob-property my-grob 'kern 3.0)
                       line-thickness))
    (dot (ly:font-get-glyph (ly:grob-default-font my-grob) "dots.dot"))
    (dot-y-length (interval-length (ly:stencil-extent dot Y)))
    (mult (magstep sz))
    (r0 (* 0.5 dot-y-length))
    (p0 0.0)
    (p1 (- p0 thick-thickness))
    (p2 (- p1 kern-width))
    (p3 (- p2 hair-thickness))
    (p4 (- p3 (+ kern-width r0)))
    (p5 (- p4 r0))
    (h (* -4.0 mult))
    (h1 (* -1.5 mult))
    (h2 (* -2.5 mult))
   )
   (markup
    #:line
    (#:with-dimensions
     (cons p5 0.0)
     (cons h 0.0)
     (#:postscript
      (string-concatenate
       (list
        " newpath 0 setlinewidth 1 setlinejoin 1 setlinecap \n"
        " " (number->string p0) " 0 moveto \n"
        " " (number->string p0) " " (number->string h) " lineto \n"
        " " (number->string p1) " " (number->string h) " lineto \n"
        " " (number->string p1) " 0 lineto \n"
        " " (number->string p0) " 0 lineto \n"
        " closepath fill \n"
        " " (number->string p2) " 0 moveto \n"
        " " (number->string p2) " " (number->string h) " lineto \n"
        " " (number->string p3) " " (number->string h) " lineto \n"
        " " (number->string p3) " 0 lineto \n"
        " " (number->string p2) " 0 lineto \n"
        " closepath fill \n"
        " " (number->string p4) " " (number->string h1) " " (number->string r0)
        "  0 360 arc closepath fill \n"
        " " (number->string p4) " " (number->string h2) " " (number->string r0)
        "  0 360 arc closepath fill \n"
       )
      )
     )
    )
   )
  )
)

\defineBarLine ".|:-0" #'("" ".|:" ".| ")

Dazwischen = {
  \once \override BreathingSign #'text = #end-repeat-sign-ps
  \breathe
  \once \set Score.doubleRepeatType = ".|:-0"
  \once \override Score.BreakAlignment.break-align-orders = ##((
    ; EOL
    left-edge
    cue-end-clef
    ambitus
    breathing-sign
    clef
    cue-clef
    ; staff-bar
    key-cancellation
    key-signature
    time-signature
    custos
   )(
    ; unbroken
    left-edge
    cue-end-clef
    ambitus
    breathing-sign
    clef
    cue-clef
    key-cancellation
    key-signature
    time-signature
    staff-bar
    custos
   )(
    ; BOL
    left-edge
    ambitus
    ; breathing-sign
    clef
    key-cancellation
    key-signature
    time-signature
    staff-bar
    cue-clef
    custos
  ))
}

\score {
  \new Staff {
    \new Voice {
      \compressFullBarRests
      \override Score.BarNumber.break-visibility = ##(#t #t #t)
      \time 4/4 \key f \major
      \repeat volta 2 { R1*24 \Dazwischen }
      \time 3/4 \key bes \major \noBreak
      \repeat volta 2 { R2.*16 \Dazwischen }
      \time 4/4 \key es \major \break
      \repeat volta 2 { R1*32 }
      % \time 3/4 \key bes \major \noBreak
      % \repeat volta 2 { R2.*16 }
      % \time 4/4 \key es \major \break
      % \repeat volta 2 { R1*32 }
    }
  }
  \layout {
    ragged-right = ##f
    indent = 0 \mm
  }
  \header { piece = \markup { "\\breathe als Hilfstaktstrich mißbraucht" } }
}



Liebe Freunde,

dieser code, auf den ich mich beziehe,  steht im Archiv (August 2016).
kilgore, Arnold und harm haben sich mit dem Problem befasst.
Dort ist zu lesen, dass diese Lösung nur in Einzelstimmen funktioniert. Das kann -muss -ich bestätigen.
Seid ihr inzwischen weiter - ich brauchte eine Lösung für die Partitur...

Da es hier um ein grundsätzliches Problem geht, erspare ich mir ein Spezialbeispiel.

Gruß
chf

Schöne Ostern!


Malte

Zitat von: chf am Mittwoch, 28. März 2018, 19:41
dieser code, auf den ich mich beziehe,  steht im Archiv (August 2016).
Wo genau? Link?
Zitat
Dort ist zu lesen, dass diese Lösung nur in Einzelstimmen funktioniert. Das kann -muss -ich bestätigen.
Wofür denn eine Lösung?
Zitat
Da es hier um ein grundsätzliches Problem geht, erspare ich mir ein Spezialbeispiel.
Ein grundsätzliches Problem scheint mir zu sein, daß deine Posts regelmäßig wichtige Infos nicht enthalten. Zwei Spezialbeispiele siehe oben. Das macht das Helfen leider unmöglich, sorry.

chf

\version "2.18.2"
#(define (end-repeat-sign-ps my-grob)
  (let*
   ((sz (ly:grob-property my-grob 'font-size 0.0))
    (line-thickness (layout-line-thickness my-grob))
    (hair-thickness (* (ly:grob-property my-grob 'hair-thickness 1.9)
                       line-thickness))
    (thick-thickness (* (ly:grob-property my-grob 'thick-thickness 6.0)
                       line-thickness))
    (kern-width (* (ly:grob-property my-grob 'kern 3.0)
                       line-thickness))
    (dot (ly:font-get-glyph (ly:grob-default-font my-grob) "dots.dot"))
    (dot-y-length (interval-length (ly:stencil-extent dot Y)))
    (mult (magstep sz))
    (r0 (* 0.5 dot-y-length))
    (p0 0.0)
    (p1 (- p0 thick-thickness))
    (p2 (- p1 kern-width))
    (p3 (- p2 hair-thickness))
    (p4 (- p3 (+ kern-width r0)))
    (p5 (- p4 r0))
    (h (* -4.0 mult))
    (h1 (* -1.5 mult))
    (h2 (* -2.5 mult))
   )
   (markup
    #:line
    (#:with-dimensions
     (cons p5 0.0)
     (cons h 0.0)
     (#:postscript
      (string-concatenate
       (list
        " newpath 0 setlinewidth 1 setlinejoin 1 setlinecap \n"
        " " (number->string p0) " 0 moveto \n"
        " " (number->string p0) " " (number->string h) " lineto \n"
        " " (number->string p1) " " (number->string h) " lineto \n"
        " " (number->string p1) " 0 lineto \n"
        " " (number->string p0) " 0 lineto \n"
        " closepath fill \n"
        " " (number->string p2) " 0 moveto \n"
        " " (number->string p2) " " (number->string h) " lineto \n"
        " " (number->string p3) " " (number->string h) " lineto \n"
        " " (number->string p3) " 0 lineto \n"
        " " (number->string p2) " 0 lineto \n"
        " closepath fill \n"
        " " (number->string p4) " " (number->string h1) " " (number->string r0)
        "  0 360 arc closepath fill \n"
        " " (number->string p4) " " (number->string h2) " " (number->string r0)
        "  0 360 arc closepath fill \n"
       )
      )
     )
    )
   )
  )
)


\defineBarLine ".|:-0" #'("" ".|:" ".| ")

Dazwischen = {
  \once \override BreathingSign #'text = #end-repeat-sign-ps
  \breathe
  \once \set Score.doubleRepeatType = ".|:-0"
  \once \override Score.BreakAlignment.break-align-orders = ##((
    ; EOL
    left-edge
    cue-end-clef
    ambitus
    breathing-sign
    clef
    cue-clef
    ; staff-bar
    key-cancellation
    key-signature
    time-signature
    custos
   )(
    ; unbroken
    left-edge
    cue-end-clef
    ambitus
    breathing-sign
    clef
    cue-clef
    key-cancellation
    key-signature
    time-signature
    staff-bar
    custos
   )(
    ; BOL
    left-edge
    ambitus
    ; breathing-sign
    clef
    key-cancellation
    key-signature
    time-signature
    staff-bar
    cue-clef
    custos
  ))
}

eins = \relative c'' {
c1 \time 5/4 \repeat volta 2 {c1 c4 \Dazwischen }
\time 4/4 \repeat volta 2 {c1}
}

zwei = \relative c'' {
c1 \time 5/4 \repeat volta 2 {c1 c4 \Dazwischen }
\time 4/4 \repeat volta 2 {c1}
}

drei = \relative c'' {
c1 \time 5/4 \repeat volta 2 {c1 c4 \Dazwischen }
\time 4/4 \repeat volta 2 {c1}


\new StaffGroup
  <<
    \new Staff = "eins" \new Voice  << \eins >>
    \new Staff = "zwei" \new Voice  << \zwei >>
    \new Staff = "drei" \new Voice  << \drei >>
  >>


ZitatWo genau?

...genau unter diesem Titel...

Aber nichtsdestotrotz:
https://archiv.lilypondforum.de/index.php/topic,2334.msg13090.html#msg13090

Jetzt doch mit Spezialbeispiel...

Arnold

Hallo Christa,

meine »zuletzt angewandte« Methode (nur für den Fall, daß die Position mit der eines normalen Takstrichs zusammenfällt) war:

  • in allen Stimmen einen »falschen Auftakt« mit einem Skip (s4) einzufügen
  • über linear-spacing-Einstellung versuchen, daß dieser Einschub nicht (zu stark) gedehnt wird - leider habe ich keinen Weg gefunden, das Dehnen ganz zu unterbinden
  • ein paar \noBreak habe ich noch eingefügt
  • außerdem habe ich diesen »Einschub« mit einem Tag versehen, damit ich ihn bei einer MIDI-Ausgabe unterdrücken kann.

Details muß ich erst noch heraussuchen - das dauert leider bis nach Ostern.

Arnold

harm6

Hier ein Gedanke zum Thema:
Sowohl BarLine als auch SpanBar werden gespiegelt und dieses Duplikat ans Ende verschoben. Der stencil-extent bleibt. Das spacing wird mittels space-alists eingeregelt.
Allerdings muß der Verschiebewert manuell eingfügt werden. Ein midi mit unfoldRepeats klappt natürlich nicht. Der BarLine-Typ sollte manuel eingefügt werden.


\version "2.19.65"

barLineFirst =
\once \override Score.BreakAlignment.break-align-orders =
  #(make-vector 3
    '(left-edge
       cue-end-clef
       ambitus
       breathing-sign
       staff-bar
       clef
       cue-clef
       key-cancellation
       key-signature
       time-signature
       custos)) 

#(define (add-mirrored-stil move-value)
  (lambda (grob)
    (let* ((stil-proc
             (assoc-get 'stencil (reverse (ly:grob-basic-properties grob))))
           (stil (stil-proc grob)))
      (if (zero? (ly:item-break-dir grob))
          (let* ((stil-x-ext (ly:stencil-extent stil X))
                 (stil-y-ext (ly:stencil-extent stil Y)))
           
            (ly:make-stencil
              (ly:stencil-expr
                (ly:stencil-add
                  stil
                  (ly:stencil-translate-axis
                    (ly:stencil-scale stil -1 1)
                    move-value
                    X)))
              stil-x-ext
              stil-y-ext))
           stil))))

adjustSpaceAlists = {
  \once \override Staff.TimeSignature.space-alist.first-note =
    #'(fixed-space . 3.5)
  \once \override Staff.KeySignature.space-alist.first-note =
    #'(fixed-space . 3.5)
  \once \override Staff.KeyCancellation.space-alist.first-note =
    #'(fixed-space . 3.5)
}

mus = {
  \key c \minor
  c''1
  \once \override Staff.BarLine.stencil = #(add-mirrored-stil 15.5)
  \once \override Score.SpanBar.stencil = #(add-mirrored-stil 15.5)
  \adjustSpaceAlists
  \barLineFirst
  \clef alto
  \time 6/4
  \key d \major
  \bar ":|."
  d''1.
}

musI = {
  \key c \minor
  c''1
  \once \override Staff.BarLine.stencil = #(add-mirrored-stil 12)
  \once \override Score.SpanBar.stencil = #(add-mirrored-stil 12)
  \adjustSpaceAlists
  \time 6/4
  \key d \major
  \bar ":|."
  d''1.
}

musII = {
  \key c \minor
  c''1
  \once \override Staff.BarLine.stencil = #(add-mirrored-stil 9.25)
  \once \override Score.SpanBar.stencil = #(add-mirrored-stil 9.25)
  \adjustSpaceAlists
  \key d \major
  \bar ":|."
  d''1
}

musIII = {
  \key c \minor
  c''1
  \once \override Staff.BarLine.stencil = #(add-mirrored-stil 6.5)
  \once \override Score.SpanBar.stencil = #(add-mirrored-stil 6.5)
  \adjustSpaceAlists
  \key c \major
  \bar ":|."
  d''1
}

\new StaffGroup
  <<
    \new Staff \mus
    \new Staff \mus
  >>

\new StaffGroup
  <<
    \new Staff \musI
    \new Staff \musI
  >>
 
\new StaffGroup
  <<
    \new Staff \musII
    \new Staff \musII
  >>
 
\new StaffGroup
  <<
    \new Staff \musIII
    \new Staff \musIII
  >>


Wie gesagt, nur ein Gedanke, kann man vielleicht weiter ausbauen.


Gruß,
  Harm

chf

Hallo Harm,

vielen Dank! Mir genügt es so...
Den Wert von \adjustSpaceAlists etwas geändert, die Position von (in meinem Fall) TimeSignature ein wenig justiert, und alles ist prima!
Und funktioniert auch in version 2.18.2 !

Schöne Feiertage
Christa


Arnold

Hallo zusammen,

und nun noch mein Beispiel mit »eingeschobenem Auftakt« (den man mittels Tag für die MIDI-Ausgabe herausfiltern könnte).

\version "2.18.2"
% auch "2.19.80"

%{
  Würde man den Zeilenumbruch auf den zweiten Taktstrich des Paares legen,
  dann müßte man die besondere Wiederholungstaktstrichdefinitionen verwenden:
\defineBarLine ".|:-0"  #'("" ".|:" ".| ")
\defineBarLine "S.|:-0" #'("" "S.|:" " .| ")
  Und zum Abschluß (nach dem Skip) angeben:
\once \set Score.startRepeatType = ".|:-0"
\once \set Score.startRepeatSegnoType = "S.|:-0"

In 2.19.80 ist der Dehn-Effekt gegenüber der 2.18.2 kaum noch erkennbar!
Nur wage ich noch nicht zu sagen, ob das ein neues Feature oder vielleicht ein Bug ist.
%}

#(define ((reduce-X-extent-right-except-eol dist info) grob)
  (let ((ausdehnung (ly:grob-property grob 'X-extent))
        (causa (ly:grob-property grob 'cause))
        (break-dir (ly:item-break-dir grob)))
   (if info (begin
     (for-each display (list "\n grob = " grob "\n break-dir = " break-dir "\n"))
     (if (ly:prob? causa)
      (for-each display (list " origin = " (ly:prob-property causa 'origin) "\n")))
     (for-each display (list " X-extent alt = (" (ly:number->string (car ausdehnung)) " . " (ly:number->string (cdr ausdehnung)) ")\n"))))
   (if (>= break-dir 0)
    (if (> (- (cdr ausdehnung) dist) (car ausdehnung))
     (ly:grob-set-property! grob 'X-extent (cons (car ausdehnung) (- (cdr ausdehnung) dist)))
     (begin
      (ly:grob-set-property! grob 'X-extent (cons (car ausdehnung) (car ausdehnung)))
      (display "\n   Ausdehnung auf Null-Breite geaendert, wäre sonst negativ.\n"))))
   (if info (let ((ausd (ly:grob-property grob 'X-extent)))
     (for-each display (list " X-extent neu = (" (ly:number->string (car ausd)) " . " (ly:number->string (cdr ausd)) ")\n"))))))


GlobalSettingsInVoice = {
  \override Score.BarNumber.break-visibility = #end-of-line-invisible
  \set Score.barNumberVisibility = #all-bar-numbers-visible
  \compressFullBarRests
}

StartInsertForTimeSignatureAtBarlinePos = {
  \set Timing.measurePosition = #(ly:make-moment -1/64) % (1)
  \once \override Score.BarNumber.break-visibility = #all-invisible
  \once \set Score.proportionalNotationDuration = #(ly:make-moment 20/1)
  \once \override Staff.TimeSignature.before-line-breaking = #(reduce-X-extent-right-except-eol 1.5 #f) % (2)
  % Anmerkung (1): quasi: \partial 64 - aber ab 2.19.x käme eine anderer Taktzahl heraus.
  % Anmerkung (2): eigentlich müßten statt dessen andere Breiten oder Gaps reduziert werden.
}

CompleteInsertAtBarlinePos = {
  s64
  \noBreak
}

Mus = {
  \time 2/4
  \partial 4
  g'4
  \repeat volta 2 {
    \GlobalSettingsInVoice
    c''2
  }
  \StartInsertForTimeSignatureAtBarlinePos
  \tag #'test-break \break
  \time 6/8
  \CompleteInsertAtBarlinePos
  % \inStaffSegno
  \repeat volta 2 {
    \GlobalSettingsInVoice
    R2.*2
  }
}

Pair = \new StaffGroup <<
  \new Staff {
    \Mus
  }
  \new Staff {
    \Mus
  }
>>

\score {
  \removeWithTag #'test-break \Pair
  \layout { ragged-right = ##t }
  \header { piece = "ohne Zeilenumbruch; ungedehnt" }
}

\score {
  \Pair
  \layout { ragged-right = ##t }
  \header { piece = \markup \column {
    "Zeilenumbruch ergibt Probleme bei Taktzahlendarstellung (nur) zu Anfang der Zeile"
    "ungedeht" }}
}

\score {
  \removeWithTag #'test-break \Pair
  \layout { ragged-right = ##f }
  \header { piece = "ohne Zeilenumbruch, atypisch stark gedehnt" }
}

\score {
  \Pair
  \layout { ragged-right = ##f }
  \header { piece = \markup \column {
     "Zeilenumbruch ergibt Probleme bei Taktzahlendarstellung (nur) zu Anfang der Zeile"
     "atypisch stark gedehnt" }}
}

Und noch einmal die »kritischen Anmerkungen« dazu, die auch im Quelltext stehen:

  • Das reduzieren der Ausgehnung der TimeSignature ist eigentlich nur ein Workaround, aber ich habe bisher nicht gefunden, welche Breiten und Gaps stattdessen wie abzuändern wären.
  • Taktzahl (immer) nur am Anfang der Zeile anzeigen - erschien dann eingeklammert, darum habe ich diese eine ganz entfernt.
  • \partial in Version 2.19.80 zählt die Takte anders, deshalb wurde \set Timing.measurePosition benutzt.
  • In 2.19.80 ist der Dehn-Effekt gegenüber der 2.18.2 kaum noch erkennbar!
    Nur wage ich noch nicht zu sagen, ob das ein neues Feature oder vielleicht ein Bug ist.

Mit freundlichen Grüßen,

Arnold