Autor Thema: Notenzeilen ausrichten  (Gelesen 2649 mal)

bblochl

  • Member
Notenzeilen ausrichten
« am: Sonntag, 23. Juni 2013, 17:19 »
Kleine, angeschlossene Übungsstücke mit jeweils 4 Takten untereinander ausgegeben sind sind leider ungleich lang, was nicht schön aussieht.

Die Stücke sind im 2/4-Takt, eine Zeile hat je Takt 4/8-Noten, die nächste je 2/8-Noten und eine 1/4 Note etc., womit das Grundproblem bereits beschrieben ist. Zwei 1/8-Noten nehmen mehr Raum ein als eine 1/4-Note, weshalb die Zeilen ungleich lang sind.

Wie kann ich  die Zeilen gleich lang machen damit diese rechts fluchten, was schöner aussieht?

Grüße

bblochl

harm6

  • Member
Re: Notenzeilen ausrichten
« Antwort #1 am: Sonntag, 23. Juni 2013, 17:31 »
Hallo,

vielleicht so:

\version "2.16.2"

\paper {
indent = 10
line-width = 100
ragged-right = ##f
left-margin = 10
}

\layout {
    \context {
      \Score
      \override NonMusicalPaperColumn #'line-break-permission = ##f
    }
}

\new Staff \relative c' { \time 2/4 \repeat unfold 4 c2 }
\new Staff \relative c' { \time 2/4 \repeat unfold 8 c4 }
\new Staff \relative c' { \time 2/4 \repeat unfold 16 c8 }

oder Du könntest mein LSR-snippet 873
anpassen.

Gruß,
  Harm

bblochl

  • Member
Re: Notenzeilen ausrichten
« Antwort #2 am: Montag, 24. Juni 2013, 11:18 »
Vielen Dank für die Hilfe!

Der Beispielcode hat auf Anhieb mein Problem gelöst.

Dein Beispiel "Exercise: Improve the given choral" ist sehr beeindruckend und schön aber umfangreich. Um den Code zu analysieren und zu verstehen brauche ich etwas mehr Zeit, die aber sicherlich lohnend investiert ist.

Noch mal vielen Dank

bblochl

bblochl

  • Member
Re: Notenzeilen ausrichten
« Antwort #3 am: Montag, 24. Juni 2013, 13:12 »
Die Lösung mit
ragged-right = ##f
(reicht völlig!
\override NonMusicalPaperColumn #'line-break-permission = ##f
kann ich in meinem Fall weglassen, vermulich weil es nur einzeilige Notenlinien sind.)
Finde ich sehr elegant!

Nachträglich habe ich gefunden, dass der Einsatz von
4.5.5 Proportionale Notation
http://www.lilypond.org/doc/v2.16/Documentation/notation/proportional-notation
möglich ist. Damit kann man nach der Beschreibung den Platz den eine Note einnimmt vom Notenwert abhängig machen. Bei meinem Beispiel würden dann die Viertelnoten den Platz von zwei 1/8-Noten einnehmen und dann sollten die Zeilen gleich lang sein. Das ist zunächst Theorie - der Versuch kann das verifizieren.

\version "2.16.2"

\paper {
indent = 10
line-width = 100
%ragged-right = ##f
left-margin = 10
}

\layout {
    \context {
      \Score
      %\override NonMusicalPaperColumn #'line-break-permission = #f
      proportionalNotationDuration = #(ly:make-moment 1 8)
    }
}

\new Staff \relative c' { \time 2/4 \repeat unfold 4 c2 }
\new Staff \relative c' { \time 2/4 \repeat unfold 8 c4 }
\new Staff \relative c' { \time 2/4 \repeat unfold 16 c8 }

ragged-right = ##f ist bei der proportionalNotationDuration-Version nicht erforderlich, aber bei der \override NonMusicalPaperColumn-Version!

