%%%%%%%%%%%%%%%%%%%%%%%%%%
\version "2.18.2"
dronify =
#(define-music-function (parser location drone melody)
(ly:pitch? ly:music?)
(let* ((prev #{ #})
(current #{ #})
(art '())
(drone-part
(music-map
(lambda (m)
(set! prev current)
(if (and (music-is-of-type? m 'note-event)
(ly:pitch? (ly:music-property m 'pitch)))
;; change the pitch
(begin
(ly:music-set-property! m 'pitch drone)
(if (and (music-is-of-type? prev 'note-event)
(ly:pitch? (ly:music-property prev
'pitch)))
;; add tie to previous note
;; avoid overwriting existing articulations
(begin
(set! art (ly:music-property prev
'articulations))
(ly:music-set-property! prev 'articulations
(append art (list (make-music (quote
TieEvent)))))))))
(set! current m)
prev)
melody)))
#{ #drone-part #current #}))
#(define (octave-up m t)
(let* ((octave (1- t))
(new-note (ly:music-deep-copy m))
(new-pitch (ly:make-pitch
octave
(ly:pitch-notename (ly:music-property m
'pitch))
(ly:pitch-alteration (ly:music-property m
'pitch)))))
(set! (ly:music-property new-note 'pitch) new-pitch)
new-note))
#(define (octavize-chord elements t)
(cond ((null? elements) elements)
((eq? (ly:music-property (car elements) 'name) 'NoteEvent)
(cons (car elements)
(cons (octave-up (car elements) t)
(octavize-chord (cdr elements) t))))
(else (cons (car elements) (octavize-chord (cdr elements )
t)))))
#(define (octavize music t)
(if (eq? (ly:music-property music 'name) 'EventChord)
(ly:music-set-property! music 'elements (octavize-chord
(ly:music-property
music
'elements) t)))
music)
makeOctaves = #(define-music-function (parser location arg mus)
(integer?
ly:music?)
(music-map (lambda (x) (octavize x arg))
(event-chord-wrap!
mus)))
melody = \relative f' {
c4 d c8( d8) r4
g4\staccato a r b4
}
<<
\melody
\makeOctaves #1 \dronify g \melody