Deutsches Lilypond Forum (Archiv)

Allgemein => Fragen zu Funktionen => Thema gestartet von: Arnold am Dienstag, 16. August 2016, 09:57

Titel: Schlüssel, Tonart und Takt 'in der Mitte' des Wiederholungszeichens
Beitrag von: Arnold am Dienstag, 16. August 2016, 09:57
Hallo,

Nach Elaine Gould ist die Position von Schlüssel, Tonart und Takt gegenüber den Wiederholungszeichen stark kontextabhängig, z. Bsp. »zwischen Wiederholungsende- und Wiederholungsanfangszeichen« wie in Beispiel Nr. 1.
Mein erster Ansatz für den "Dazwischen-Fall" war, zwei sehr kurze Skips zwischen \cadenzaOn und \cadenzaOff einzufügen und zwischen diesen beiden die Schlüssel- Tonart- oder Taktwechsel, doch einerseits werden diese Skips im "Grob-Federwerk" viel zu sehr gedehnt, und dann gibt es noch Ärger mit den Ganztakt- und Mehrtaktpausen.
Diese Mikro-Skips habe ich gewählt, daß auch in der Midi-Aausgabe nicht viel passiert, falls ich vergesse diese Abschnitte wieder herauszufiltern.
Nach einigem Probieren habe ich immerhin durch ProportionalNotationDuration (und nur noch einem Skip) halbwegs brauchbare Ergebnisse erzielt - mit \partial am Taktstrich und mit \cadenaOn und \cadenzaOff in der Mitte des Taktes.
\version "2.18.2"
\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 }
      \cadenzaOn
      \time 3/4 \key bes \major
      s128*1/1024
      \cadenzaOff
      \repeat volta 2 { R2.*16 }
    }
  }
  \layout {
    ragged-right = ##f
    indent = 0 \mm
  }
  \header { piece = \markup { "mit" \italic "\\cadenzaOn" "und" \italic "\\cadenzaOff" "am Taktende" } }
}

\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 }
      \partial 128*1/1024
      \time 3/4 \key bes \major
      s128*1/1024
      \repeat volta 2 { R2.*16 }
    }
  }
  \layout {
    ragged-right = ##f
    indent = 0 \mm
  }
  \header { piece = \markup { "mit" \italic "\\partial" "– nicht praktikabel, wenn die Wiederholungszeichen in der Mitte eines Taktes stehen" } }
}

\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 }
      \grace {
        \time 3/4 \key bes \major
        s128*1/1024
      }
      \repeat volta 2 { R2.*16 }
    }
  }
  \layout {
    ragged-right = ##f
    indent = 0 \mm
  }
  \header { piece = \markup { "mit" \italic "\\grace" "wären Vorschlagsnoten zu Anfang der zweiten Wiederholung nicht mehr zu handhaben" } }
}

\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 }
      \set Score.proportionalNotationDuration = #(ly:make-moment 1/80)
      \partial 128*1/1024
      \time 3/4 \key bes \major
      s128*1/1024
      \unset Score.proportionalNotationDuration
      \repeat volta 2 { R2.*16 }
    }
  }
  \layout {
    ragged-right = ##f
    indent = 0 \mm
  }
  \header { piece = \markup { "mit" \italic "\\partial" "und" \italic "ProportionalNotationDuration" "(am Taktstrich)" } }
}

