Jump to content

Splitting chords: Difference between revisions

From LilyPond wiki
Fsarud (talk | contribs)
Some scheme functions to split chords in two (monophonic) voices.
 
Fsarud (talk | contribs)
Add that it doesn't work with q for repeating last chord
Line 1: Line 1:
This snippet is a 2009 contribution by Gilles Thibault in [https://lists.gnu.org/archive/html/lilypond-user/2009-01/msg00685.html lilypond-user]. It works well in 2.24.4 and even in 2.25.35. I find it very useful.
This snippet is a 2009 contribution by Gilles Thibault in [https://lists.gnu.org/archive/html/lilypond-user/2009-01/msg00685.html lilypond-user]. It works well in 2.24.4 and even in 2.25.35. I find it very useful. (Beware: it doesn't work if you use «q» to repeat last chord).  


<lilypond version="2.24">
<span></span>
#(define (has-duration? music)
\version "2.24"
(ly:duration? (ly:music-property music 'duration)))
 
#(define (has-duration? music)
#(define (not-has-duration? music)
(ly:duration? (ly:music-property music 'duration)))
(not (has-duration? music)))
 
#(define (not-has-duration? music)
keepsOnlyFirstNote = #(define-music-function (parser location music) (ly:music?)
(not (has-duration? music)))
(music-map
(lambda (evt)
keepsOnlyFirstNote = #(define-music-function (parser location music) (ly:music?)
  (if (eq? 'EventChord (ly:music-property evt 'name))
(music-map
    (let ((elts (ly:music-property evt 'elements)))
  (lambda (evt)
      (if (has-duration? (car elts))
  (if (eq? 'EventChord (ly:music-property evt 'name))
          (ly:music-set-property! evt 'elements (cons
      (let ((elts (ly:music-property evt 'elements)))
                (car elts)
      (if (has-duration? (car elts))
                (filter not-has-duration? (cdr elts)))))))
            (ly:music-set-property! evt 'elements (cons
evt)
                (car elts)
music))
                (filter not-has-duration? (cdr elts)))))))
 
  evt)
deleteFirstNote = #(define-music-function (parser location music) (ly:music?)
music))
(music-map
(lambda (evt)
deleteFirstNote = #(define-music-function (parser location music) (ly:music?)
  (if (eq? 'EventChord (ly:music-property evt 'name))
(music-map
    (let ((elts (ly:music-property evt 'elements)))
  (lambda (evt)
          (if (has-duration? (car elts))
  (if (eq? 'EventChord (ly:music-property evt 'name))
              (ly:music-set-property! evt 'elements  (cdr elts)))))
      (let ((elts (ly:music-property evt 'elements)))
evt)
          (if (has-duration? (car elts))
music))
                (ly:music-set-property! evt 'elements  (cdr elts)))))
 
  evt)
 
music))
music =\relative c' {
<c e>4-> <d f>( <b g'>) <c e>-. g2 c2
}
music =\relative c' {
 
<c e>4-> <d f>( <nowiki><b g'>) <c e>-. g2 c2</nowiki>
\markup { Music with chords }
}
\new Staff \music
\markup { Music splitted in 2 staffs }
\markup { Music with chords }
<<
\new Staff \music
  \new Staff \deleteFirstNote \music
\markup { Music splitted in 2 staffs }
  \new Staff \keepsOnlyFirstNote \music
<<
>>
  \new Staff \deleteFirstNote \music
</lilypond>
  \new Staff \keepsOnlyFirstNote \music
>>
<span></span>

Revision as of 14:17, 22 March 2026

This snippet is a 2009 contribution by Gilles Thibault in lilypond-user. It works well in 2.24.4 and even in 2.25.35. I find it very useful. (Beware: it doesn't work if you use «q» to repeat 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)))

keepsOnlyFirstNote = #(define-music-function (parser location music) (ly:music?)
(music-map
 (lambda (evt)
  (if (eq? 'EventChord (ly:music-property evt 'name))
     (let ((elts (ly:music-property evt 'elements)))
      (if (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)
  (if (eq? 'EventChord (ly:music-property evt 'name))
     (let ((elts (ly:music-property evt 'elements)))
          (if (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 splitted in 2 staffs }
<<
  \new Staff \deleteFirstNote \music
  \new Staff \keepsOnlyFirstNote \music
>>