Deutsches Lilypond Forum (Archiv)
Allgemein => Fragen zu Funktionen => Thema gestartet von: harm6 am Montag, 5. September 2011, 21:14
-
Hallo zusammen und hallo kilgore im besonderen!
Bei der Suche nach etwas ganz anderem bin ich über diesen (https://liarchiv.joonet.de/index.php?topic=828.0) bislang unbeantworteten Thread gestolpert. Da habe ich mich erinnert neulich an diesem Problem gearbeitet zu haben:
Der Code liefert zwei Funktionen:
\space ist eine leicht veränderte Fassung von Comper's \stretchMMR
\braceBar liefert die neue Klammer
Alles andere ist Zutat: Einregeln der Abstände, durchlaufende Taktzählung und das Ermöglichen problemloser Schlüssel-, Takt- und Tonart-Wechsel.
Leider muß \braceBar von Hand eingestellt werden, da es mir nicht gelungen ist diesen Wert zu automatisieren. Deshalb:
Wie kann ich die aktuelle Höhe einer StaffGroup auslesen?
\version "2.14.2"
rochadeAlpha = {
\override Score.BreakAlignment #'break-align-orders =
#(make-vector 3 '(left-edge
ambitus
breathing-sign
staff-bar
clef
key-cancellation
key-signature
time-signature
custos))
\once \override Score.TimeSignature #'space-alist = #'(
(first-note fixed-space . 2.0)
(right-edge extra-space . 0.5)
(staff-bar minimum-space . 2.5))
}
move = {
\rochadeAlpha
\once \override Score.BarLine #'extra-offset = #'(-1 . 0)
\once \override Score.SpanBar #'X-offset = #'-1
\once \override Score.Clef #'extra-offset = #'(-1 . 0)
\once \override Score.KeyCancellation #'extra-offset = #'(-1 . 0)
\once \override Score.KeySignature #'extra-offset = #'(-1 . 0)
\once \override Score.TimeSignature #'extra-offset = #'(-1 . 0)
}
onceTextLengthOn = {
\once\override TextScript #'extra-spacing-width = #'(0 . 0)
\once\override TextScript #'extra-spacing-height = #'(-inf.0 . +inf.0)
}
staffStop = {
\onceTextLengthOn
\stopStaff
\cadenzaOn
}
staffStart = {
\once\override Score.BarNumber #'break-visibility = #'#(#f #t #t)
\startStaff
\cadenzaOff
\set Staff.forceClef = ##t
}
braceBar =
#(define-music-function (parser location braceExt)(number?)
#{
#(define ((braceBarLine markup) grob)
(ly:stencil-combine-at-edge (ly:bar-line::print grob)
X LEFT (grob-interpret-markup grob markup) 0.4 0))
#(define braceMarkup
(make-line-markup
(list
(make-with-dimensions-markup '(0 . 0) '(0 . 0)
(make-translate-markup
(cons 0 (+ 0.2 (/ $braceExt -10)))
(make-left-brace-markup (+ $braceExt 20)))))))
\once\override Score.BarLine #'hair-thickness = #'1.6
\once \override Staff.BarLine #'stencil = #(braceBarLine braceMarkup)
\once \override Score.Clef #'(space-alist next-note) = #'(extra-space . 0)
\bar "|"
\move
#})
space =
#(define-music-function (parser location width) (number?)
#{
\staffStop
\onceTextLengthOn
s1*1/1000000-\markup \with-dimensions #(cons 0 $width) #'(0 . 0) \null
\once \override Score.Clef #'font-size = #'2
\staffStart
#})
%--------------------------- Test ----------------------------------------------
\paper {
ragged-right = ##f
}
one =
\relative c'' {
\key f \major
a1 b c d
\bar ":|"
%5
\space #8
\braceBar #92
\key d\major
\time 2/2
\grace s8 % trick to print the bar at correct position. TODO IN ALL VOICES !!
\bar "|:"
e4 e e e f4 f f f
\bar ":|"
}
two =
\relative c {
%1
\clef bass
\key f\major
a1 b c d
%5
\space #8
\clef treble
\key d\major
\grace s8 % trick to print the bar at correct position. TODO IN ALL VOICES !!
b'1 c
}
three =
\relative c, {
%1
\clef bass
\key f\major
a1 b c d
%5
\space #8
\key d\major
\grace s8 % trick to print the bar at correct position. TODO IN ALL VOICES !!
b1 c
}
\score {
%\new PianoStaff
\new GrandStaff
<<
\new Staff
<<
\new Voice \one
>>
\new Staff \two
\new Staff \three
>>
\layout { }
}
Gruß,
Harm
-
Hallo,
die erste Frage ist vielleicht nicht, wo man diesen Wert findet, sondern wann man diesen den erst auslesen kann.
Ohne gleich eine Lösung anbieten zu können:
- Beim »parsen« des Notationstextes sicherlich noch nicht.
- Beim »abspielen« sicher auch noch nicht.
- Auch mit einer »before-line-breaking«-Prozedur sicher auch noch nicht
- Wohl erst mit einer »after-line-breaking«-Prozedur.
Oder der Wert wird nicht von Anfang an mitgegeben, sondern mit einer GUILE-Funktion erst beim Ausleiten der Druckdaten vom »Grob« aus gesucht.
Ich habe allerdings bisher nur Versuche mit horizontalen Notenkopfpositionen relativ zum Notenhals gemacht - je nach (automatisch gewähltem) 'stemup' oder 'stemdown' mußte zwischen zwei forab übermittelten Werten (zum Notenkopf einge-tweak-t) entschieden werden.
Im Repository gibt es eine Funktion, die als »before-line-breaking« eingehängt, die Grob-Struktur nach oben auflistet. Diese hat mir schon nützliche Dienste geleistet.
Ich hoffe, diese Hinweise helfen etwas weiter.
-
Hallo Arnold,
vielen Dank für Deine Hinweise!
Die Höhe einer StaffGroup auszulesen ist dann ganz einfach, wenn man sich an den SystemStartBar hält. Aber es löst das Problem nicht.
Um den Code zu vereinfachen habe ich ein anderes Beispiel genommen: Das BreathingSign soll durch eine Linie ersetzt werden, die sich über alle Systeme einer StaffGroup erstreckt. (Im Moment wieder manuel eingestellt)
Die Höhe der aktuellen StaffGroup kann ich durch die start-bar-callback-Definition ablesen (start-bar-size). Diesen Wert habe ich dann benutzt um den SystemStartBar um die eigene Höhe zu verschieben.
Aber ich kann ihn auch wirklich nur benutzen, um den SystemStartBar zu manipulieren bzw ich verstehe nicht wie ich auf diesen Wert zugreifen kann, wenn ich die Linie für das BreathingSign bestimmen will.
Alle bisherigen Versuche führten zu einem Speicherzugriffsfehler.
Im übrigen denke ich, daß die »before-line-breaking«-Prozedur nicht zum Ziel führen wird. »after-line-breaking« mag funktionieren. Ich bin jetzt immer über »stencil« gegangen.
\version "2.14.2"
\header {
title = \markup \vspace #5
}
#(define (start-bar-callback grob)
(let* ((start-bar (ly:system-start-delimiter::print grob))
(start-bar-extent (ly:stencil-extent start-bar Y))
(start-bar-size (interval-length start-bar-extent))
(start-bar-red (ly:stencil-in-color start-bar 1 0 0)))
(ly:stencil-translate-axis start-bar-red start-bar-size Y)))
% führt zu:
% \override Score.SystemStartBar #'stencil = #start-bar-callback
bs =
#(define-music-function (parser location ext)(number?)
#{
#(define breathing-sign-markup
(make-line-markup
(list
"\\bs"
(make-with-dimensions-markup '(0 . 0) '(0 . 0)
(make-with-color-markup blue
(make-draw-line-markup (cons 0 $ext)))))))
\override BreathingSign #'text = #breathing-sign-markup
\breathe
#})
%-------------------------- Test -----------------------------------------------
one = {
\relative c' {
\override Score.SystemStartBar #'stencil = #start-bar-callback
a2 b c\bs #-13.0 d \break
a,, b'' c\bs #-22.5 d
}
}
two = {
\relative c {
\clef bass
a2 b c d
a'' b,, c d
}
}
\score {
\new StaffGroup <<
\new Staff \one
\new Staff \two
>>
}
Gruß,
Harm