Unschön bleibt bei Notenzeilen die die Seitenbreite überschreiten die Einrückung der ersten Zeile.  Die Einrückung kann man aber mit
indent = 0
abschalten.

Das letzte Problem, das noch zu lösen ist, ist die Taktbezeichnung, die in der ersten Zeile zusätzlichen Platz braucht, weshalb bei mehrzeiligen Notnsätzen die Taktstriche nicht fluchten. (Müßte ja nicht sein, aber für Übungsstücke ist eine klare, übersichtliche Struktur sicher von Vorteil.) Lösung dafür habe ich noch nicht gefunden.

Möglicherweise hilft das Jemandem weiter, so wie mir geholfen wurde.

Grüße

bblochl

harm6

  • Member
Re: Notenzeilen ausrichten
« Antwort #4 am: Montag, 24. Juni 2013, 23:36 »
Hallo,

proportionalNotationDuration ist nicht immer so erfolgreich wie man das der Doku nach glauben mag.

Dazu siehe auch diesen Thread.

Und bitte formulier Deine Fragen demnächst so präzise wie möglich:

Du hattest gefragt:
Zitat
Wie kann ich die Zeilen gleich lang machen damit diese rechts fluchten
und nicht nach den Taktstrichen.

Wenn Du nach Taktstrichen und Zeilenlänge gefrägt hättest, dann hätte ich gleich auf das LSR-Snippet verwiesen.

Gruß,
  Harm

bblochl

  • Member
Re: Notenzeilen ausrichten
« Antwort #5 am: Mittwoch, 26. Juni 2013, 18:55 »
Zunächst sieht das so aus, als wenn ich nicht präzise gefragt hätte. Im Prinzip kam ich mit der Hilfe und der zusätzlichen absoluten Notenbreite gut zurecht und das "Urproblem ist damit gelöst und war mit der Hilfe auch sehr zufrieden.

Auf das Problem der Einrückung auf der neuen Seite stößt man auch erst, wenn man eben so viele Übungsbeispiele ausgearbeitet hat, bis der Seitenumbruch eben erfolgt. So weit vorausgedacht habe ich eben nicht.