%{
\score {
  \new Staff {
    \new Voice {
      \compressFullBarRests
      \override Score.BarNumber.break-visibility = ##(#t #t #t)
      \time 4/4 \key f \major
      \repeat volta 2 { R1*23 c'2.. e'16[ g'] }
      \set Score.proportionalNotationDuration = #(ly:make-moment 1/20)
      \partial 128*1/1024
      \time 3/4 \key bes \major
      s128*1/1024
      \unset Score.proportionalNotationDuration
      \repeat volta 2 { R2.*15 c'2 ~ c'8 e'16 g' }
    }
  }
  \layout {
    ragged-right = ##f
    indent = 0 \mm
  }
  \header { piece = \markup { "mit" \italic "\\partial" "und" \italic "ProportionalNotationDuration" "(am Taktstrich)" } }
}

\score {
  \new Staff {
    \new Voice {
      \compressFullBarRests
      \override Score.BarNumber.break-visibility = ##(#t #t #t)
      \time 4/4 \key f \major
      \repeat volta 2 { R1*22 \repeat unfold 2 { c'2.. e'16[ g'] } }
      \set Score.proportionalNotationDuration = #(ly:make-moment 1/20)
      \partial 128*1/1024
      \time 3/4 \key bes \major
      s128*1/1024
      \unset Score.proportionalNotationDuration
      \repeat volta 2 { R2.*14 \repeat unfold 2 { c'2 ~ c'8 e'16 g' }  }
    }
  }
  \layout {
    ragged-right = ##f
    indent = 0 \mm
  }
  \header { piece = \markup { "mit" \italic "\\partial" "und" \italic "ProportionalNotationDuration" "(am Taktstrich)" } }
}
%}

\score {
  \new Staff {
    \new Voice {
      \compressFullBarRests
      \override Score.BarNumber.break-visibility = ##(#t #t #t)
      \time 4/4 \key f \major
      \partial 4
      \repeat volta 2 { r4 R1*23 r2 r4 }
      \set Score.proportionalNotationDuration = #(ly:make-moment 1/80)
      \cadenzaOn
      \key bes \major
      s128*1/1024
      \cadenzaOff
      \unset Score.proportionalNotationDuration
      \repeat volta 2 { r4 R1*15 r2 r4}
    }
  }
  \layout {
    ragged-right = ##f
    indent = 0 \mm
  }
  \header { piece = \markup { "mit" \italic "\\cadenzaOn" und \italic "\\cadenzaOff" "innnerhalb des Takts, sowie mit" \italic "ProportionalNotationDuration" } }
}
Dennoch:
Hat jemand noch bessere Vorschläge oder Lösungen?

Arnold
Titel: Re: Schlüssel, Tonart und Takt 'in der Mitte' des Wiederholungszeichens
Beitrag von: kilgore am Donnerstag, 18. August 2016, 11:20
Hallo Arnold,

Ich finde zunächst die Default-Ausgabe von Lilypond gar nicht so verkehrt:

\version "2.18.2"


\relative c' {
  \key f \major
  \compressFullBarRests
  \repeat volta 2 {  R1*24 }
  \time 3/4
  \key bes \major
  \repeat volta 2 { R2.*16 }
 
}

Das Beispiel von Gould auf Seite 234 sieht für mich dagegen etwas seltsam aus, auch wenn sie es für richtig hält. Trotzdem, habe dein erstes Beispiel geändert, allerdings nur "quick and dirty", aber es sieht dann so aus wie bei Gould:

\version "2.18.2"

\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 }
      \cadenzaOn
      \time 3/4 \key bes \major
      s128*1/1024
      \cadenzaOff
      \once \override Score.BarLine.extra-offset = #'( -25 . 0 )
      \repeat volta 2 { R2.*16 }
    }
  }
  \layout {
    ragged-right = ##f
    indent = 0 \mm
  }
  \header { piece = \markup { "mit" \italic "\\cadenzaOn" "und" \italic "\\cadenzaOff" "am Taktende" \italic "und \override Score.BarLine.extra-offset " } }
}

Ich hoffe das hilft, wenn auch nur ein bisschen!

Gruß
kil
Titel: Re: Schlüssel, Tonart und Takt 'in der Mitte' des Wiederholungszeichens
Beitrag von: fugenkomponist am Donnerstag, 18. August 2016, 13:14
Ich mißtraue Lösungen mit extra-offset ehrlich gesagt ein bisschen, weil da meistens das automatische Spacing dran kaputtgeht. Nicht immer schlimm und sichtbar, aber mit X/Y-offset, X/Y-extent und extra-spacing-width/height lässt sich auch einiges machen ;)
\version "2.18.2"

