按指定顺序分解和弦
之前在这篇随笔中,和弦是不能按指定顺序来分解的,这就为写基本练习带来了不便
所以现在开发了一个按指定顺序分解和弦的命令\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}
}