Dann, als ich ein längeres Beispiel eingefügt, formuliert habe, kamen die zusätzlichen Probleme, die aber oben auch schon gelöst sind, außer das Problem mit der Taktbezeichnung, wenn ein Beispiel eine zweite Zeile hat, wo ja dann keine Taktbezeichnung stehen soll (siehe im Beispielcode 3. Zeile udn 4. Zeile. In der 4. Zeile als Fortsetzung der 3. Zeile sollte  dann keine Taktbezeichnung mehr stehen, aber wenn man \time wegläßt, fügt lilypond einen 4/4-Takt ein. Das Problem einer Zeile ohne Taktbezeichnung und gleich lang habe ich noch nicht gelöst.

Ein neues Problem ergab sich bei einem Übungsbeispiel mit Triolen, dann versagen die Anweisungen. Triolen sind ja 3 Noten in einem Notenwert von 2, also 3 Noten in zwei mal 1/8. (Auch nicht von mir vorherzusehen!)

Und auf das Problem der Einrückung auf der neuen Seite stößt man auch erst, wenn man eben so viele Übungsbeispiele ausgearbeitet hat, bis der Seitenumbruch eben erfolgt.

Grüße

bblochl


Ich füge einen Beispielcode an um das zu verdeutlichen:

\version "2.16.2"
 
\paper {
  indent = 0
  line-width = #150
  tagline = ##f
}

\layout {
    \context {
      \Score
      \override NonMusicalPaperColumn #'line-break-permission = #f
      proportionalNotationDuration = #(ly:make-moment 1 8)
        %von https://liarchiv.joonet.de/index.php?topic=1462.0
%\override SpacingSpanner #'uniform-stretching = ##t
%\override SpacingSpanner #'strict-note-spacing = ##t
    }
}
 
Noteneins = {
  \relative c''{
   \key a \major
    \time 2/4
     \tempo "1. Beispiel"
       \repeat volta 1 {
      cis8 [e] cis [(b)] |
cis8 [e] d [(b)]  |
  cis8 [e] cis [b] |
    cis8 [e] d [b]  |
  }
  }
  }
 
Notenzwei = {
   \relative c'{
    \key a \major
     \time 2/4
      \tempo "2. Beispiel -Triples (Triolen)"
    \repeat volta 1 {
      \times 2/3 {cis'8 [(b) cis]} \times 2/3  {e [cis a]} |
       \times 2/3 {d [b b]} \times 2/3 {e [b g]} |
\times 2/3  {a [b cis]} \times 2/3 {e [cis a]}|
  }
  }
  }
 
  Notendrei = {
   \relative c''{
    \key a \major
     \time 2/4
      \tempo "3. Zeile"
      a8. [cis16 a8 e] |
g8. [b16 e8 e8]
  cis8 [e] a,4 |
  cis8 [e] a,4 |
\bar "|"
  }
  }
 
  Notenvier = {
   \relative c''{
    \key a \major
     \time 2/4
      \tempo "4. Zeile"
       \repeat volta 1 {
d8 [e] d4 |
  d8 [e] d4 |
    d8 [e] d4 |
      d8 [e] b4 |
  }
  }
  }
 
    Notenfuenf = {
   \relative c''{
    \key a \major
    %\time 2/4
      \tempo "5. Zeile"
       \repeat volta 1 {
d8 [e] d4 |
  d8 [e] d4 |
    d8 [e] d4 |
      d8 [e] b4 |
  }
  }
  }
 
  % 1. Zeile 
  \score {
  <<
    % \set  proportionalNotationDuration = #(ly:make-moment 1 8)
  \new Staff  {
   \Noteneins
  }
  >>
  }
 
  % 2. Zeile 
  \score {
  <<
  \new Staff  {
   \Notenzwei
  }
  >>
  }
 
  % 3. Zeile 
  \score {
  <<
  \new Staff  {
  \Notendrei
  }
  >>
  }

  % 4. Zeile 
  \score {
  <<
  \new Staff  {
  \Notenvier
  }
  >>
  }
 
    % 5. Zeile 
  \score {
  <<
  \new Staff  {
  \Notenfuenf
  }
  >>
  }
 

bblochl

  • Member
Re: Notenzeilen ausrichten
« Antwort #6 am: Donnerstag, 4. Juli 2013, 17:02 »
Heute habe ich mir den Code von http://lsr.dsi.unimi.it/LSR/Item?id=873 vorgenommen und untersucht.

Der Originalcode compiliert mit Fehlermeldung:
...
Interpretation der Musik...
[/usr/local/lilypond/usr/share/lilypond/current/fonts/otf/emmentaler-20.otf]
choral2.ly:146:8: Warnung: Zwei gleichzeitige mark-Ereignisse, dieses wird verworfen
       
        \mark \markup { \bold" Pupil:" Here's my version! }
choral2.ly:57:8: Warnung: Vorheriges mark-Ereignis hier
       
        \mark \markup {
choral2.ly:232:8: Warnung: Zwei gleichzeitige mark-Ereignisse, dieses wird verworfen
       
        \mark \markup {
choral2.ly:57:8: Warnung: Vorheriges mark-Ereignis hier
       
        \mark \markup {
verstrichene Zeit: 0.16 Sekunden
Elementanzahl: 1502 (Klammern: 52)
...
Diese stört aber nicht weiter und ist insbesondere für den musikalischen Teil nicht relevant. .

Eine große Zahl von Anweisungen betrifft lediglich die Textausgabe und ist deshalb für die Notendarstellung nicht wirksam. Die meisten habe ich auskommentiert. Ich füge hier den stark reuzierten Code für eigene Experimente ein:
\version "2.16.2"

%Selbst wenn man nur ein \partial stehen läßt gilt der für das ganze Stück?!

% by Thomas Morley

#(set-global-staff-size 18)

\paper {
  indent = 0
  %ragged-right = ##f
  %Sorgt für die Ausgabe des Titels
  print-all-headers = ##t
}

\layout {
  \context {
    \Staff
    %Sorgt für die Textausgabe
    %\consists "Mark_engraver"
    %Ohne schiebt sich der Start des Textes nach links außerhalb des Blatts? :
    \override RehearsalMark #'self-alignment-X = #LEFT
    %proportionalNotationDuration = #(ly:make-moment 1 32)
  }
  \context {
    \StaffGroup
    %Sorgt für die Verbindung der beiden Zeilen mit einer Klammer
    %wird unten mit durch eine Frontlinie ersetzt \override SystemStartBrace #'style = #'bar-line
    %systemStartDelimiterHierarchy = #'(SystemStartBrace (SystemStartBracket a b))
  }
  \context {
    \Score
    %Overrides die übliche geschweifte Klammer und macht eine Frontlinie anstatt
    %\override SystemStartBrace #'style = #'bar-line
    %Sorgt dafür, dass die drei Staffs nicht mit Linie verbunden werden:
    %\override SystemStartBar #'stencil = ##f
    %\override SystemStartBrace #'padding = #-0.1
    %\override SystemStartBrace #'thickness = #1.6
    %\remove "Mark_engraver"
    %\override StaffGrouper #'staffgroup-staff-spacing #'basic-distance = #15
  }
}

%%%% EXAMPLE
%{
txt =
\lyricmode {
  Wer4 nur den lie -- ben Gott läßt wal2 -- ten4
  und4 hof -- fet auf ihn al -- le Zeit2.
}
%}

% First StaffGroup "exercise"

eI =
\relative c' {
        \mark \markup {
                \bold Teacher:
                This is a simple setting of the choral. Please improve it.
                }
        \key a \minor
        \time 4/4
        \voiceOne
       
%\partial 4
        e4
        a b c b
        a b gis2
        e4\fermata g! g f
e a %a gis
%a2.\fermata
        \bar ":|"
}

eII =
\relative c' {
        \key a \minor
        \time 4/4
        \voiceTwo
%\partial 4
        c4
        e e e gis
        a f e2
        b4 b d d
c c %d d 
%c2.
        \bar ":|"
}

eIII =
\relative c' {
        \key a \minor
        \time 4/4
        \clef bass
        \voiceOne
       
%\partial 4
        a4
        c b a b
        c d b2
        gis4 g g b
c a %f e
%e2.
}

eIV =
\relative c' {
        \key a \minor
        \time 4/4
        \clef bass
        \voiceTwo
       
%\partial 4
        a,4
        a' gis a e
        a, d e2
        e,4\fermata e' b g
c f %d e
%a,2.\fermata
        \bar ":|"
}

exercise =
\new StaffGroup = "exercise"
<<
 
  \new Staff
    <<
      \new Voice \eI
      \new Voice \eII
    >>
 
    %\new Lyrics \txt
 
  \new Staff
    <<
      \new Voice \eIII
      \new Voice \eIV
    >>
>>

% Second StaffGRoup "simple Bach"

sbI =
\relative c' {
        \mark \markup { \bold" Pupil:" Here's my version! }
        \key a \minor
        \time 4/4
        \voiceOne
       
%\partial 4
        e4
        a b c b
        a b gis2
        e4\fermata g! g f
e a %a gis
%a2.\fermata
        \bar ":|"
}

sbII =
\relative c' {
        \key a \minor
        \time 4/4
        \voiceTwo
%\partial 4
        c8 d
        e4 e e8 f g4
        f f e2
        b4 b8 c d4 d
e8 d c4 %b8 c d4 
%c2.
        \bar ":|"
}

