自动处理单个和弦、一般模式、chordmode下的分解和弦

之前的分解和弦要针对不同的输入模式提供不同的命令,不实用

除此之外,如果和弦与和弦之间有插入类似于谱号切换的指令,命令也会报错。

最近研究了如何识别不同的模式,新开发的命令\ArpeggioChord可以对单个和弦、一般模式、和弦模式都做分解和弦,并且自动忽略掉临时谱号等信息

要能应用,就需要把命令区里的指令都复制过去

效果如图

自动处理单个和弦、一般模式、chordmode下的分解和弦

 

 

 

 

\version "2.22.1"
\language "english"

abc=
\chordmode {
  c4

  \clef bass
  d
}

abccommon=
{
  <c' e' g'>4
  \clef bass
  <d' f' a'>4
}


%%%%%% 命令区
%%%%% 基础指令,后面使用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)))
    )
   )


#(display-scheme-music
  (getChord
   (ly:music-property
    (ly:music-property abc 'element)
    'elements))
  )

#(display-scheme-music
  (cond
   ((eq? (ly:music-property abc 'name) 'UnrelativableMusic)
    (getChord(ly:music-property
              (ly:music-property abc 'element)
              'elements)))
   )
  )


%%%%%%%%%% 开始处理

ArpeggioChord=
#(define-music-function (mymusic) (ly:music?)
   (cond
    ((or
      (eq?(ly:music-property mymusic 'name) 'UnrelativableMusic)
      (eq?(ly:music-property mymusic 'name) 'SequentialMusic))
     (make-sequential-music
      (apply append
        (map get-elements
          (getChord (get-sequential-music mymusic))))))
    ((eq? (ly:music-property mymusic 'name) 'EventChord)
     (make-sequential-music
      (get-elements mymusic)))
    )
   )

%%%%%%% 命令区结束

{
  \mark "和弦模式" \abc \ArpeggioChord \abc } {
\mark "一般模式" \abccommon \ArpeggioChord \abccommon } {
\mark "单个和弦" <c' e'> \ArpeggioChord <c' e'> }

 

上一篇:C语言的设计模式实现开篇感想


下一篇:用lilypond自带案例编命令:给一列音加Staccato