Splitting chords: Difference between revisions
Appearance
m Formatting, improved docstring |
No edit summary |
||
| (3 intermediate revisions by 2 users not shown) | |||
| 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 provides two functions to split a chord sequence into two separate voices, also preserving articulations and slurs: <code>\ | 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 provides two functions to split a chord sequence into two separate voices, also preserving articulations and slurs: <code>\keepOnlyFirstNote</code> extracts the first note (as given in the input; this is usually the lowest one) of every chord, and <code>\deleteFirstNote</code> collects the remaining notes. | ||
Note that these | Note that these functions don't support <code>q</code> to repeat the last chord. | ||
<lilypond version="2.24"> | <lilypond version="2.24"> | ||
| Line 11: | Line 11: | ||
keepOnlyFirstNote = | keepOnlyFirstNote = | ||
#(define-music-function ( | #(define-music-function (music) (ly:music?) | ||
(music-map | (music-map | ||
(lambda (evt) | (lambda (evt) | ||
(when (eq? 'EventChord (ly:music-property evt 'name)) | (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) | evt) | ||
music)) | music)) | ||
deleteFirstNote = | deleteFirstNote = | ||
#(define-music-function ( | #(define-music-function (music) (ly:music?) | ||
(music-map | (music-map | ||
(lambda (evt) | (lambda (evt) | ||
(when (eq? 'EventChord (ly:music-property evt 'name)) | (when (eq? 'EventChord (ly:music-property evt 'name)) | ||
(let ((elts (ly:music-property evt 'elements))) | |||
(when (has-duration? (car elts)) | (when (has-duration? (car elts)) | ||
(ly:music-set-property! evt 'elements (cdr elts))))) | (ly:music-set-property! evt 'elements (cdr elts))))) | ||
| Line 39: | Line 39: | ||
<c e>4-> <d f>( <b g'>) <c e>-. g2 c2 | <c e>4-> <d f>( <b g'>) <c e>-. g2 c2 | ||
} | } | ||
\markup { Music with chords } | \markup { Music with chords } | ||
\new Staff \music | \new Staff \music | ||
\markup { Music split into two | \markup { Music split into two staves } | ||
<< | << | ||
\new Staff \deleteFirstNote \music | \new Staff \deleteFirstNote \music | ||
Latest revision as of 09:51, 7 April 2026
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 (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 (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
>>