]> git.donarmstrong.com Git - lilypond.git/blobdiff - ly/music-functions-init.ly
Merge branch 'lilypond/translation' of ssh://git.sv.gnu.org/srv/git/lilypond into...
[lilypond.git] / ly / music-functions-init.ly
index ac62bffa9ae67575da8bbce6e60ec12fd8d18595..10643a3bab9708e7d6f32f3c93e17a85cb2ccd4c 100644 (file)
@@ -204,7 +204,70 @@ breathe =
    (_i "Insert a breath mark.")
    (make-music 'BreathingEvent))
 
-
+%%  Make slide indication for chords
+chordGlissando =
+#(define-music-function (parser location mus1 mus2) (ly:music? ly:music?)
+   "Make a glissando between the notes of triads @code{mus1} and @code{mus2}."
+
+   (define (add-glissando musChord)
+     (let ((els (ly:music-property musChord 'elements)))
+       (ly:music-set-property! musChord 'elements (append els (list (make-music 'GlissandoEvent))))
+       musChord))
+
+   (define (get-notes musicChord)
+     (filter (lambda(x) (eq? (ly:music-property x 'name) 'NoteEvent))
+             (ly:music-property musicChord 'elements)))
+
+   (define (select-note musChord index)
+     (let* ((notes (get-notes musChord))
+            (non-notes (filter (lambda (x)
+                                 (not (eq? (ly:music-property x 'name)
+                                           'NoteEvent)))
+                               (ly:music-property musChord 'elements)))
+            (selected-note (list-ref notes index))
+            (new-els (cons selected-note non-notes))
+            (new-mus (ly:music-deep-copy musChord)))
+       (ly:music-set-property! new-mus 'elements new-els)
+       new-mus))
+
+   (define (add-glissando-line mus1 mus2 index)
+     (context-spec-music
+      (context-spec-music
+       (make-sequential-music
+        (list
+         hideNotes
+         (make-grob-property-set 'StringNumber 'transparent #t)
+         (make-grob-property-set 'NoteColumn 'ignore-collision #t)
+         ;; obviously, this isn't equivalent to \once,
+         ;; so could be changed if required
+         (make-grob-property-set 'Glissando 'thickness 2)
+         (make-grob-property-set 'DynamicText 'transparent #t)
+         (make-grob-property-set 'DynamicLineSpanner 'transparent #t)
+         (make-grob-property-set 'DynamicTextSpanner 'transparent #t)
+         (add-glissando (select-note mus1 index))
+         (select-note mus2 index)))
+       'Bottom (symbol->string (gensym)))
+      'Staff))
+
+   (let* ((notes1 (get-notes mus1))
+          (notes2 (get-notes mus2))
+          (note-count (min (length notes1) (length notes2))))
+
+    #{
+       \once \override Glissando #'minimum-length = #4
+       \once \override Glissando #'springs-and-rods = #ly:spanner::set-spacing-rods
+     <<
+       {
+         $(add-glissando mus1)
+         $mus2
+       }
+       $(make-simultaneous-music
+           (map (lambda (x)
+                        (add-glissando-line mus1 mus2 x))
+                (iota note-count)))
+    >>
+    \revert NoteColumn #'ignore-collision
+  #}))
 
 clef =
 #(define-music-function (parser location type) (string?)
@@ -342,7 +405,28 @@ featherDurations=
 
      argument))
 
-
+footnoteGrob =
+#(define-music-function (parser location grob-name offset text footnote)
+   (symbol? number-pair? markup? markup?)
+   (_i "Attach @var{text} to @var{grob-name} at offset @var{offset},
+ with @var{text} referring to @var{footnote} (use like @code{\\once})")
+   (make-music 'FootnoteEvent
+              'symbol grob-name
+              'X-offset (car offset)
+              'Y-offset (cdr offset)
+              'text text
+              'footnote-text footnote))
+
+footnote =
+#(define-music-function (parser location offset text footnote)
+   (number-pair? markup? markup?)
+   (_i "Attach @var{text} at @var{offset} with @var{text} referring
+ to @var{footnote} (use like @code{\\tweak})")
+   (make-music 'FootnoteEvent
+              'X-offset (car offset)
+              'Y-offset (cdr offset)
+              'text text
+              'footnote-text footnote))
 
 grace =
 #(def-grace-function startGraceMusic stopGraceMusic