Veranschaulichung rythmischer Überlagerungen

Begonnen von ValidUserName, Dienstag, 3. April 2018, 00:34

« vorheriges - nächstes »

ValidUserName

Moin,

mal was für Bastler:
Ausgehend von etwas in dieser Art (genaue Taktart und Art der Tuplets kann variieren):

\version "2.19.81"

\score {
  <<
  \new RhythmicStaff{ \time 2/4
    \voiceOne
    \tuplet 3/2{
      \tuplet 3/4 {16[ 16 16]}
      \tuplet 3/4 {16[ 16 16]}
      \tuplet 3/4 {16[ 16 16]}
    }                     
  }
  \new RhythmicStaff{ \time 2/4
    \voiceTwo
    \tuplet 7/4 1 {8 8 8 8 8 8 8}               
                     
  }
  >>
}


Um die rythmischen Zusammenhänge näher zu beleuchten, würde ich gerne in der Mitte eine metrische Skala einbauen, ähnlich wie man es zum Beispiel hier sehen kann, nur eben deutlich ausgeklügelter. Das ganze sollte am Ende ungefähr so aussehen:

Fällt dazu jemandem etwas ein, wie man etwas derartiges direkt in Lilypond produzieren könnte, oder bleibt mir nur der Weg über eine graphische Nachbearbeitung via Inkscape o.ä.?

Manuela

Das geht sicher automatisch.

Auf die Schnelle fällt mir dazu folgendes ein:

\version "2.19.48"

\score {
  <<
  \new RhythmicStaff{ \time 2/4
    \voiceOne
    \tuplet 3/2{
      \tuplet 3/4 {16[ 16 16]}
      \tuplet 3/4 {16[ 16 16]}
      \tuplet 3/4 {16[ 16 16]}
    }                     
  }
  \new RhythmicStaff{
  %\hide NoteHead
\override NoteHead.stencil = #ly:text-interface::print
\override NoteHead.text = #(markup #:musicglyph "scripts.stopped")
  \hide Stem
  \set Score.proportionalNotationDuration = #(ly:make-moment 1/16)
  c4*1/21 \repeat unfold 41 c
  }
  \new RhythmicStaff{
    \voiceTwo
    \tuplet 7/4 1 {8 8 8 8 8 8 8}               
                     
  }
  >>
}


Die Notenköpfe des mittleren Staffs müsste man noch durch Striche unterschiedlicher Länge ersetzen.
Danke für eure Hilfe
viele Grüße
-- Manuela

ValidUserName

#2
Nagut, um das mal ein bischen weiter zu spinnen:
  \override Staff.BarLine.stencil = ##f
  \override Staff.StaffSymbol.stencil = ##f
  \override Staff.TimeSignature.stencil = ##f

sollten mit rein, um überflüssig Komponenten zu unterdrücken.
Die Notenköpfe sind im Moment Kreuze bzw. Pluszeichen, wenn man daraus einfache senkrechte Linien (vartiabler Länge?) machen könnte, wäre das schon ein gewaltiger Schritt weiter.
Leider verstehe ich noch nicht so ganz, was ganau diese beiden Zeilen im Detail machen (bzw. ganz konkret warum dabei dann Pluszeichen rauskommen, habe aber auch noch nicht hinterhergesuchmaschient):
\override NoteHead.stencil = #ly:text-interface::print
\override NoteHead.text = #(markup #:musicglyph "scripts.stopped")

Die längeren Verbindungslinien könnte man eventuell auch einfach durch die Notenhälse darstellen lassen, nach ein bischen Positions-, Längen-, Abstands- und Schriftdickeanpasung.
Zunächst einmal erscheinen mir aber diese Zeilen noch etwas kryptisch, bzw. die Zahlenwerte nicht stimmig:
  \set Score.proportionalNotationDuration = #(ly:make-moment 1/16)
  c4*1/21 \repeat unfold 41 c

Bei meinem Beispiel 9-gegen-7 müssten bei korrekter Unterteilung ja kgV(7,9) = 7·9 = 63 Unterteilungseinheiten dabei rauskommen.
Nach dem Herumspielen mit einigen Werten habe ich außerdem den Verdacht, dass man hier sehr schnell einen Mindestabstand erreicht, unterhalb dessen Lilypond keine Noten setzen mag. Der müsste also auch noch modifiziert werden.

