按指定顺序分解和弦

之前在自动处理单个和弦、一般模式、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}
}

 

posted on 2022-01-25 20:29  lilypond手残粉  阅读(154)  评论(0编辑  收藏  举报