C/C++教程

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

本文主要是介绍自动处理单个和弦、一般模式、chordmode下的分解和弦,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

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

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

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

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

效果如图

 

 

 

 

\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'>
}

 

这篇关于自动处理单个和弦、一般模式、chordmode下的分解和弦的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!