新命令:沿着一条音阶做模进


在用lilypond实现模进 - lilypond手残粉 - 博客园 (cnblogs.com)里,我知道了有调内模进的命令\modalTranspose

但实际写基本练习的时候,调内模进通常是连续进行的,而做一次模进就要调用一次\modalTranspose的命令,实在是麻烦,代码也不漂亮

所以沿着一条音阶一直模进就成了我的心愿。

在新的\modalTransposeScale命令下,只需要提供一个音阶,就能让系统自动完成一系列的模进。效果见图,代码在下面,要使用命令请复制命令区

MyScale={
  c' d' e' f' g' a' b'
}

MyNotes={
  c' d' f' e'
}

%%%%%%%%%%%%%% 命令区 %%%%%%%%%%%%%%%

modalTransposeScale=
#(define-music-function (myscale mymusic) (ly:music? ly:music?)
   (let ( (firstnote (car (ly:music-property myscale 'elements))) )
    (make-music 'RelativeOctaveMusic 'element
      (make-sequential-music
        (apply append
          (map (lambda (x)
              (ly:music-property
                #{ \modalTranspose
                  $(ly:music-property firstnote 'pitch)
                  $(ly:music-property x 'pitch)
                  $myscale
                  $mymusic #}
              'elements))
          (ly:music-property myscale 'elements))
      )))))

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



\markup{
  "这是准备做模进的片段"
}

{
  \MyNotes
}

\markup{
  "这是准备做模进的音阶,片段会沿着音阶的顺序做模进"
}

{
  \MyScale
}

\markup{
  "这是使用了新命令modalTransposeScale的结果"
  
}
{
  \modalTransposeScale \MyScale \MyNotes
}

相关