Jump to content

Splitting chords

From LilyPond wiki
Revision as of 03:53, 7 April 2026 by Lemzwerg (talk | contribs)

This snippet is a 2009 contribution by Gilles Thibault in lilypond-user. It provides two functions to split a chord sequence into two separate voices, also preserving articulations and slurs: \keepOnlyFirstNote extracts the first note (as given in the input; this is usually the lowest one) of every chord, and \deleteFirstNote collects the remaining notes.

Note that these functions don't support q to repeat the last chord.

\version "2.24"

#(define (has-duration? music)
   (ly:duration? (ly:music-property music 'duration)))

#(define (not-has-duration? music)
   (not (has-duration? music)))

keepOnlyFirstNote =
#(define-music-function (parser location music) (ly:music?)
   (music-map
    (lambda (evt)
      (when (eq? 'EventChord (ly:music-property evt 'name))
 	(let ((elts (ly:music-property evt 'elements)))
 	  (when (has-duration? (car elts))
 	    (ly:music-set-property!
 	     evt 'elements
 	     (cons (car elts)
 		   (filter not-has-duration? (cdr elts)))))))
      evt)
    music))

deleteFirstNote =
#(define-music-function (parser location music) (ly:music?)
   (music-map
    (lambda (evt)
      (when (eq? 'EventChord (ly:music-property evt 'name))
 	(let ((elts (ly:music-property evt 'elements)))
          (when (has-duration? (car elts))
            (ly:music-set-property! evt 'elements  (cdr elts)))))
      evt)
    music))


music = \relative c' {
  <c e>4-> <d f>( <b g'>) <c e>-. g2 c2
}

\markup { Music with chords }
\new Staff \music

\markup { Music split into two staves }
<<
  \new Staff \deleteFirstNote \music
  \new Staff \keepOnlyFirstNote \music
>>