Manuela

Meinen Ansatz bitte nur als Idee zu nehmen, die genaue Ausarbeitung (Zahlenwerte, Notenköpfe als senkrechte Striche etc.) ist nicht enthalten.

Mehr zur Notenverteilung findest du hier:
Proportionale Notation
Es feht wahrscheinlich noch folgende Anweisung
\override Score.SpacingSpanner.uniform-stretching = ##t

Momentan habe ich leider nicht viel Zeit, um mich mit Lilypond zu beschäftigen.
Danke für eure Hilfe
viele Grüße
-- Manuela

Malte

Zitat von: ValidUserName am Mittwoch,  4. April 2018, 05:31
Die Notenköpfe sind im Moment Kreuze bzw. Pluszeichen, wenn man daraus einfache senkrechte Linien (vartiabler Länge?) machen könnte, wäre das schon ein gewaltiger Schritt weiter.

Zitat
Nach dem Herumspielen mit einigen Werten habe ich außerdem den Verdacht, dass man hier sehr schnell einen Mindestabstand erreicht, unterhalb dessen Lilypond keine Noten setzen mag. Der müsste also auch noch modifiziert werden.

Beide Probleme geht der folgende Code an:
\version "2.19.81"

\score {
  <<
    \new RhythmicStaff{
      \time 2/4
      \voiceOne
      \tuplet 3/2{
        \tuplet 3/4 {16[ 16 16]}
        \tuplet 3/4 {16[ 16 16]}
        \tuplet 3/4 {16[ 16 16]}
      }
    }
    \new RhythmicStaff \with {
      \omit StaffSymbol
      \omit TimeSignature
      \omit BarLine
    } {
      \override NoteHead.stencil = #ly:text-interface::print
      \override NoteHead.text = \markup \vcenter \draw-line #'(0 . 1)
      \override NoteHead.extra-spacing-width = #'(-inf.0 . -inf.0)
      \omit Stem
      \set Score.proportionalNotationDuration = #(ly:make-moment 1/1)
      \repeat unfold 63 c2*1/63
    }
    \new RhythmicStaff{
      \time 2/4
      \voiceTwo
      \tuplet 7/4 1 {8 8 8 8 8 8 8}

    }
  >>
}

Wie dicht dann im Endeffekt gesetzt wird, hängt jetzt nicht mehr von der Breite der ,,Notenköpfe" im mittleren System ab, sondern von der Zeile
      \set Score.proportionalNotationDuration = #(ly:make-moment 1/1)

harm6

#5
@Malte
\override NoteHead.extra-spacing-width = #'(-inf.0 . -inf.0)
führt zu Warnungen so weit das Auge reicht ...

Basierend auf deinem Code, hier mein Versuch. Ich habe das nicht noch enger hingekriegt, aber ist das denn auch sinnvoll? Das könnte dann doch niemand mehr gut lesen.


\version "2.19.81"

\paper { indent = 0 }