sbIII =
\relative c' {
        \key a \minor
        \time 4/4
        \clef bass
        \voiceOne
       
%\partial 4
        a8 b
        c4 b a b8 c
        d4 d8 c b2
gis4 g %g8 a b4
%b a8 g f4 e
%e2.
}

sbIV =
\relative c' {
        \key a \minor
        \time 4/4
        \clef bass
        \voiceTwo
       
%\partial 4
        a,4
        a' gis a e
        f8 e d4 e2
        e,4\fermata e' b a8 g
c4 f8 e %d4 e
%a,2.\fermata
        \bar ":|"
}

simpleBach =
\new StaffGroup = "simple Bach"
<<
 
  \new Staff
    <<
      \new Voice \sbI
      \new Voice \sbII
    >>
 
    %\new Lyrics \txt
 
  \new Staff
    <<
      \new Voice \sbIII
      \new Voice \sbIV
    >>
>>

% Third StaffGroup "chromatic Bach"

cbI =
\relative c' {
        \mark \markup {
                \bold "Teacher:"
                \column {
                        "Well, you simply copied and transposed a version of J.S.Bach."
                        "Do you know this one?"
                }
        }
        \key a \minor
        \time 4/4
        \voiceOne
       
%\partial 4
        e4
        a b c b
        a b gis4. fis8
        e4\fermata g! g f
