按指定顺序分解和弦
之前在自动处理单个和弦、一般模式、chordmode下的分解和弦 - lilypond手残粉 - 博客园 (cnblogs.com)这篇随笔中,和弦是不能按指定顺序来分解的,这就为写基本练习带来了不便
所以现在开发了一个按指定顺序分解和弦的命令\BrokeChord,指定顺序之后,就可以对后面的一连串和弦都做相同的分解。和之前一样,既适合普通模式下的和弦,也适合\chordmode模式下的和弦
命令的格式为\BrokeChord #数字列表 {和弦序列}
也是需要先复制命令区的部分,再运用命令。代码如下
\version "2.22.1" \language "english" %%%%%%%%%% 命令区,复制请由此开始 %%%%% 基础指令,后面使用map的时候会用得上 #(define (get-elements mymusic) (ly:music-property mymusic 'elements) ) %%%%% 获取音乐序列 #(define (get-sequential-music m) (cond ;;第一种情况,如果是chordmode,此时m的'name属性为'UnrelativableMusic ((eq? (ly:music-property m 'name) 'UnrelativableMusic) (ly:music-property (ly:music-property m 'element) 'elements)) ;;第二种情况,如果一般模式,此时m的'name属性为'SequentialMusic ((eq? (ly:music-property m 'name) 'SequentialMusic) (ly:music-property m 'elements)) ) ) %%%%%% 获取和弦序列,只保留'EventChord的部分 #(define (getChord m) (cond ((null? m) '()) ((eq? (ly:music-property (car m) 'name) 'EventChord) (cons (car m) (getChord (cdr m)))) (else (getChord (cdr m))) ) ) %%%%% 最终命令 BrokeChords= #(define-music-function (mynumlist mychords) (list? ly:music?) (make-sequential-music (apply append (map (lambda (m) (map (lambda (x) (list-ref (get-elements m) (- x 1))) mynumlist)) (getChord (get-sequential-music mychords)))))) %%%%%%%%%%%% 命令区结束 MyChords = \chordmode { c f } { \mark "这是原和弦" \MyChords } { \mark "按1、3、2顺序排列" \BrokeChords #'(1 3 2) \MyChords } { \mark "按1、3、2、3顺序排列" \BrokeChords #'(1 3 2 3) \chordmode {c e} }