#(define calc-x-off-for-point-stencils
  (lambda (grob)
    (let* ((nhds-array (ly:grob-object grob 'note-heads))
           (nhds-list
             (if (ly:grob-array? nhds-array)
                 (ly:grob-array->list nhds-array)
                 '())))
    ;; Calculate stencil of first NoteHead from `nhds-list'
    ;; To compensate point-stencil-NoteHead move the NoteColumn by
    ;; half of its cdr
    ;; TODO safe?
    (if (pair? nhds-list)
        (ly:grob-set-property! grob 'X-offset
          (/
             (cdr
               (ly:stencil-extent (ly:note-head::print (car nhds-list)) X))
             2)))
    (for-each
      (lambda (nh)
        (ly:grob-set-property! nh 'stencil point-stencil))
      nhds-list))))

\layout {
  \context {
    \StaffGroup
    \consists #Span_stem_engraver
  }
  \context {
    \Score
    proportionalNotationDuration = #(ly:make-moment 1)
  }
}

middleLayout =
  \with {
      \omit StaffSymbol
      \omit TimeSignature
      \override NoteColumn.before-line-breaking =
      #calc-x-off-for-point-stencils
      \override NoteHead.stem-attachment = #'(0 . 0)
      \autoBeamOff
  }
 
someOverrides = {
  \override NoteHead.stem-attachment = #'(0 . 0)
  \omit Beam
  \omit TupletBracket
  \omit TupletNumber
}

upMusic = {
    \time 2/4
    \tuplet 3/2{
      \tuplet 3/4 {16[ 16 16]}
      \tuplet 3/4 {16[ 16 16]}
      \tuplet 3/4 {16[ 16 16]}
    }
  }
 
downMusic = {
      \time 2/4
      \tuplet 7/4 1 { 8 8 8 8 8 8 8 }
    }
   
middleMusic = \crossStaff \repeat unfold 63 c8*4*1/63

\score {
  \new StaffGroup
  <<
    \new RhythmicStaff
    <<
      \upMusic
      \\
      { \someOverrides \upMusic }
    >>
   
    \new RhythmicStaff \with \middleLayout
    <<
      \middleMusic
      \\
      \middleMusic
    >>
   
    \new RhythmicStaff
    <<
      { \someOverrides \downMusic }
      \\
      \downMusic
      >>
  >>
}


Gruß,
  Harm

EDIT
- kleine Code-Korrektur
- Bild angehängt

ValidUserName

harms Version sieht auf den ersten Blick schon toll aus, werde mir das später mal ganauer ansehen.
Es sei angemerkt, dass diese Notationsbeispiele rein didaktischer Natur sind und daher Lesbarkeit oder Layout im herkömmlichen Sinne eher sekundär sind. Vom spacing her plane ich nur einen einzelnen Takt, oder vielleicht zwei, die dann gerne die gesamte Zeilenbreite ausfüllen dürfen, allzu enge Abstände sind also gar nicht nötig (außer vielleicht bei völlig realitätsfernen Varianten wie, sagen wir mal, 17 gegen 29).

Malte

Zitat
\override NoteHead.extra-spacing-width = #'(-inf.0 . -inf.0)
führt zu Warnungen so weit das Auge reicht ...
Ups ... Ach, egal, schmeiß ich ein ly:expect-warning drauf und gut ist. Ok, zugegeben, das ist vielleicht nicht die eleganteste Lösung ;)

Zitat von: ValidUserName am Mittwoch,  4. April 2018, 16:40
harms Version sieht auf den ersten Blick schon toll aus, werde mir das später mal ganauer ansehen.
Ich denke, hier könnte man evtl. die Striche noch kürzer machen und wenn man genau hinschaut, sieht man, daß da immer zwei Striche mit abgerundeten Enden übereinanderstehen. Das ginge sicher noch schöner, aber ich stimme dir zu, das ist auf jeden Fall ne sehr gute Grundlage.
Zitat
Es sei angemerkt, dass diese Notationsbeispiele rein didaktischer Natur sind und daher Lesbarkeit oder Layout im herkömmlichen Sinne eher sekundär sind.
Gerade dann ist Lesbarkeit wichtig! Die dem Schüler zu vermittelnde Information sollte möglichst klar erkennbar sein, sonst lenkt die Schwierigkeit beim Lesen vom eigentlichen Thema ab. Deshalb z. B. auch mein Vorschlag, die Striche kürzer zu machen ;)

harm6

Zitat von: Malte
Ach, egal, schmeiß ich ein ly:expect-warning drauf und gut ist.
Ich hab mir mal den Spaß gemacht nachzuzählen.

Für Deinen Code so wie gepostet gibts
5859 mal "ignoring weird minimum distance"
1953 mal "infinite rod"
62 mal "insane spring min_distance requested, ignoring it"

Kann man natürlich abstellen, mit:

#(for-each
   (lambda (i) (ly:expect-warning "ignoring weird minimum distance"))
   (iota 5859))
#(for-each
   (lambda (i) (ly:expect-warning "infinite rod"))
   (iota 1953))
#(for-each
   (lambda (i) (ly:expect-warning "insane spring min_distance requested, ignoring it"))
   (iota 62))


;D

Zitat
Ich denke, hier könnte man evtl. die Striche noch kürzer machen und wenn man genau hinschaut, sieht man, daß da immer zwei Striche mit abgerundeten Enden übereinanderstehen.
Alles richtig.
Die Striche sind Stems. Nun werden Stems mittels rounded-box erstellt, wobei der blot-diameter das Ausmaß der Rundung mitbestimmt, falls ich das richtig verstanden habe.

Also blot-diameter for Stems auf null setzen sowie die Länge kürzen. Führt zu:

Zitat
\layout {
  \context {
    \StaffGroup
    \consists #Span_stem_engraver
  }
  \context {
    \Score
    proportionalNotationDuration = #(ly:make-moment 1)
    \override Stem.stencil =
    #(lambda (grob)
      (ly:output-def-set-variable! (ly:grob-layout grob) 'blot-diameter 0)
        (ly:stem::print grob))

  }
}

middleLayout =
  \with {
      \omit StaffSymbol
      \omit TimeSignature
      \override NoteColumn.before-line-breaking =
      #calc-x-off-for-point-stencils
      \override Stem.length = 1
      \override NoteHead.stem-attachment = #'(0 . 0)
      \autoBeamOff
  }


Gruß,
  Harm

ValidUserName

Zitat von: Malte am Mittwoch,  4. April 2018, 17:21
Zitat
\override NoteHead.extra-spacing-width = #'(-inf.0 . -inf.0)
führt zu Warnungen so weit das Auge reicht ...
Ups ... Ach, egal, schmeiß ich ein ly:expect-warning drauf und gut ist. Ok, zugegeben, das ist vielleicht nicht die eleganteste Lösung ;)

Zitat von: ValidUserName am Mittwoch,  4. April 2018, 16:40
harms Version sieht auf den ersten Blick schon toll aus, werde mir das später mal ganauer ansehen.
Ich denke, hier könnte man evtl. die Striche noch kürzer machen und wenn man genau hinschaut, sieht man, daß da immer zwei Striche mit abgerundeten Enden übereinanderstehen. Das ginge sicher noch schöner, aber ich stimme dir zu, das ist auf jeden Fall ne sehr gute Grundlage.
Zitat
Es sei angemerkt, dass diese Notationsbeispiele rein didaktischer Natur sind und daher Lesbarkeit oder Layout im herkömmlichen Sinne eher sekundär sind.
Gerade dann ist Lesbarkeit wichtig! Die dem Schüler zu vermittelnde Information sollte möglichst klar erkennbar sein, sonst lenkt die Schwierigkeit beim Lesen vom eigentlichen Thema ab. Deshalb z. B. auch mein Vorschlag, die Striche kürzer zu machen ;)
Ja, Striche kürzer, kleine whitespace zwischen Verbindungsstrich und Notenkopf, 'n Bischen Rumexperimentieren mit Strichausrichtuing links oder mittig zum Notenkopf, deutlich weiteres horizontales Spacing, vielleicht dafür vertikale Abstände noch ein bischen reduzieren, eventuell noch ein paar Zählzeiten als Markup mit reinschreiben... Aber die Basis stimmt auf jeden Fall schon mal...

ValidUserName

Irgend eine Idee, warum am Ende der Tuplets in der kombinierten Stimme ein extra Spacing auftritt? Bei proportionaler Notation sollte doch eigendlich genau das nicht passieren.
\version "2.19.81"

%================================================================================
%variable part:
%==============
BarsShown = 2

upRhythm = {
    \time 3/4
    \repeat unfold \BarsShown {
      \tuplet 3/2 {8[ 8 8]}
      \tuplet 3/2 {8[ 8 8]}
      \tuplet 3/2 {8[ 8 8]}
    }
  }

downRhythm = {
    \time 3/4
    \repeat unfold \BarsShown { 16[ 16 16 16] 16[ 16 16 16] 16[ 16 16 16] }
  }
   
middleUpTimescale = {
   \crossStaff \repeat unfold \BarsShown {
    %\repeat unfold 63 c8*4/63
    \repeat unfold 3{
    4*1/12 c c c
    c_\markup{\center-align \lower #2 1} c c c
    c_\markup{\center-align \lower #2 -1} c c c
    }
   }
}

middleDownTimescale = {
   \crossStaff \repeat unfold \BarsShown {
    %\repeat unfold 63 c8*4/63
    \repeat unfold 3{
    4*1/12 c c
    c^\markup{\center-align \raise #.5 -1} c c
    c^\markup{\center-align \raise #.5 :} c c
    c^\markup{\center-align \raise #.5 1} c c
    }
   }
}

CombinedRhythm = {
  \repeat unfold \BarsShown {
    %\repeat unfold 63 c8*4/63
    \repeat unfold 3
      <<
        {16 s8.}
        \\
        \autoBeamOff
        \set tupletFullLength = ##t
        {16 \tuplet 3/2 16 { \stemDown 32 \stemUp 16 \stemDown 16 \stemUp 32 } \stemDown 16}
      >>
  }
}
%================================================================================

\paper {
  #(set-default-paper-size "a6landscape")
  left-margin = 1.0\cm
  right-margin = 1.0\cm
  horizontal-shift = 0.0\cm
  indent = 2.2\cm
}

#(define calc-x-off-for-point-stencils
  (lambda (grob)
    (let* ((nhds-array (ly:grob-object grob 'note-heads))
           (nhds-list
             (if (ly:grob-array? nhds-array)
                 (ly:grob-array->list nhds-array)
                 '())))
    ;; Calculate stencil of first NoteHead from `nhds-list'
    ;; To compensate point-stencil-NoteHead move the NoteColumn by
    ;; half of its cdr
    ;; TODO safe?
    (if (pair? nhds-list)
        (ly:grob-set-property! grob 'X-offset
          (/
             (cdr
               (ly:stencil-extent (ly:note-head::print (car nhds-list)) X))
             2)))
    (for-each
      (lambda (nh)
        (ly:grob-set-property! nh 'stencil point-stencil))
      nhds-list))))

\layout {
\override NoteHead.extra-spacing-width = #'()
  \context {
    \StaffGroup
    \consists #Span_stem_engraver
  }
  \context {
    \Score
    proportionalNotationDuration = #(ly:make-moment 1/40)
        \override Stem.stencil =
    #(lambda (grob)
      (ly:output-def-set-variable! (ly:grob-layout grob) 'blot-diameter 0)
        (ly:stem::print grob))
  }
}

middleLayout =
  \with {
      \omit StaffSymbol
      \omit TimeSignature
      \override NoteColumn.before-line-breaking =
      #calc-x-off-for-point-stencils
      \override Stem.length = #.5
      \override Stem.thickness = #.5
      \override NoteHead.stem-attachment = #'(0 . 0)
      \autoBeamOff
  }

upOverrides = {
  \override NoteHead.stem-attachment = #'(0 . 2)
  \override Stem.thickness = #.5
  \omit Beam
  \omit TupletBracket
  \omit TupletNumber
}

downOverrides = {
  \override NoteHead.stem-attachment = #'(0 . 2)
  \override Stem.thickness = #.5
  \omit Beam
  \omit TupletBracket
  \omit TupletNumber
}

\score {
  <<
  \new StaffGroup \with {
  \override StaffGrouper.staff-staff-spacing =
    #'((basic-distance . 0)
       (minimum-distance . 0)
       (padding . 2)
       (stretchability . 0))
  instrumentName = \markup { \center-column { "3/4-Takt" \line { "9 gegen 12" } } }
  }
  <<
    \new RhythmicStaff
    <<
      \upRhythm
      \\
      { \upOverrides \upRhythm }
    >>
   
    \new RhythmicStaff \with \middleLayout
    <<
      \middleDownTimescale
      \\
      \middleUpTimescale
    >>
   
    \new RhythmicStaff
    <<
      { \downOverrides \downRhythm }
      \\
      \downRhythm
      >>
  >>
   \new RhythmicStaff\with {
      instrumentName = \markup { \center-column \smaller { "kombinierter" \line { "Rythmus" } } }
    }
   {
     \CombinedRhythm
     }
  >>
}

Malte

Ich glaub, da ist durch tupletFullDuration oder die 32stel-Fähnchen einfach nicht genug Platz, die Sachen so dicht zu setzen ...

ValidUserName

#12
Zitat von: Malte am Samstag,  7. April 2018, 11:54
Ich glaub, da ist durch tupletFullDuration oder die 32stel-Fähnchen einfach nicht genug Platz, die Sachen so dicht zu setzen ...
Nein, wäre es so einfach hätte ich das ja schon durch ein paar Formatänderungen behoben. Es ist wirklich so dass Lilypond am Ende eines Tuplets scheinbar zwangsweise einen Extra-Zwischenraum einfügt. Die Lücken, sogar entsprechend proportional vergößert, treten ebenfalls auf, wenn nur ein Takt über die ganze Zeilenweite gesetzt wird.
Vergleiche zum Beispiel auch den Output, wenn die entsprechende Zeile leicht abgeändert wird:
In striktem 16-tel-Triolsatz (erzeugt Lücken auch nach den punktierten Noten):
{ \tuplet 3/2 16 {16. \stemDown 32 \stemUp 16 \stemDown 16 \stemUp 32 \stemDown 16.}}
– oder aber mit 4-tel-Triolen (Lücke tatsächlich nur am Ende jeder Viertel):
{ \tuplet 3/2 4 {16. \stemDown 32 \stemUp 16 \stemDown 16 \stemUp 32 \stemDown 16.}}

EDIT: Scheint, als ob \override SpacingSpanner.strict-note-spacing = ##t das Problem im Wesentlichen behebt. Der Rest ist tatsächlich wohl ein Kollisionsproblem mit den 32-tel Fähnchen.

harm6

Hallo,

ich hab' jetzt selbst nochmal NR 4.5.5 Proportional notation genau gelesen.

Es wird empfohlen im Score-context
\override SpacingSpanner.uniform-stretching = ##t
immer mit proportionalNotationDuration zu verwenden.
Macht die Sache etwas besser, aber nicht genug.

Dein \set tupletFullLength = ##t verursacht manche Ungleichmäßigkeit.
Du kannst es natürlich löschen. Falls Du darauf bestehst, so setze im Score-context:
\override SpacingSpanner.strict-note-spacing = ##t

Jetzt bleibt noch eine einzige wiederkehrende Unregelmäßigkeit, verursacht mit:
ZitatCombinedRhythm = {
  \repeat unfold \BarsShown {
    %\repeat unfold 63 c8*4/63
    \repeat unfold 3
      <<
        {16 s8.}
        \\
        \autoBeamOff
        \set tupletFullLength = ##t
        {16 \tuplet 3/2 16 { \stemDown 32 \stemUp 16 \stemDown 16 \stemUp 32 } \stemDown 16}
      >>
  }
}
Das nach rechts weisende 32-tel-Fähnchen verbraucht recht viel Platz um nicht mit dem nachfolgenden Notenkopf zu kollidieren.
Lilypond findet in der Zeile nicht genug Platz um hier ein gleichmäßiges spacing zu gewährleisten und setzt dann ausnahmsweise mehr Platz als sonst.
Wenn das Beispiel auf zwei Zeile eines A6-Blattes gedruckt wird (*), so ist der Effekt in der ersten Zeile, der InstrumentNames wegen, die den zur Verfügung stehenden Raum weiter einschränken, größer als in der zweiten Zeile.

Man muß also Platz schaffen.

Eine Möglichkeit wäre ein größeres Blatt zu nehmen und
proportionalNotationDuration = #(ly:make-moment 1/72)
zu verwenden.

Allerdings ist Blattgröße meistens nicht verhandelbar ;)

Insoweit könntest Du die Stem-Länge in CombinedRhythm verändern, damit der längere Hals das Fähnchen aus dem Weg schiebt. Geht mit folgendem Befehl (16-tel habe ich auch verlängert, um den Unterschied nicht gar so gravierend ausfallen zu lassen):
\override Staff.Stem.details.lengths = #'(3.5 3.5 4.5 6 5.0 6.0)
Default Werte sind: '(3.5 3.5 3.5 4.25 5.0 6.0)
Sieht aber nicht überzeugend aus, imho.

In andere Möglichkeit wäre die Kollision schlichtweg zuzulassen (bzw eher den Mindestabstand zu ignorieren)
Ich glaube das würde ich bevorzugen.
Mittels
\once \override Flag.X-extent = #'(0 . 0)
vor der 32-tel, die das Problem verursacht.

Führt zu:


\version "2.19.81"

%================================================================================
%variable part:
%==============
BarsShown = 2

upRhythm = {
    \time 3/4
    \repeat unfold \BarsShown {
      \tuplet 3/2 {8[ 8 8]}
      \tuplet 3/2 {8[ 8 8]}
      \tuplet 3/2 {8[ 8 8]}
    }
  }

downRhythm = {
    \time 3/4
    \repeat unfold \BarsShown { 16[ 16 16 16] 16[ 16 16 16] 16[ 16 16 16] }
  }
   
middleUpTimescale = {
   \crossStaff \repeat unfold \BarsShown {
    %\repeat unfold 63 c8*4/63
    \repeat unfold 3{
    4*1/12 c c c
    c_\markup{\center-align \lower #2 1} c c c
    c_\markup{\center-align \lower #2 -1} c c c
    }
   }
}

middleDownTimescale = {
   \crossStaff \repeat unfold \BarsShown {
    %\repeat unfold 63 c8*4/63
    \repeat unfold 3{
    4*1/12 c c
    c^\markup{\center-align \raise #.5 -1} c c
    c^\markup{\center-align \raise #.5 :} c c
    c^\markup{\center-align \raise #.5 1} c c
    }
   }
}

CombinedRhythm = {
  \repeat unfold \BarsShown {
    %\repeat unfold 63 c8*4/63
    %\override Staff.Stem.details.lengths =
    %  #'(3.5 3.5 4.5 6 5.0 6.0)
    %% default: '(3.5 3.5 3.5 4.25 5.0 6.0)
    \repeat unfold 3
      <<
        { 16 s8. }
        \\
        {
        \autoBeamOff
        \set tupletFullLength = ##t
        {
        16
        \tuplet 3/2 16 {
          \stemDown  32 \stemUp 16 \stemDown 16
          \once \override Flag.X-extent = #'(0 . 0)
          \stemUp 32
        }
        \stemDown 16
        }
        }
      >>
  }
}
%===============================================================================
#(set-default-paper-size "a6landscape")

\paper {
  left-margin = 1.0\cm
  right-margin = 1.0\cm
  horizontal-shift = 0.0\cm
  indent = 2.2\cm
}

#(define calc-x-off-for-point-stencils
  (lambda (grob)
    (let* ((nhds-array (ly:grob-object grob 'note-heads))
           (nhds-list
             (if (ly:grob-array? nhds-array)
                 (ly:grob-array->list nhds-array)
                 '())))
    ;; Calculate stencil of first NoteHead from `nhds-list'
    ;; To compensate point-stencil-NoteHead move the NoteColumn by
    ;; half of its cdr
    ;; TODO safe?
    (if (pair? nhds-list)
        (ly:grob-set-property! grob 'X-offset
          (/
             (cdr
               (ly:stencil-extent (ly:note-head::print (car nhds-list)) X))
             2)))
    (for-each
      (lambda (nh)
        (ly:grob-set-property! nh 'stencil point-stencil))
      nhds-list))))

\layout {
\override NoteHead.extra-spacing-width = #'()
  \context {
    \StaffGroup
    \consists #Span_stem_engraver
  }
  \context {
    \Score
    proportionalNotationDuration =
      #(ly:make-moment 1/40)
    \override SpacingSpanner.uniform-stretching = ##t
    \override SpacingSpanner.strict-note-spacing = ##t
   
    \override Stem.stencil =
    #(lambda (grob)
      (ly:output-def-set-variable! (ly:grob-layout grob) 'blot-diameter 0)
        (ly:stem::print grob))
  }
}

middleLayout =
  \with {
      \omit StaffSymbol
      \omit TimeSignature
      \override NoteColumn.before-line-breaking =
      #calc-x-off-for-point-stencils
      \override Stem.length = #.5
      \override Stem.thickness = #.5
      \override NoteHead.stem-attachment = #'(0 . 0)
      \autoBeamOff
  }

upOverrides = {
  \override NoteHead.stem-attachment = #'(0 . 2)
  \override Stem.thickness = #.5
  \omit Beam
  \omit TupletBracket
  \omit TupletNumber
}

downOverrides = {
  \override NoteHead.stem-attachment = #'(0 . 2)
  \override Stem.thickness = #.5
  \omit Beam
  \omit TupletBracket
  \omit TupletNumber
}

\score {
  <<
  \new StaffGroup \with {
  \override StaffGrouper.staff-staff-spacing =
    #'((basic-distance . 0)
       (minimum-distance . 0)
       (padding . 2)
       (stretchability . 0))
  instrumentName =
    \markup { \center-column { "3/4-Takt" \line { "9 gegen 12" } } }
  }
  <<
    \new RhythmicStaff
    <<
      \upRhythm
      \\
      { \upOverrides \upRhythm }
    >>
   
    \new RhythmicStaff \with \middleLayout
    <<
      \middleDownTimescale
      \\
      \middleUpTimescale
    >>
   
    \new RhythmicStaff
    <<
      { \downOverrides \downRhythm }
      \\
      \downRhythm
      >>
  >>
   \new RhythmicStaff\with {
      instrumentName =
        \markup \center-column \smaller { "kombinierter" \line { "Rythmus" } }
    }
   {
     \CombinedRhythm
     }
  >>
}



Gruß,
  Harm

(*)
Der Befehl
#(set-default-paper-size "a6landscape")
muß toplevel platziert werden, nicht in \paper
Dafür gibt es:
set-paper-size

Siehe NR 4.1.2 Paper size and automatic scaling




ValidUserName

Zitat von: harm6 am Samstag,  7. April 2018, 12:36
Hallo,

ich hab' jetzt selbst nochmal NR 4.5.5 Proportional notation genau gelesen.

Es wird empfohlen im Score-context
\override SpacingSpanner.uniform-stretching = ##t
immer mit proportionalNotationDuration zu verwenden.
Macht die Sache etwas besser, aber nicht genug.

Dein \set tupletFullLength = ##t verursacht manche Ungleichmäßigkeit.
Du kannst es natürlich löschen. Falls Du darauf bestehst, so setze im Score-context:
\override SpacingSpanner.strict-note-spacing = ##t

Jetzt bleibt noch eine einzige wiederkehrende Unregelmäßigkeit, verursacht mit:
ZitatCombinedRhythm = {
  \repeat unfold \BarsShown {
    %\repeat unfold 63 c8*4/63
    \repeat unfold 3
      <<
        {16 s8.}
        \\
        \autoBeamOff
        \set tupletFullLength = ##t
        {16 \tuplet 3/2 16 { \stemDown 32 \stemUp 16 \stemDown 16 \stemUp 32 } \stemDown 16}
      >>
  }
}
Das nach rechts weisende 32-tel-Fähnchen verbraucht recht viel Platz um nicht mit dem nachfolgenden Notenkopf zu kollidieren.
Lilypond findet in der Zeile nicht genug Platz um hier ein gleichmäßiges spacing zu gewährleisten und setzt dann ausnahmsweise mehr Platz als sonst.
Wenn das Beispiel auf zwei Zeile eines A6-Blattes gedruckt wird (*), so ist der Effekt in der ersten Zeile, der InstrumentNames wegen, die den zur Verfügung stehenden Raum weiter einschränken, größer als in der zweiten Zeile.

Man muß also Platz schaffen.

Eine Möglichkeit wäre ein größeres Blatt zu nehmen und
proportionalNotationDuration = #(ly:make-moment 1/72)
zu verwenden.

Allerdings ist Blattgröße meistens nicht verhandelbar ;)

Insoweit könntest Du die Stem-Länge in CombinedRhythm verändern, damit der längere Hals das Fähnchen aus dem Weg schiebt. Geht mit folgendem Befehl (16-tel habe ich auch verlängert, um den Unterschied nicht gar so gravierend ausfallen zu lassen):
\override Staff.Stem.details.lengths = #'(3.5 3.5 4.5 6 5.0 6.0)
Default Werte sind: '(3.5 3.5 3.5 4.25 5.0 6.0)
Sieht aber nicht überzeugend aus, imho.
Jep, das sind soweit die Dinge, mit denen ich auch gerade schon rumgespielt hatte.

ZitatIn andere Möglichkeit wäre die Kollision schlichtweg zuzulassen (bzw eher den Mindestabstand zu ignorieren)
Ich glaube das würde ich bevorzugen.
Mittels
\once \override Flag.X-extent = #'(0 . 0)
vor der 32-tel, die das Problem verursacht.
Genau das fehlte mir noch, das wäre nämlich auch meine bevorzugte Lösung. Ich bin jetzt sogar soweit gegangen, einfach pauschal \override Flag.X-extent = #'(0 . 0) für den gesamten Block zu setzen, weils allgemein alle Probleme dieser Art vermeidet.

Zitat(*)
Der Befehl
#(set-default-paper-size "a6landscape")
muß toplevel platziert werden, nicht in \paper
Dafür gibt es:
set-paper-size

Siehe NR 4.1.2 Paper size and automatic scaling
Oh, okay. Danke, gut zu wissen. Da muss ich mich allerdings auch noch ein bischen einfuchsen. Was ich eigendlich als Output brauche ist eine kompakte Vektorgrafik zur Übernahme in LaTex.