\score {
  \new Staff {
    \new Voice {
      \compressFullBarRests
      \time 4/4 \key f \major
      \repeat volta 2 { R1*24 }
      \cadenzaOn
      \time 3/4 \key bes \major
      \once \override Staff.TimeSignature.extra-spacing-width = #'(0 . -inf.0)
      \once \override Staff.KeySignature. extra-spacing-width = #'(0 . -inf.0)
      \once \override NoteColumn.X-offset = -5
      \once \hideNotes
      r128
      \bar ".|:"
      \cadenzaOff
      \repeat volta 2 { R2.*16 }
    }
  }
  \layout {
    system-count = 1
  }
}
Ich füge hier eine (unsichtbare) 128stel-Pause ein und schiebe die in die Tonart- und Taktartangabe rein (dafür muss ich deren spacing nach rechts aufweichen). Aus irgendeinem Grund ist der \bar-Befehl nötig; die Mehrtaktpause rechnet sonst anscheinend damit, dass der Taktstrich weiter links steht …

Perfekt ist das auch nicht, aber vielleicht hilfts ;)
Titel: Re: Schlüssel, Tonart und Takt 'in der Mitte' des Wiederholungszeichens
Beitrag von: Arnold am Freitag, 19. August 2016, 09:11
Hallo,

da all das letztlich nur Workarounds sind, habe ich mir überlegt, in welche (zu erweiternde) Lilypond-Logik das hineinpassen könnte:
Wenn alle Varianten mit einem entsprechenden \once \override Score.BreakAlignment.break-align-orders = ... abgedeckt werden könnten, fände ich es ideal. Derzeit sollte alles außer den »zwei Taktstrichen mit etwas dazwischen« möglich sein.
Doch, warum sollte es in Zukunt nicht möglich sein, zwei Barline-Grobs zu einer logischen Barline zu erzeugen? Dazu könnte die Liste für den middle-of-staff-Wert in break-align-orders-Vektor etwa so aussehen:
»'(span-bar breathing-sign end-of-line-staff-bar key clef time-signature start-of-line-staff-bar)«.

Erkennt ihr noch weitere Handicaps?

Tivial wäre eine solche Erweiterung sicherlich nicht, allenfalls im Vergleich zum wohlbekannten Issue 34.

Übrigens, beim Musizieren aus Einzelstimmen bevorzuge ich sehr wohl die Beispiele von Elaine Gould (zumindest bei handgeschriebenen Noten - oder ich gebe mir alle Mühe, diese an einen Zeilenumbruch zu platzieren).

Arnold
Titel: Re: Schlüssel, Tonart und Takt 'in der Mitte' des Wiederholungszeichens
Beitrag von: Arnold am Montag, 22. August 2016, 09:00
Hallo,

und jetzt habe ich noch einen weiteren Workaround gefunden, aber nur für Einzelstimmen. Genauer gesagt fehlt in StaffGroup oder GrandStaff der BarLine-Spanner wenn ich das BreathingSign umfunktioniere.
\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" } }
}

Arnold
Titel: Re: Schlüssel, Tonart und Takt 'in der Mitte' des Wiederholungszeichens
Beitrag von: harm6 am Montag, 22. August 2016, 09:47
Hallo Arnold,

leider habe ich im Moment zu wenig Zeit mich in ein weiteres komplexes coding zu stürzen.
Aber meine Idee ist BreakAlignGroup anzugehen ähnlich wie ich es hier (http://lsr.di.unimi.it/LSR/Item?id=1032) gemacht habe.
D.h. die 'elements auslesen und die relevanten stencils neu zu konfigurieren, den zusätzlichen BarLine-stencil gespiegelt am Schluß.

Allerdings wäre auch dann
Zitat
Genauer gesagt fehlt in StaffGroup oder GrandStaff der BarLine-Spanner
das Hauptproblem ...

Gruß,
  Harm