Allgemein > Fragen zu Funktionen
Phrasierungsbögen an Text ausrichten / Custom TextSpannerEngraver
harm6:
Hallo,
vielen Dank für das Bild, sehr hilfreich für mich, um eine bessere Vorstellung zu bekommen was Dein Ziel ist.
Kann das Geschehen noch komplexer werden oder ist das Dein Maximalziel?
--- Zitat ---Ich habe ein Beispiel von dir gefunden, das Bögen setzt. https://liarchiv.joonet.de/index.php?topic=1422.msg7841#msg7841
Allerdings als markup und ohne Spanner.
--- Ende Zitat ---
Mittlerweile ist \undertie im source-code, also direkt nutzbar.
Aber ja, es ist ein markup, nichts sonst.
--- Zitat ---Ich habe darüber nachgedacht, ob und wie man einen eigenen Grob erzeugen kann.
Wäre es etwa möglich, sich vom PhrasingSlur_engraver einen Grob erzeugen zu lassen und den zu setzen?
Oder könnte man den PhrasingSlur_engraver kopieren und die Kopie im Voice Kontext einbinden?
Die Beispiele, die ich bisher für das Erstellen eines Engravers gefunden habe, sind mir leider noch zu kompliziert.
--- Ende Zitat ---
Tatsächlich habe ich auch schon über ein neues grob nachgedacht.
Aber das ist eine komplizierte Sache, mit einem engraver allein ist es nicht getan.
Hier ein Beispiel:
http://lists.gnu.org/archive/html/lilypond-user/2016-11/msg00012.html
Hat mich wesentliche Teile der letzten Sommerferien gekostet, das so Hinzukriegen.
Der PhrasingSlur_engraver selbst ist in C++ geschrieben, da kommt man als user ohne den sorce-code dann neu zu kompilieren nicht dran.
Natürlich kann man versuchen ihn in scheme neu zu schreiben. Das ist allerdings jenseits meiner Fähigkeiten, da ich C++ nicht kann.
Könntest Du mal den code für das Bild posten, ohne die Bögen?
Mich interessiert wie Du das ansonsten angelegt hast.
Gruß,
Harm
xr:
--- Code: ---Kann das Geschehen noch komplexer werden oder ist das Dein Maximalziel?
--- Ende Code ---
Maximalziele ändern sich leider mit jedem neuen Stück. Und ja, manchmal sind auch noch Noten oder markups daneben/dazwischen.
Aber ich wäre schon zufrieden, wenn ich Bögen in Lilypond bereits anlegen kann. Und je mehr ich beachten kann und je weniger ich in der Ausgabedatei noch nachträglich bearbeiten muss, desto besser. Momentan kann ich halt gar keine Bögen eintragen. Wenn sich dann Stücke in der Probephase häufiger ändern, muss ich jedesmal alle Bögen von Hand wieder nachtragen. Das dauert und nervt. Und ich vergesse auch schonmal welche.
--- Zitat ---Hier ein Beispiel:
http://lists.gnu.org/archive/html/lilypond-user/2016-11/msg00012.html
Hat mich wesentliche Teile der letzten Sommerferien gekostet, das so Hinzukriegen.
--- Ende Zitat ---
Schaue ich mir an.
;D Ob Computer wirklich eine Zeitersparnis sind, wenn man besondere Lösungen braucht? (frage ich mich häufiger) Handarbeit ist ja auch was Tolles.
--- Zitat ---Könntest Du mal den code für das Bild posten, ohne die Bögen?
Mich interessiert wie Du das ansonsten angelegt hast.
--- Ende Zitat ---
Das muss ich erst aus mehreren Dateien auseinanderklamüsern. kommt die Tage ...
xr:
--- Zitat ---Hier ein Beispiel:
http://lists.gnu.org/archive/html/lilypond-user/2016-11/msg00012.html
Hat mich wesentliche Teile der letzten Sommerferien gekostet, das so Hinzukriegen.
--- Ende Zitat ---
Habe ich gerade reingeschaut. Da brauche ich bis zu den Sommerferien, um da was zu verstehen. 8)
xr:
So, habe den Code für das Bild doch eben zusammenkopiert.
Da können durchaus doppelte oder unwirksame Einstellungen drin sein. Der Code ist schon was älter, und so lange er funktionierte, hatte ich kein Bedarf ihn zu überarbeiten.
Außerdem hatte ich doch falsch in Erinnerung, was welche Stimme macht.
Der oberste Staff enthält die Noten für StimmeA (sind in diesem Beispiel ausgeblendet, können aber bei Bedarf wieder eingeblendet werden)
Der mittlere Staff enthält Noten und Lyrics für StimmeA und StimmeB. Noten sind ausgeblendet.
Der unterste wie oberste für StimmeB.
Heute würde ich Scores für Duos wohl anders konzipieren, damit sie einfacher um Stimmen zu erweitern sind und jede Stimme auch gleich funktioniert. Bei Scores für mehr als zwei Stimmen habe ich das auch schon gemacht.
Töne und Text wurden mit einem Python Script erzeugt, das mir eine andere Eingabedatei übersetzt. Daher das gestreckte Format.
--- Code: ---\version "2.18.2"
\header {
title = "Example"
}
\paper {
system-system-spacing.padding = #0
system-system-spacing.basic-distance = #0
system-system-spacing.minimal-distance = #0
score-markup-spacing.basic-distance = #0
score-markup-spacing.minimal-distance = #0
score-system-spacing.minimal-distance = #0
score-system-spacing.basic-distance = #0
indent = 0.0\cm
print-page-number = ##t
print-first-page-number = ##t
oddHeaderMarkup = \markup \null
evenHeaderMarkup = \markup \null
oddFooterMarkup = \markup {
\fill-line {
\on-the-fly #print-page-number-check-first
\fromproperty #'page:page-number-string
}
}
evenFooterMarkup = \oddFooterMarkup
myStaffSize = #18
#(define fonts
(make-pango-font-tree "Trebuchet MS"
"Nimbus Sans"
"Luxi Mono"
(/ myStaffSize 20)))
}
dummy = {
\once \omit Score.TimeSignature
\once \omit Score.Clef
\partial 64
\once \hideNotes
b64
\once \omit Score.BarLine
}
farbe = #(x11-color 'grey65)
Layout-Noten = {
% Farben
\override Voice.NoteHead.color = \farbe
\override Voice.Stem.color = \farbe
\override Voice.Beam.color = \farbe
\override Voice.TupletNumber.color = \farbe
\override Voice.Dots.color = \farbe
\override Voice.Rest.color = \farbe
\override Staff.BarLine.color = #white
\override Voice.DynamicText.color = #red
\override Staff.StaffSymbol.line-count = #0
\override Staff.NoteHead.font-size = #-4
% Hals
\override Voice.Stem.length = #3
\override Voice.Stem.thickness = #1
% Hals mit Balken
\override Voice.Stem.length-fraction = #0.6
\override Voice.Flag.font-size = #-5
\override Voice.Beam.beam-thickness = #0.3
\override Voice.Beam.length-fraction = #0.6
\override Voice.Beam.auto-knee-gap = #0.1
\override Voice.Beam.gap = #0.
\override TupletBracket.stencil = ##f
% Abstand Akzente
\override Staff.Script.padding = #1
\override Voice.Script.color = #red
}
Layout = {
\override Staff.StaffSymbol.line-count = #1
\override Staff.StaffSymbol.thickness = #0.2
\override Staff.Stem.transparent = ##t
% Hals
\override Voice.Stem.length = #2
% Hals mit Balken
\override Voice.Stem.length-fraction = #0
\override Staff.NoteHead.font-size = #-100
% Balken
\override Voice.Beam.beam-thickness = #0
\override Voice.Beam.length-fraction = #0
\override Voice.Dots.stencil = ##f
\override Voice.Stem.stencil = ##f
\override Voice.Flag.stencil = ##f
\override Voice.TupletNumber.stencil = ##f
\override Staff.TextScript.stencil = ##f
\override Staff.Rest.stencil = ##f
\override Staff.BarLine.bar-extent = #'(-.8 . .8)
\override Staff.BarLine.hair-thickness = #'1.5
}
abstand = {
\override
VerticalAxisGroup.default-staff-staff-spacing =
#'((basic-distance . 0)
(minimum-distance . 0)
(padding . 0)
)
}
us-oT = {
\override Voice.Beam.stencil = ##f
\override Voice.Stem.stencil = ##f
\override Voice.Flag.stencil = ##f
\override Voice.NoteHead.transparent = ##t
\override Voice.Dots.transparent = ##t
\override Staff.BarLine.stencil = ##f
\override Voice.Script.Y-offset = #0
}
%% StimmeA-Toene bis SimmeB-Worte werden mit Code erzeugt,
%% daher der langgestreckte Satz.
StimmeA-Toene = \relative c''
{\stemUp \dummy
\us-oT
\time 1/4
b4 |
b4 |
b4 |
b4 |
b4 |
b4 |
b4 |
s4 |
s4 |
b4 |
b4 \break
|
s4 |
b4 |
s4 |
b4 |
b4 |
s4 |
b4 |
s4 |
b4 \break
|
s4 |
b4 |
s4 |
b4 |
s4 |
b4 |
s4 |
b4 |
s4 |
b4 |
s4 |
b4 |
s4 \break
|
}
StimmeB-Toene = \relative c''
{\stemDown \dummy
\us-oT
\time 1/4
s4 |
s4 |
s4 |
s4 |
s4 |
s4 |
s4 |
b4 |
b4 |
s4 |
s4 |
b4 |
s4 |
b4 |
s4 |
s4 |
b4 |
s4 |
b4 |
s4 |
b4 |
s4 |
b4 |
s4 |
b4 |
s4 |
b4 |
s4 |
b4 |
s4 |
b4 |
s4 |
b4 |
}
StimmeA-Worte = {
\lyricsto first {
dummi \new dummy{}
\new standard {
}
\new fly {
nach dem Schleicher durch den gelben Sand
ist also ungerichtet die Reihe
ziel ist leicht es
wa ss au ma
}
}
}
StimmeB-Worte = {
\lyricsto second {
dummi \new dummy{}
\new standard {
}
\new fly {
ihr
Suchen weitestgehend da
so los vie ist
das s ie s
cht
}
}
}
\score {
<<
\new Staff
\with {
\Layout-Noten
\abstand
\override Staff.Rest.Y-offset = #0.8
\override Staff.Script.direction = #UP
\dynamicUp
}
\StimmeA-Toene
\new Staff = "staff_mitte"
\with {
\Layout
\abstand
}
<<
\Layout
\override Staff.StaffSymbol.color = #farbe
\new Voice = "first"
\StimmeA-Toene
\new Voice = "second"
\StimmeB-Toene
>>
\new Lyrics
\with { alignAboveContext = "staff_mitte" }
\StimmeA-Worte
\new Lyrics
\with { \override LyricText.extra-offset = #'(0 . -.6) }
\StimmeB-Worte
\new Staff
\with {\Layout-Noten
\override Staff.Rest.Y-offset = #-0.8 }
\StimmeB-Toene
>>
\layout {
\context {
\Score
\remove "Bar_number_engraver"
\remove "Bar_engraver"
}
\context {
\Staff
\remove "Time_signature_engraver"
\remove "Clef_engraver"
}
\context {
\Lyrics
\remove "Hyphen_engraver"
\remove "Lyric_engraver"
\accepts "fly"
\accepts "standard"
\accepts "dummy"
}
\context {
\name standard
\type "Engraver_group"
\consists "Bar_engraver"
\consists "Lyric_engraver"
\consists "Hyphen_engraver"
\override LyricText.self-alignment-X = #0
\alias Lyrics
}
\context {
\name fly
\type "Engraver_group"
\consists "Lyric_engraver"
\consists "Hyphen_engraver"
\override LyricText.self-alignment-X = #-1
\override LyricSpace.minimum-distance = #.6
\override BarLine.bar-extent = #'(0 . 0)
\alias Lyrics
}
\context {
\name dummy
\type "Engraver_group"
\alias Lyrics
}
}
}
--- Ende Code ---
xr:
Ich habe noch zwei weitere Lösungsansätze.
Der erste ist, mehrere Phrasing_slur_engraver zu registrieren mit:
--- Code: ---\layout {
\context {
\Voice
\consists "Phrasing_slur_engraver"
\consists "Phrasing_slur_engraver"
\consists "Phrasing_slur_engraver"
\override PhrasingSlur.avoid-slur = #'inside
}
}
--- Ende Code ---
Beispiel:
--- Code: ---\version "2.18.2"
#(define counter 0)
#(define (shape-slurs grob)
(let* (
;; original ControlPoints
(cps (ly:slur::calc-control-points grob)))
; shift Control-Points x and y by counter
(set! cps (map
(lambda (xy)
(cons (+ (car xy) counter) (+ (cdr xy) counter))
)
cps)
)
(ly:grob-set-property! grob 'control-points cps)
; kill grob nr 3
(if (= counter 3)
(ly:grob-suicide! grob)
)
(set! counter (+ counter 1))
)
)
shapeSlur =
#(define-music-function (parser location)
()
#{
\override Staff.PhrasingSlur.cross-staff = ##t
\override Staff.PhrasingSlur.after-line-breaking = #shape-slurs
#})
txtB = {
\lyricsto melody {
Ut enim ad minim veniam, quis nostrud exercitation ullamco
laboris nisi ut aliquid ex ea commodi consequat. Quis aute
}
}
noten =
\relative c'' {
\shapeSlur
c1 c c c \break
c c c c
c \(c c c
c c c\) c
}
\score {
<<
\new Staff
\new Voice = "melody"
\noten
\new Lyrics
\txtB
>>
\layout {
\context {
\Voice
\consists "Phrasing_slur_engraver"
\consists "Phrasing_slur_engraver"
\consists "Phrasing_slur_engraver"
\override PhrasingSlur.avoid-slur = #'inside
}
}
}
--- Ende Code ---
Hier wird jeder Phrasierungsbogen 4x gesetzt. Die Phrasierungsbögen können mit Scheme abgefangen und wieder gelöscht werden.
Auf diese Art ist es möglich, gleichzeitig mehrere Phrasierungsbögen zu setzen.
Allerdings scheinen mir in der Zählzeit versetzte Bögen einen komplizierten Rattenschwanz an Abfragen im Code nach sich zu ziehen.
Und den Vorteil, den Phrasierungsbögen haben, nämlich dass sie Kollisionen vermeiden, hat man mit der Einstellung \override Staff.PhrasingSlur.cross-staff = ##t ohnehin schon aufgegeben.
Daher werde ich jetzt wohl mal einen zweiten Lösungsansatz verfolgen:
Direktes Zeichnen der Bögen in einem Markup.
z.B.
--- Code: ---samplePath =
#'((moveto 0 0)
(lineto 0 0)
(curveto 0 0 5 3.3 10 1 )
(curveto 10 1 5 3 0 0 )
(closepath)
)
%% und einfügen mit:
\markup { \override #'(filled . #t) \path #0.1 #samplePath }
--- Ende Code ---
Ich werde jetzt mal schauen, ob und wie ich die Punkte berechnen kann.
Könnte man vielleicht eigene Spanner erzeugen und mit zwei Befehlen Anfang und Ende eines Spanners in den VerticalAxisGroups eintragen, an denen sich dann die ControlPoints einer Kurve orientieren lassen?
Gruß,
Xaver
Navigation
[0] Themen-Index
[#] Nächste Seite
[*] Vorherige Sete
Zur normalen Ansicht wechseln