Deutsches Lilypond Forum (Archiv)

Allgemein => Fragen zu Funktionen => Thema gestartet von: rgree am Sonntag, 18. September 2016, 17:15

Titel: Abstand zwischen Notenlinien / Abstand zwischen Systemen
Beitrag von: rgree am Sonntag, 18. September 2016, 17:15
Hallo,

ich möchte gern - wie im anliegenden Beispiel zu sehen - einen vierstimmigen Satz schreiben, in dem alle Stimmen (außer einer) verkleinert dargestellt sind.
Soweit kein Problem.

Aber wie kann ich

 (1) die Abstände der Notenlinien
sowie
 (2) die Abstände zwischen den Systemen
 beeinflussen (d.h. verkleinern)
 ?
 
 Viele Grüße
 Reinhard Greeven
Titel: Re: Abstand zwischen Notenlinien / Abstand zwischen Systemen
Beitrag von: Manuela am Sonntag, 18. September 2016, 18:24
\new Staff \with {
      \override StaffSymbol.staff-space = #(magstep -3)
      \override VerticalAxisGroup.default-staff-staff-spacing =
      #'((basic-distance . 4)
         (minimum-distance . 4)
         (padding . 1)
         (stretchability . 0))
    }
Titel: Re: Abstand zwischen Notenlinien / Abstand zwischen Systemen
Beitrag von: rgree am Montag, 19. September 2016, 16:03
Hallo Manuela,

vielen Dank für den wertvollen Hinweis.

Meine Lösung habe ich angefügt; die dort gezeigte "Musik" ist natürlich nur für Testzwecke.

Sie dürfte für Leute besonders interessant sein, die in Ensembles spielen,
da sie erlaubt, in einer Partitur eine oder mehrere Stimmen hervorzuheben
bzw. zu verkleinern.

Viele Grüße,
Reinhard Greeven
Titel: Re: Abstand zwischen Notenlinien / Abstand zwischen Systemen
Beitrag von: Manuela am Montag, 19. September 2016, 21:30
Freut mich, wenn ich dir helfen konnte. Das Problem der vertikalen Abstände hat mich ziemlich beschäftigt, es hat eine Weile gedauert, bis ich mich durchgekämpft hatte.
Titel: Re: Abstand zwischen Notenlinien / Abstand zwischen Systemen
Beitrag von: Manuela am Dienstag, 20. September 2016, 06:55
Ich habe jetzt das Beispiel angesehen, sehr interessant.  :)

Grundsätzlich: wann immer ein unerwünschter Staff entsteht, dann stimmt irgendwas nicht, meist lohnt es sich, nach dem Fehler zu suchen anstatt dies mit einem Workaround zu korrigieren. Z.B. \context Staff mit einem neuen Staff innerhalb geht nicht, ein Context kann keinen Untercontext des gleichen Typs enthalten(soweit ich weiß, korrigiert mich bitte, wenn ich falsch liege).

Wenn du schreibst \context StaffGroup << \new Staff... >>  dann sind die unerwünschten Staffs weg.

Update: und das ist auch der Grund, warum man keinen Thread schließen sollte  ;)

Und noch ein Update: mit StaffGroup muss man die Spacing-Anweisung etwas anders schreiben, entweder als Context-Anweisung im Layout-Block

\context {
    \StaffGroup
    \override StaffGrouper.staff-staff-spacing =
      #'((basic-distance . 0.5)
         (minimum-distance . 0.5)
         (padding . 0.5)
         (stretchability . 0.5))
 }

oder mit \with. Ich bevorzuge inzwischen die Änderung im Context, weil man hier zentral die Werte für alle Contexte eines Typs setzen kann.
Titel: Re: Abstand zwischen Notenlinien / Abstand zwischen Systemen
Beitrag von: Pierre am Dienstag, 20. September 2016, 11:07
Hallo Reinhard, hallo Manuella,

Reinhard,
Kannst du auch machen:
\version "2.18"
% : verschiedene Größen verändern
staffSize = #(define-music-function (parser location new-size) (number?)
  #{
    \set fontSize = #new-size
    \override StaffSymbol.staff-space = #(magstep new-size)
    \override StaffSymbol.thickness = #(magstep new-size)
    \override Staff.Clef.font-size = #new-size
    \override Staff.KeySignature.font-size = #new-size
     
  #})
