Hallo allerseits,
ich hatte heute folgende Idee: es wär doch schön, wenn man (z. B. in Orchesterstücken mit vielen Taktwechseln und wenig Schlagwerkeinsätzen oder beim Komponieren) sagen könnte „Ab hier will ich jetzt ne Pause bis Takt X.“ oder auch „… bis Probenziffer Y.“
Ich hab einiges rumprobiert, werd aber nicht so richtig schlau und hab nichts Sinnvolles zum Laufen gebracht. Meine Ideen bisher:
• Mit ly:context-property kriegt man Dinge wie die aktuelle Taktzahl und -länge raus. Dafür brauch ich aber nen Kontext. Hab was gelesen über \applyContext, hab aber keine Ahnung, ob das die richtige Herangehensweise ist.
• Geht das evtl. mit nem neuen Engraver? Wenn ja, wie wird der dann angesprochen? Was ich vermute: Ich müsste ein neues TacetEvent definieren (hab aber keine Ahnung, wie) und dann würde \tacetUntil einfach ein solches setzen, der TacetEngraver darauf hören und entsprechend eine Pause einfügen.
• Man könnte als ersten Schritt (bis die beiden Fragen oben geklärt sind) erstmal das ganze ohne Taktwechsel und nur mit Taktzahlen als Ziel probieren, bis es läuft, und dann ausbauen (dann kann man nicht einfach mehr die Differenz von aktueller und angepeilter Taktzahl mit der Taktlänge multiplizieren, sondern muss sich von Takt zu Takt hangeln, dafür kann man auch gleich nach \marks Ausschau halten).
• Man könnte zu guter Letzt noch drei Varianten definieren: \restUntil baut ne MultiMeasureRest (R…), \skipUntil ne Platzhalterpause (s…), und \tacetUntil macht nen \stopStaff, Ansage „tacet bis“, \startStaff beim Zieltakt (also ein echtes Überspringen, hab ich so schon ab und zu in Schlagzeugstimmen gesehen).
Ich habe leider nirgends eine gute Beschreibung gefunden,
1. wie man nen Engraver schreibt und
2. was für Typen es gibt und ich rausfinde, welche Funktionen welche Typen haben.
Hier mal einer von vielen Versuchen. Wär ich mit Zeile 13 (auskommentiert) statt Zeile 12 schon da? Nicht ganz, weil es nicht kompiliert (es wird ein Prob – was auch immer das ist – erwartet, keine Duration). Sonst schon?
\version "2.19.22"
tacetUntil =
#(define-music-function (targetBar) (integer?)
#{
\applyContext
#(lambda (context)
(let* ((currentBar (ly:context-property context 'currentBarNumber))
(currentMeasureLength (ly:moment-main (ly:context-property context 'measureLength)))
(difference (- targetBar currentBar))
(product (* currentMeasureLength difference)))
(write product)))
%(mmrest-of-length (ly:make-duration 0 0 product))))
#})
%\displayMusic
\relative {
\override Score.BarNumber #'break-visibility = #'#(#t #t #t)
\time 3/4
c'2.
\tacetUntil #5 % wir sind am Anfang von Takt 2, brauchen also eine Pause von 2.*3=9/4
c2.
}Kann mir da jemand auf die Sprünge helfen? Ich brauche/möchte keine fertige Lösung, aber ohne Plan von den Typen und ob ein Engraver nötig ist bzw. wo ich rauskriege, wie ich einen schreibe, komm ich grad nicht weiter
