Autor Thema: Incipit-Lösung  (Gelesen 2109 mal)

prott

  • Member
Incipit-Lösung
« 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
  }
}



RobUr

  • Member
Re: Incipit-Lösung
« Antwort #1 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:
  • Gestört hat mich immer, dass die eigentlichen Instrumentenbezeichner zu weit rechts stehen und die Incipitzeile fast berühren. Dies kann im Snippet selbst durch die zusätzliche Zeile \override InstrumentName.extra-offset = #'(-2 . 0) individuell justiert werden. Darauf hatte man selbst durch Anpassen von indent und incipit-width keinen nennenswerten Einfluss, ohne das horizontale Spacing zu zerstören.
  • Die vertikale Ausrichtung der Incipitzeile, auch in Verbindung mit LyricText, stellt sich als wesentlich einfacher heraus, als bisher codiert. Das Problem war, dass im Snippet unnötig vertikal hin und her geschoben wurde. Zuerst vertikal obenbündig ausrichten, dann der VerticalAxisGroup eine feste Ausdehnung zuweisen und anschließend um die Hälfte wieder verschieben >:( Instrumentenbezeichner sind per default vertikal zentriert am Staff ausgerichtet; das kann man also lassen, wie es ist. Dadurch braucht man sich auch nicht mehr um LyricText kümmern, der sonst in die vertikale Berechnung einbezogen würde (wird stattdessen auf Höhe der eigentlichen Lyrics platziert).
  • Peter schreibt, dass das Snippet incipit-width benutzt. Das ist nicht ganz richtig. Das Snippet stellt die horizontale Breite incipit-width zur Verfügung. Wird diese Breite nicht explizit angegeben, wird incipit-width auf die Hälfte der indent-Breite (default: 15\mm; wird auf Papierformat skaliert) gesetzt.
  • Das Spacing innerhalb des Incipits habe ich von Peter übernommen. Wichtig hierbei: die proportionale Skalierung auf ganze Noten. Für die Notation bedeutet dies:
    • Alle Dauern müssen manuell auf die Dauer einer ganzen Note skaliert werden, z.B. r\longa*1/4, d2*2 oder a1.*2/3.
    • Die Anzahl der Objekte (Noten und Pausen) muss in allen Zeilen übereinstimmen. Fehlende Objekte müssen durch spacer rests (s1) aufgefüllt werden, sonst sieht die horizontale Verteilung nicht schön aus.
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