%

%% => LSR: http://lsr.di.unimi.it/LSR/Item?id=882
%% % DEFINE A CUSTOM STAFF CONTEXT FOR "LAYOUT" 
\layout {
  \context {
    \Staff
    % give the custom staff a name of your choice
    \name KleinUndGrau
    % tell LilyPond that commands that work on a standard
    % Staff context should also work with this custom context
    \alias Staff
    % add customizations, they can be anything that can go in
    % a staff's \with block
    \staffSize #-3
    \override NoteHead.color = #grey
    \override VerticalAxisGroup.default-staff-staff-spacing =
      #'((basic-distance . 4)
         (minimum-distance . 4)
         (padding . 1)
         (stretchability . 0))
  }
  \context {
    \Staff
    \name GrossUndSchwarz
    \alias Staff
    \override VerticalAxisGroup.default-staff-staff-spacing =
      #'((basic-distance . 4)
         (minimum-distance . 4)
         (padding . 1)
         (stretchability . 0))
  }
  % define the "parent" contexts that will accept this custom context
  \context {
    \Score     
    \accepts KleinUndGrau
    \accepts GrossUndSchwarz
  }
  \context {
    \ChoirStaff
    \accepts KleinUndGrau
    \accepts GrossUndSchwarz
  }
  \context {
    \GrandStaff
    \accepts KleinUndGrau
    \accepts GrossUndSchwarz
  }
  \context {
    \PianoStaff
    \accepts KleinUndGrau
    \accepts GrossUndSchwarz
  }
  \context {
    \StaffGroup
    \accepts KleinUndGrau
    \accepts GrossUndSchwarz
  }
}