e a %a8 b gis4
%a2.\fermata
        \bar ":|"
}

cbII =
\relative c' {
        \key a \minor
        \time 4/4
        \voiceTwo
%\partial 4
        c8 d
        e4 e e8 fis gis4
        a8 g! f!4 e2
        b4 e e d
d8[ cis] d dis %e fis e4 
%e2.
        \bar ":|"
}

cbIII =
\relative c' {
        \key a \minor
        \time 4/4
        \clef bass
        \voiceOne
       
%\partial 4
        a8 b
        c[ b] a gis8 a4 d,
        e8[ e'] d c b4. a8
        gis4 b c d8 c
b[ a] a b c b b c16 d
%c2.
}

cbIV =
\relative c' {
        \key a \minor
        \time 4/4
        \clef bass
        \voiceTwo
       
%\partial 4
        a4
        c, e a, b
        c d e2
        e4\fermata e a b8 c
gis[ g] fis f e dis e4
%a,2.\fermata
        \bar ":|"
}

chromaticBach =
\new StaffGroup = "chromatic Bach"
<<
 
  \new Staff
    <<
      \new Voice \cbI
      \new Voice \cbII
    >>
 
    %\new Lyrics \txt
 
  \new Staff
    <<
      \new Voice \cbIII
      \new Voice \cbIV
    >>
>>


% Score

\score {
        <<
        \exercise
        \simpleBach
\chromaticBach
        >>
        \header {
                title = \markup
                           \column {
                             \vspace #1
                             "Exercise: Improve the given choral"
                             " "
                            }
        }
        \layout {
                \context {
                        \Lyrics
                        \override LyricText #'X-offset = #-1
                }
        }
}

Leider wird der Code durch diese Zusammenfassung mittels \StaffGroup äußerst unflexibel und fehleranfällig. Wenn man beispielsweise \partial 4 auskommentiert, muss man das in allen Noten-Abschnitten tun. Läßt man irgendwo bewußt oder versehentlich ein \partial 4 stehen, wird das für alle Zeilen der Gruppe wirksam! Fügt man einen Takt (in einem oder mehreren oder allen Takten) zu den fünf Takten hinzu, erfolgt ein Zeilenumbruch. Nimmt man einen Takt weg, so werden die Zeilen insgesamt kürzer. Das Beispiel wurde also so ausgewählt, dass die Noten genau in eine Zeile passen. Der Code ist also alles andere als flexibel und kleine Änderungen können zu erheblichen Unterschieden der Darstellung führen. 

