Hi Urs, I went through this a couple of months ago, and it *seems* possible to use markups (and paths) as legitimately new articulations (maybe -- and happily -- in contradiction to the assumption in your original post, if I'm reading correctly).
Here's the pattern as a MWE: %%% BEGIN NOVEL ARTICULATION USING MARKUP %%% baca-damp-markup = \markup \scale #'(0.75 . 0.75) \combine \bold \override #'(font-name . "Times") "O" \path #0.15 #'( (moveto -.4 .7) (rlineto 2.4 0) (closepath) (moveto .8 -.5) (rlineto 0 2.4) ) #(append! default-script-alist (list `("bacadamp" . ( (stencil . ,ly:text-interface::print) (text . ,baca-damp-markup) (avoid-slur . around) (padding . 0.20) (script-priority . 125) (side-relative-direction . ,DOWN) (skyline-horizontal-padding . 0.20) ;;(toward-stem-shift . 0.5) )))) baca-damp = #(make-articulation "bacadamp") \layout { \context { \Score scriptDefinitions = #default-script-alist } } %%% END %%% You can then write ... \new Staff { c'4 \baca-damp } ... and get ... [image: novel-articulation.png] ... as output. To note: 1. Apologies for not yet crediting the various posts in the archives that made this possible; it was a weekend or two of reading through various breadcrumbs on the list that made the pattern possible. 2. The baca- prefix is a namespacing convention since I'm always mixing with modules in Python. Replace as necessary if the snippet works for you. 3. Wrt to your three initial criteria, the example above demonstrates #1 ("no postfix operator"). Because the symbol created is a legit script, overrides like "\override Script.staff-padding = 5" do work. So maybe this helps meet your #2 ("common vertical baseline"). I'm not certain about your #3 ("pushes notecolumns to obtain the necessary space"). But some testing seems to show that **if you explicitly specify the font of markup** then Lily can find a stencil (and move note columns). %%% BEGIN WIDE EXAMPLE %%% estr-markup = \markup \override #'(font-name . "Times") "ESTREMAMENTE" #(append! default-script-alist (list `("articestr" . ( (stencil . ,ly:text-interface::print) (text . ,estr-markup) (avoid-slur . around) (padding . 0.20) (script-priority . 125) (side-relative-direction . ,DOWN) (skyline-horizontal-padding . 0.20) ;;(toward-stem-shift . 0.5) )))) estr = #(make-articulation "articestr") \layout { \context { \Score scriptDefinitions = #default-script-alist } } %%% END %%% Then ... \new Staff { c'4 d'4 \estr e'4 f'4 } ... gives ... [image: wide-articulation.png] ... as output. Note that if you use "bald" markup (without a font override) Lily finds no stencil and produces no output for the articulation. Trevor. On Sat, Oct 13, 2018 at 3:07 AM Urs Liska <li...@openlilylib.org> wrote: > Hi Aaron, > > althought this has long left the original thread's purpose I find this > extremely interesting. Would you be interested in adding some content to > https://scheme-book.ursliska.de, maybe somewhere below > https://scheme-book.ursliska.de/scheme/lists/? There is always need for > explanations that go to substantially more length than the concise Guile > manual. > > Best > Urs > > > Am 13.10.2018 um 10:03 schrieb Aaron Hill: > > On 2018-10-13 12:29 am, Aaron Hill wrote: > >> According to the docs [1], assoc-set! (and family) may modify the > >> original alist. So whether a copy is made or not depends on an > >> implementation detail. Near as I can tell, the original alist is > >> modified in-place when the key is found within. But when the key is > >> new, the result of using acons to append the new key/value to the head > >> of the list results in a copy being returned. > >> > >> [1]: > >> > https://www.gnu.org/software/guile/docs/docs-1.8/guile-ref/Adding-or-Setting-Alist-Entries.html#Adding-or-Setting-Alist-Entries > >> > > > > Nope, I'm wrong about copying. acons (and therefore assoc-set!) does > > not copy (shallow or deep). Consider the following: > > > > guile> (define a '((one . 1) (two . 2))) > > guile> (define b (assoc-set! a 'three 3)) > > guile> a > > ((one . 1) (two . 2)) > > guile> b > > ((three . 3) (one . 1) (two . 2)) > > guile> (define c (assoc-set! a 'three 3)) > > guile> c > > ((three . 3) (one . 1) (two . 2)) > > guile> (eq? b c) > > #f > > guile> (equal? b c) > > #t > > guile> (eq? a (cdr b)) > > #t > > guile> (eq? (cdr b) (cdr c)) > > #t > > guile> (set! a (assoc-set! a 'two 2.2)) > > guile> a > > ((one . 1) (two . 2.2)) > > guile> b > > ((three . 3) (one . 1) (two . 2.2)) > > guile> c > > ((three . 3) (one . 1) (two . 2.2)) > > > > While "b" and "c" are unique as far as the initial node in their > > respective lists (because acons returns a new list), they share the > > remainder with the same nodes within the original list. So, > > modification to the list that "a" references will propagate to "b" and > > "c". > > > > Upon reflection, this all makes sense. So, one should probably be > > explicit about copying and use list-copy (shallow) or copy-tree > > (deep), as needed. > > > > -- Aaron Hill > > > > _______________________________________________ > > lilypond-user mailing list > > lilypond-user@gnu.org > > https://lists.gnu.org/mailman/listinfo/lilypond-user > > > _______________________________________________ > lilypond-user mailing list > lilypond-user@gnu.org > https://lists.gnu.org/mailman/listinfo/lilypond-user > -- Trevor Bača www.trevorbaca.com soundcloud.com/trevorbaca
_______________________________________________ lilypond-user mailing list lilypond-user@gnu.org https://lists.gnu.org/mailman/listinfo/lilypond-user