% : Variable
tonLeiter = {
  \key a \major
  <>\f^\markup\italic "con sordino"
  \repeat unfold 4 { c'4 c c' c' c' c' c' c' }
}
stimmeEins = {
  \transpose c' c''' \tonLeiter
}
stimmeZwei = {
  \transpose c' c'' \tonLeiter
}
stimmeDrei = {
  \clef alto
  \tonLeiter
}
stimmeVier = {
  \clef bass
  \transpose c' c \tonLeiter
}

% -------------------------------------------
\score {
    \header { piece = \markup \fill-line { " " "1. Stimme hervorgehoben" " "} }
    <<
\new GrossUndSchwarz \stimmeEins
\new KleinUndGrau \stimmeZwei
\new KleinUndGrau \stimmeDrei
\new KleinUndGrau \stimmeVier
    >>
    \layout {
      % aus irgeneinem Grund entsteht als erstes eine Leer-System, das mit der folgenden Zeile wieder entfernt wird
      \context { \Staff \RemoveEmptyStaves \override VerticalAxisGroup.remove-first = ##t }
    }
}
% -------------------------------------------
\score {
    \header { piece = \markup \fill-line { " " "2. Stimme hervorgehoben" " "} }
    <<
\new KleinUndGrau { \stimmeEins }
\new GrossUndSchwarz { \stimmeZwei }
\new KleinUndGrau { \stimmeDrei }
\new KleinUndGrau { \stimmeVier }
    >>
    \layout {
      \context { \Staff \RemoveEmptyStaves \override VerticalAxisGroup.remove-first = ##t }
    }
}
% -------------------------------------------
\score {
    \header { piece = \markup \fill-line { " " "3. Stimme hervorgehoben" " "} }
    <<
\new KleinUndGrau \stimmeEins
\new KleinUndGrau \stimmeZwei
\new GrossUndSchwarz \stimmeDrei
\new KleinUndGrau \stimmeVier
    >>
    \layout {
      \context { \Staff \RemoveEmptyStaves \override VerticalAxisGroup.remove-first = ##t }
    }
}
% -------------------------------------------
\score {
    \header { piece = \markup \fill-line { " " "4. Stimme hervorgehoben" " "} }
    <<
\new KleinUndGrau \stimmeEins
\new KleinUndGrau \stimmeZwei
\new KleinUndGrau \stimmeDrei
\new GrossUndSchwarz \stimmeVier
    >>
    \layout {
      \context { \Staff \RemoveEmptyStaves \override VerticalAxisGroup.remove-first = ##t }
    }
}

Gruß,
Pierre
Titel: Re: Abstand zwischen Notenlinien / Abstand zwischen Systemen
Beitrag von: rgree am Dienstag, 20. September 2016, 17:06
Hallo Manuela, hallo Pierre,

@Pierre:     das ist mal eine elegante Lösung
@Manuela: Deinen Hinweis mit der Staffgroup habe ich gleich eingebaut.

Immerhin bin ich soweit, dass ich mit nur zwei Variablen pro Stimme dafür sorgen kann,
welche Stimme in einer Streichquartett-Partitur hervorgehoben sein soll;
das war nämlich mein ursprüngliches Problem.

Als alten IT-Hasen (35 Jahre Erfahrung, 10 Programmiersprachen, davon 4 intensivst) erstaunt
es mich immer wieder, vor welche Herausforderung Scheme bzw. die Lilypond-Bibliotheken
einen bei der Lösung vergleichsweise einfacher Probleme stellt.
Gott sei Dank wird man durch den im Ergebnis exzellenten Notensatz dafür voll entschädigt.

Vielen Dank für die Hilfe,
Reinhard
Titel: Re: Abstand zwischen Notenlinien / Abstand zwischen Systemen
Beitrag von: Manuela am Dienstag, 20. September 2016, 21:15
Als alten IT-Hasen (35 Jahre Erfahrung, 10 Programmiersprachen, davon 4 intensivst) erstaunt
es mich immer wieder, vor welche Herausforderung Scheme bzw. die Lilypond-Bibliotheken
einen bei der Lösung vergleichsweise einfacher Probleme stellt.
Gott sei Dank wird man durch den im Ergebnis exzellenten Notensatz dafür voll entschädigt.


10 Programmiersprachen spreche ich zwar nicht, aber ich hab auch schon einige durch.
Und bin vor Scheme gestanden wie der Ochs vorm neuen Tor, anscheinend sind Programmierkenntnisse eher hinderlich beim Verständnis von Scheme.

Inzwischen habe ich mich ein wenig eingefuchst und bin begeistert von den Möglichkeiten, Lilypond kann so viel mehr als Noten setzen. Z.B. habe ich ein Scheme-Programme geschrieben, das automatisch alle leitereigenen Drei-, Vier-, Fünfklänge generiert. Ich kann sogar eine beliebige Intervallfolge vorgeben und es werden alle Akkorde einer vorgegebenen Tonleiter generiert, die diese Abstände haben, z.B. alle Quartsextakkorde. Die Tonleiter muss auch keine Tonleiter im wörtlichen Sinn sein, es kann eine beliebige Abfolge von Tönen sein. Zeig mir mal ein Notensatzprogramm, mit dem man das machen kann.

Abgesehen von den zeichnerischen Fähigkeiten, ich habe schon Quintenzirkel, Tastaturen und Akkordeonbässe damit gezeichnet.
Titel: Re: Abstand zwischen Notenlinien / Abstand zwischen Systemen
Beitrag von: harm6 am Dienstag, 20. September 2016, 23:56
Hallo Reinhard,

ich bin kein Programmierer und habe scheme, genauer guile, nur gelernt, um besser mit LilyPond klarzukommen. Insoweit kann ich Deine Klage über scheme nicht beurteilen, da ich schlichtweg keine anderen Sprachen beherrsche.
Aber vielleicht interessiert Dich dann mein eher programmatischer Ansatz zur Lösung Deines Problemes.
Es braucht allerdings eine neuere devel-Version und ist nicht jenseits Deines Beispiels getestet.

\version "2.19.48"

staffMods =
#(define-scheme-function (new-size) (number?)
  #{
  \with {
      fontSize = #new-size
      \override StaffSymbol.staff-space = #(magstep new-size)
      \override StaffSymbol.thickness = #(magstep new-size)
      \override Clef.font-size = #new-size
      \override KeySignature.font-size = #new-size
      \override NoteHead.color = #grey
      \override VerticalAxisGroup.default-staff-staff-spacing =
       #'((basic-distance . 0.5)
          (minimum-distance . 0.5)
          (padding . 0.5)
          (stretchability . 0.5))
    }
  #})
 
#(define (emphasize-engraver size staff-number)
  (lambda (context)
     (let ((staves '()))
       (make-engraver
         (listeners
          ((AnnounceNewContext engraver event)
           (let ((new-ctx (ly:event-property event 'context)))
            (if (eq? 'Staff (ly:context-name new-ctx))
                (set! staves (cons new-ctx staves)))
            (if (>= (length staves) staff-number)
                (for-each
                  (lambda (ctx) (ly:context-mod-apply! ctx (staffMods size)))
                  (lset-difference
                    equal?
                    staves
                    (list (list-ref (reverse staves) (1- staff-number)))))))))
         ((finalize translator)
           (set! staves '()))))))
                 
printEmphazised =
#(define-void-function (sz staff mus)(number? integer? ly:music?)
  (let ((myLayout
         #{
           \layout {
             \context {
               \Score
               \consists #(emphasize-engraver sz staff)
             }
           }
         #}))
   (add-score #{ \score { $mus $myLayout } #})))
   

%%%%%%%%%%%%%%%%%%%%%
%% EXAMPLE
%%%%%%%%%%%%%%%%%%%%%

tonLeiter = {
  \key a \major
  <>\f^\markup\italic "con sordino"
  \repeat unfold 4 { c'4 c c' c' c' c' c' c' }
}

stimmeEins = {
  \transpose c' c''' \tonLeiter
}

stimmeZwei = {
  \transpose c' c'' \tonLeiter
}
stimmeDrei = {
  \clef alto
  \tonLeiter
}

stimmeVier = {
  \clef bass
  \transpose c' c \tonLeiter
}

music =
\new StaffGroup
  <<
\new Staff \stimmeEins
\new Staff \stimmeZwei
\new Staff \stimmeDrei
\new Staff \stimmeVier
  >>
 
%% Ofcourse the following could be the result of another function :)

%% whole score, first Staff emphasized
#(add-text #{ \markup \fill-line { "1. Stimme hervorgehoben" } #})
\printEmphazised #-3 #1 \music

%% whole score, second Staff emphasized 
#(add-text #{ \markup \fill-line { "2. Stimme hervorgehoben" } #})
\printEmphazised #-3 #2 \music

%% whole score, third Staff emphasized 
#(add-text #{ \markup \fill-line { "3. Stimme hervorgehoben" } #})
\printEmphazised #-3 #3 \music

%% whole score, fourth Staff emphasized
#(add-text #{ \markup \fill-line { "4. Stimme hervorgehoben" } #})
\printEmphazised #-3 #4 \music


Zitat von: Manuela
Zeig mir mal ein Notensatzprogramm, mit dem man das machen kann.
Tatsächlich habe ich schon Zeugnisse für meine Schüler mit LilyPond's markup-commands geschrieben, sowie einige noch kuriosere Sachen ...

Gruß,
  Harm
Titel: Re: Abstand zwischen Notenlinien / Abstand zwischen Systemen
Beitrag von: fugenkomponist am Mittwoch, 21. September 2016, 08:53
staffMods =
#(define-scheme-function (new-size) (number?)
  #{
  \with {
      fontSize = #new-size
      \override StaffSymbol.staff-space = #(magstep new-size)
      \override StaffSymbol.thickness = #(magstep new-size)
      \override Clef.font-size = #new-size
      \override KeySignature.font-size = #new-size
      \override NoteHead.color = #grey
      \override VerticalAxisGroup.default-staff-staff-spacing =
       #'((basic-distance . 0.5)
          (minimum-distance . 0.5)
          (padding . 0.5)
          (stretchability . 0.5))
    }
  #})
Kleine Anmerkung: Clef.font-size und KeySignature.font-size müssen und sollten hier nicht nochmal gesetzt werden, weil Schlüssel und Tonart schon durch fontSize = #new-size verkleinert werden. So werden sie zweimal verkleinert und sind damit zu klein.

Ansonsten aber interessant, was alles so geht :) Vielleicht hilft mir das zum Verstehen von Engravern.