Sehr gut daran ist allerdings, dass gerade wegen der Zusammenfassung in eine Gruppe die Taktstriche immer fluchten und die Zeilen immer gleich lang sind!

Für denjenigen, der genau das will ist das die einzige Möglichkeit das zu erreichen. Alle anderen Instrumente von lilypond funktionieren nur partiell, was an lilyponds Optimierer für die Darstellung liegt, der nicht linear wirkt (siehe Handbuch Kapitel 4.5 Horizontale Abstände http://www.lilypond.org/doc/v2.16/Documentation/notation/horizontal-spacing  und insbesondere Abschnitt 4.5.1 um das zu verstehen).

Grüße

harm6

  • Member
Re: Notenzeilen ausrichten
« Antwort #7 am: Donnerstag, 4. Juli 2013, 22:20 »
Hallo bblochl,

Zitat
Heute habe ich mir den Code von http://lsr.dsi.unimi.it/LSR/Item?id=873 vorgenommen und untersucht.

Der Originalcode compiliert mit Fehlermeldung:
[...]

Das LSR benutzt 2.14.2.
Benutze convert-ly

Zitat
Heute habe ich mir den Code von http://lsr.dsi.unimi.it/LSR/Item?id=873 vorgenommen und untersucht.

[...]

Leider wird der Code durch diese Zusammenfassung mittels

\StaffGroup

äußerst unflexibel und fehleranfällig. Wenn man beispielsweise

\partial 4

auskommentiert, muss man das in allen Noten-Abschnitten tun. Läßt man irgendwo bewußt oder versehentlich ein

\partial 4

stehen, wird das für alle Zeilen der Gruppe wirksam! Fügt man einen Takt (in einem oder mehreren oder allen Takten) zu den fünf Takten hinzu, erfolgt ein Zeilenumbruch. Nimmt man einen Takt weg, so werden die Zeilen insgesamt kürzer. Das Beispiel wurde also so ausgewählt, dass die Noten genau in eine Zeile passen. Der Code ist also alles andere als flexibel und kleine Änderungen können zu erheblichen Unterschieden der Darstellung führen.

Sehr gut daran ist allerdings, dass gerade wegen der Zusammenfassung in eine Gruppe die Taktstriche immer fluchten und die Zeilen immer gleich lang sind!

Für denjenigen, der genau das will ist das die einzige Möglichkeit das zu erreichen.

Du wirst dem snippet vor, daß es nicht macht, wozu es nicht konstruiert wurde.

Es wurde gemacht um für gleiche vertikale Ausrichtung von BarLines und NoteColumns zu sorgen.
Genau das tut es auch.

Wenn man jetzt eine Zeile auftaktig, andere volltaktig beginnen läßt, muß kuddelmuddel entstehen.
So what?

Zitat
Alle anderen Instrumente von lilypond funktionieren nur partiell, was an lilyponds Optimierer für die Darstellung liegt, der nicht linear wirkt (siehe Handbuch Kapitel 4.5 Horizontale Abstände http://www.lilypond.org/doc/v2.16/Documentation/notation/horizontal-spacing  und insbesondere Abschnitt 4.5.1 um das zu verstehen).

Du solltest einen bug-report einreichen, falls Du der Ansicht bist, daß bei LilyPond oder ihrer Dokumentation etwas schiefläuft und/oder verbesserungswürdig ist.


-Harm

bblochl

  • Member
Re: Notenzeilen ausrichten
« Antwort #8 am: Freitag, 5. Juli 2013, 11:21 »
Ich werfe gar nichts vor!

Ich versuche den Monstercode auf das Wesentliche und für den geplanten Zweck notwendige zu reduzieren und stelle dabei im Versuch gewissermaßen nebenbei die Grenzen des Möglichen fest.

Zitat
Das LSR benutzt 2.14.2.
Benutze convert-ly

Danke für den Hinweis!

Grüße
« Letzte Änderung: Freitag, 5. Juli 2013, 16:03 von bblochl »