Splitting chords: Difference between revisions
Appearance
Some scheme functions to split chords in two (monophonic) voices. |
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). | ||
< | <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 | |||
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) | |||
music)) | (filter not-has-duration? (cdr elts))))))) | ||
evt) | |||
deleteFirstNote = #(define-music-function (parser location music) (ly:music?) | music)) | ||
(music-map | |||
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)) | |||
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 | ||
\markup { Music splitted in 2 staffs } | |||
<< | |||
>> | \new Staff \deleteFirstNote \music | ||
</ | \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
>>