Deutsches Lilypond Forum (Archiv)
Allgemein => Fragen zu Funktionen => Thema gestartet von: iugin am Sonntag, 25. Oktober 2015, 19:16
-
Hallo miteinander
nach langer Abwesenheit melde ich mich wieder mit einem Problem, das ich nicht lösen kann.
Ich möchte in einer Partitur die Takte gruppieren, und z.B. nach vier Takten ein dickes Taktstrich setzen. Das ist kein Problem.
Nur: ich möchte, dass dieser Taktstrick durch alle Systeme geht, unabhängig davon, ob die Systeme gruppiert sind oder nicht.
ChoirStaff hat kein Span_bar_engraver. Ich kann es mit
\layout {
\context {
\Score
\consists "Span_bar_engraver"
}
}hinfügen, aber dann habe ich überall durchgehende Taktstriche.
Kann ich diesen Engraver nur dort hinfügen, wo ich es brauche?
Hier ein bisschen Code:
\version "2.18.2"
dickesBar = {
\once \override Score.BarLine #'hair-thickness = #7
}
\score {
<<
\new StaffGroup <<
\new Staff { a'1 a' \dickesBar a'}
\new Staff { a'1 a' a'}
>>
\new ChoirStaff <<
\new Staff { a'1 a' a'}
\new Staff { a'1 a' a'}
>>
>>
}
Ich danke euch für eure Hilfe und wünsche einen schönen Abend
Liebe Grüsse
Eugenio
-
Kann ich diesen Engraver nur dort hinfügen, wo ich es brauche?
Nicht dass ich wüsste. Zu jedem Kontext gehört ein Engraver entweder ganz oder gar nicht (bitte korrigiert mich, wenn ich falsch liege).
Ein bisschen in die richtige Richtung könnte folgendes gehen:\version "2.18.2"
dickesBar = {
\once \override Score.BarLine #'hair-thickness = #7
\once \undo \hide Score.SpanBar
}
\layout {
\context {
\Score
\consists "Span_bar_engraver"
\hide SpanBar
}
}
\score {
<<
\new StaffGroup <<
\new Staff { a'1 a' \dickesBar a'}
\new Staff { a'1 a' a'}
>>
\new ChoirStaff <<
\new Staff { a'1 a' a'}
\new Staff { a'1 a' a'}
>>
>>
}
Allerdings werden da bei normalen Taktstriche auch die StaffGroup-SpanBars versteckt, nicht nur diejenigen, die zum Score, aber keiner StaffGroup gehören.
Edit: Bin mir gerade nicht sicher, ob \once \undo \hide unter 2.18.2 schon funktioniert, ich hab hier gerade nur 2.19.28 …
-
Hallo fugenkomponist
danke für deine Antwort :)
Eine ähnliche Lösung hatte ich auch, aber eben, das Problem war, dass dann im StaffGroup die Taktstriche zwischen den Systemen fehlen.
Ich denke auch, dass die Engraver entweder gesetzt werden oder nicht, aber ich habe gedacht, ich frage mal...
Wenn es so ist, ist kein Problem, ich werde es überleben ;)
Einen lieben Gruss
Eugenio
Ps: in 2.18.2 \once \undo \hide funktioniert.
-
Du könntest mal auf der englischen Liste fragen (oder vielleicht kommt auch so ein LilyPond-Experte wie z. B. harm hier noch vorbei); nur weil ich nicht weiter weiß, heißt das noch nicht, daß es nicht geht ;)
-
Nicht besonders schön, aber scheint zu klappen:
\version "2.18.2"
#(define ((my-test-engraver thickness amount) context)
`((acknowledgers
(bar-line-interface .
,(lambda (engraver grob source-engraver)
(if (zero? (modulo (ly:context-property context 'currentBarNumber) amount))
(begin
(set! (ly:grob-property grob 'hair-thickness) thickness)
(set! (ly:grob-property grob 'allow-span-bar) #t))))))))
\score {
<<
\new StaffGroup <<
\new Staff
%% SpanBar is removed in layout, but we want one below this Staff
\with { \override BarLine.allow-span-bar = ##t }
\repeat unfold 9 { a'1 }
\new Staff
\repeat unfold 9 { a'1 }
>>
\new ChoirStaff
<<
\new Staff \repeat unfold 9 { a'1 }
\new Staff \repeat unfold 9 { a'1 }
>>
>>
\layout {
\context {
\Staff
%% every 4th bar a BarLine with hair-thickness 7:
\consists #(my-test-engraver 7 4)
}
\context {
\Score
%% SpanBars are possible/allowed everywhere in Score
\consists "Span_bar_engraver"
%% generally, don't print them
\override BarLine.allow-span-bar = ##f
}
}
}
HTH,
Harm
(oder vielleicht kommt auch so ein LilyPond-Experte wie z. B. harm hier noch vorbei)
Du bist doch selbst schon längst ein Experte!! ;)
EDIT:
Fehler im code korrigiert
Kommentare ergänzt
-
Du bist doch selbst schon längst ein Experte!! ;)
Ok, ich hab tatsächlich einiges gelernt in den letzten sechs Jahren, besonders diesen Sommer :) Aber ich kannte z. B. die Property 'allow-span-bar nicht, bin ehrlich gesagt auch nicht darauf gekommen, daß es sowas geben könnte, und hab deshalb nicht in die IR geschaut …
Und ich hab z. B. immer noch keine Ahnung, wie man nen Engraver schreibt. Hab zwar Beispiele gesehen, aber bisher noch nichts selbst auf die Reihe gekriegt (auch nur einmal probiert, bin da aber grandios gescheitert und hab ne andere Lösung gefunden).
-
Und ich hab z. B. immer noch keine Ahnung, wie man nen Engraver schreibt. Hab zwar Beispiele gesehen, aber bisher noch nichts selbst auf die Reihe gekriegt (auch nur einmal probiert, bin da aber grandios gescheitert und hab ne andere Lösung gefunden).
In den Regressiontests (http://www.lilypond.org/doc/v2.19/input/regression/collated-files.html) gibt es ein paar Beispiele.
‘scheme-engraver-instance.ly’
‘scheme-engraver.ly’
In:
‘scheme-text-spanner.ly’
würde ich nicht schauen, zu komplex.
Für den Anfang würde ich mich auf listeners bzw acknowledgers beschränken, das ist für die meisten Fälle sowieso hinreichend.
In den Regtests wird allerdings David's makro `make-engraver' benutzt, ich komme besser mit der reinen scheme-Liste klar, da die Struktur für mich klarer ist, aber schau selbst.
engraver zu programmieren ist wahrlich nichts für Anfänger. Es ist noch nicht lange her, daß ich jeden erfolgeichen Versuch rot im Kalender markiert habe ;)
Wenn Du Fragen hast werde versuchen(!) zu antworten...
Gruß,
Harm
-
Liebe alle
Lieber Harm
danke vielmals! Es funktioniert prima! Es ist also, wie alles in Lilypond, möglich :)
Jetzt noch eine Frage: wäre es möglich den Code so zu verändern, dass ich einen dicken Taktstrich dort einsetzen kann wo ich will? So etwas wie:
{
c4 c4 c4 c4 |
c4 c4 c4 c4 \bigBar
c4 ...
Wenn es aber ein zu grosser Aufwand wäre, bitte lassen. Ich meine: bis vor ein paar Jahren hatte ich alles mit Bleistift gemacht. Jetzt dass ich Lilypond benutze, möchte alles mit ihm machen, ist aber nicht nötig (auch wenn es Spass macht) ;)
Lieber Gruss
Eugenio
-
Wenn Du die dicken durchgehenden Taktstriche manuell setzen willst kann man auf den engraver sogar verzichten:
\version "2.18.2"
dickesBar = {
\once \override Score.BarLine.hair-thickness = #7
\once \override Score.BarLine.allow-span-bar = ##t
}
bar-voice = {
s1
\dickesBar
s1*2
\dickesBar
s1*3
\dickesBar
s1*2
\dickesBar
s1
}
\score {
<<
\new StaffGroup <<
\new Staff
%% SpanBar is removed in layout, but we want one below this Staff
\with { \override BarLine.allow-span-bar = ##t }
<< \repeat unfold 9 { a'1 } \bar-voice >>
\new Staff
\repeat unfold 9 { a'1 }
>>
\new ChoirStaff
<<
\new Staff \repeat unfold 9 { a'1 }
\new Staff \repeat unfold 9 { a'1 }
>>
>>
\layout {
\context {
\StaffGroup
\remove "Span_bar_engraver"
}
\context {
\Score
\consists "Span_bar_engraver"
\override BarLine.allow-span-bar = ##f
}
}
}
HTH,
Harm
-
:-D
Hey, danke! So einfach war das! Mist, manchmal kommt man sich schon ein bisschen blöd vor... :-)
Einen lieben Gruss und einen schönen Tag
Eugenio