kastdeur/lilydrum

Scoop implementation

kastdeur opened this issue · 2 comments

Instead of a horizontal grouping, an arrow (going up and down) should be over the notes.

scoop = #(define-music-function (music) (ly:music?)

Using a PhrasingSlur and modifying the shape might be an idea to implement this.

https://lilypond.org/doc/v2.23/Documentation/notation/modifying-shapes

Using TextSpanEvent:

scoop preview

\version "2.22.2"

\include "../lib/lilydrum/lilydrum.ly"

#(define (text-spanner-start-stop mus spanid)
    (let ((elts (ly:music-property mus 'elements)))
    (make-music 'SequentialMusic 'elements
       (append
          (list (make-music 'TextSpanEvent 'span-direction -1 'spanner-id spanid ))
          (reverse (cdr (reverse elts)))
          (list (make-music 'TextSpanEvent 'span-direction 1 'spanner-id spanid))
          (list (last elts))))))

scoop = #(define-music-function (music) (ly:music?)
    "Add a TextSpanner over music representing a scoop.
    This is notated with a bent arrow."
    #{
        \temporary \override TextSpanner.style = #'line
        \temporary \override TextSpanner.bound-details.right.arrow = ##t
        \temporary \override TextSpanner.bound-details.left.text = \markup {
            \fontsize #5
            \override #'(thickness . 2)
                \draw-line #'(-3 . -2) % draw stick
            }
        \temporary \override TextSpanner.bound-details.left.Y = #2
        \temporary \override TextSpanner.bound-details.right.Y = #-1
        \temporary \override TextSpanner.bound-details.left.padding = #3.5
        \temporary \override TextSpanner.bound-details.right.padding = #-0.5

        $(text-spanner-start-stop music scoop)
    #})

\new PipeBandDrumStaff {
    \displayMusic \drummode {
        \scoop { d8 g d4 }
    }
}