Deutsches Lilypond Forum (Archiv)

Allgemein => Fragen zu Funktionen => Thema gestartet von: prott am Montag, 20. April 2015, 23:31

Titel: Incipit-Lösung
Beitrag von: prott am Montag, 20. April 2015, 23:31
Guten Abend,

In einem anderen Thread wurde nach einer Kontrolle der Abstände in Incipits gefragt. Da ich die meisten Probleme bei Incipits für mich gelöst habe, möchte ich meinen Code posten. Er baut auf einem Scheme-Code aus dem LSR auf (den habe ich vor ein paar Jahren kopiert und auch durch convert-ly gejagt - das hat zu meinem großen Erstaunen das Upgrade überlebt).

Ein paar Sachen sind zu sagen:
- Ohne den "instrument name" wird das Incipit nicht eingebunden, da es diesen manipuliert
- Die Abstandskontrolle funktioniert so, daß erst einmal alles in dem Incipit auf strikt proportionale Abstände geschaltet wird und dann alle Notenwerte künstlich gleich lang werden: r\breve*1/2 ist das Zeichen für eine Brevis, das die halbe Dauer einnimmt
- Die Scheme-Funktion benutzt incipit-width, um die Länge des Incipits festzulegen. Ohne das wird rigoros komprimiert.
- Eine etwas einfachere Methode für einen verschobenen Petrucci-Baßschlüssel ist inklusive, meiner Erinnerung nach geht das nicht bei einem mensural-Baßschlüssel
- Die Art, wie die doppelten Vorzeichen entstehen, gibt es erst ab Version 2.18

Ich hoffe, das hilft.
Peter

\version "2.18.0"

% Create an incipit. Usage: \incipit \cantusincipit
% cantusincipit is more or less a normal voice.

incipit =
#(define-music-function (parser location incipit-music) (ly:music?)
  #{
    \once \override Staff.InstrumentName.self-alignment-X = #RIGHT
    \once \override Staff.InstrumentName.self-alignment-Y = #UP
    \once \override Staff.InstrumentName.Y-offset =
      #(lambda (grob)
         (+ 4 (system-start-text::calc-y-offset grob)))
    \once \override Staff.InstrumentName.padding = #0.3
    \once \override Staff.InstrumentName.stencil =
      #(lambda (grob)
         (let* ((instrument-name (ly:grob-property grob 'long-text))
                (layout (ly:output-def-clone (ly:grob-layout grob)))
                (music (make-sequential-music
                        (list (context-spec-music
                               (make-sequential-music
                                (list (make-property-set
                                       'instrumentName instrument-name)
                                      (make-grob-property-set
                                       'VerticalAxisGroup
                                       'Y-extent '(-4 . 4))))
                               'MensuralStaff)
                              incipit-music)))
                (score (ly:make-score music))
                (mm (ly:output-def-lookup layout 'mm))
                (indent (ly:output-def-lookup layout 'indent))
                (width (ly:output-def-lookup layout 'incipit-width))
                (incipit-width (if (number? width)
                                   (* width mm)
                                   (* indent 0.5))))

           (ly:output-def-set-variable! layout 'indent (- indent
                                                          incipit-width))
           (ly:output-def-set-variable! layout 'line-width indent)
           (ly:output-def-set-variable! layout 'ragged-right #f)
           (ly:output-def-set-variable! layout 'ragged-last #f)
           (ly:output-def-set-variable! layout 'system-count 1)
           (ly:score-add-output-def! score layout)
           (ly:grob-set-property! grob 'long-text
                                  (markup #:score score))
           (system-start-text::print grob)))
  #})


% ----------------------------------------------------------------------------

mypieceBassIncipit = <<
  \new MensuralVoice = "bassIncipit" <<
    \repeat unfold 3 {s1 \noBreak}
    {
      \override NoteHead.style = #'petrucci
      \override Rest.style = #'mensural
      \set Score.proportionalNotationDuration = #(ly:make-moment 1/1)
      \override Score.SpacingSpanner.uniform-stretching = ##t
      \override Score.SpacingSpanner.strict-note-spacing = ##t
      \override Staff.KeySignature #'flat-positions = #'((-5 . 5))
      \clef "petrucci-f3"
      \key g \dorian
      \time 4/4
      r\breve*1/2 r4*4/1 g
    }
  >>
  \new Lyrics \lyricsto bassIncipit { "BA-" }
>>

% ----------------------------------------------------------------------------

mypieceBassNotes = \relative g {
 R1 R r4 g f e d1
}

% ----------------------------------------------------------------------------

\score {
  \new Staff <<
    \key g \dorian
    \clef "bass"
    \set Staff.instrumentName = "Bassus"
    \incipit \mypieceBassIncipit
    \mypieceBassNotes
  >>

  \layout {
    indent = 6.6\cm
    incipit-width = 4.8\cm
  }
}


Titel: Re: Incipit-Lösung
Beitrag von: RobUr am Mittwoch, 29. April 2015, 18:25
Hallo alle, hallo Peter,

auch ich habe mich nochmal eingehend mit Incipits befasst. Basierend auf dem (überschaubareren) LSR-Snippet #582 (http://lsr.di.unimi.it/LSR/Item?id=582) und Peters Ansatz, die Notendauern zu skalieren (prima Idee, Peter!), habe ich die für mich wichtigsten Anforderungen fast vollständig umsetzen können:
Nicht beheben konnte ich, dass trotz \once \override Staff.InstrumentName.self-alignment-X = #RIGHT die Ausrichtung nicht nur für instrumentName, sondern auch für shortInstrumentName festgelegt wird. Deshalb kann die Angabe eines shortInstrumentName nicht gleichzeitig erfolgen, sondern leider erst in der jeweiligen Stimme nach Auftreten der ersten Note/Pause. Die shortInstrumentNames werden sonst ebenfalls rechtsbündig gesetzt :( Vielleicht weiß jemand Abhilfe???

Hier nun mein Codebeispiel (der Zeichenanzahl wegen als Anhang). Es ist sehr ausführlich und mit vielen Anpassungen versehen, die zum Experimentieren einladen sollen. Ihr könnt es gern als Vorlage verwenden und nach eigenem Geschmack gestalten!

Gruß, Robert