#(define (not-has-duration? music) (not (ly:duration? (ly:music-property music 'duration)))) #(define (trim-list chord-elements n) (cond ((or (null? (cdr chord-elements)) (not-has-duration? (car (cdr chord-elements)))) chord-elements) ((<= n 1) (cons (car chord-elements) (filter not-has-duration? chord-elements))) (else (trim-list (cdr chord-elements) (1- n))) )) extractNote = #(define-music-function (parser location n music )(number? ly:music?) (music-map (lambda (evt) (if (eq? 'EventChord (ly:music-property evt 'name)) (ly:music-set-property! evt 'elements (trim-list (ly:music-property evt 'elements) n))) evt) music)) %%%%%%%%%%%%%%%%%%%%%%% #(define (get-element lst n) (cond ((null? (cdr lst)) (car lst)) ((eq? 'VoiceSeparator (ly:music-property (car lst) 'name) ) (get-element (cdr lst) n)) ((<= n 1) (car lst)) (else (get-element (cdr lst) (1- n))) )) extractVoice = #(define-music-function (parser location n music )(number? ly:music?) (music-map (lambda (evt) (if (and (eq? 'SimultaneousMusic (ly:music-property evt 'name)) (not (memq 'notExtractVoice (ly:music-property evt 'tags)))) (make-music 'SequentialMusic 'elements (list (get-element (ly:music-property evt 'elements) n))) evt)) music)) %%%%%%%%%%%%%%%%%%%%%% extractPartUpper = #(define-music-function (parser location music )(ly:music?) #{ \extractNote #1000 \extractVoice #1 $music #}) extractPartLower = #(define-music-function (parser location music )(ly:music?) #{ \extractNote #1 \extractVoice #1000 $music #}) %% Décommenter ci dessous si vous voulez tester .... %{ music = \relative c'{ 4-> ( ) -. << {e4 f g2 a4 b c2} \\ { c,2 b4 d g,2 c2} >> } \score { << \new Staff \music \new Staff \extractPartUpper \music \new Staff \extractPartLower\music >> } %}