使用Lilypond音乐替换功能传递和弦并返回音乐

时间:2018-08-26 20:35:45

标签: scheme guile lilypond music-notation

我正在尝试用Lilypond编写函数,该函数将一个和弦(或音高列表)作为自变量,并以插入和弦的节奏返回音乐。更具体地说,我希望以这种方式调用该函数:

\chordFunction <c ef f af>
% or
\chordFunction #'(c ef f af)

并返回这样的Lilypond代码:

\tuplet 3/2 {<c ef f af>4 <c ef f af>8~} <c ef f af>2

pretty picture of desired output once engraved
我尝试过

jazzsyncoA = 
#(define-music-function
  (parser location chord)
  (symbol-list-or-music?)
  #{
    \tuplet 3/2 {$<chord>4 $<chord>8~} $<chord>2
  #}
)

但这会抛出

error: GUILE signaled an error for the expression beginning here
    \tuplet 3/2 {$
                  <chord>4 $<chord>8~} $<chord>2

在尝试调用时出现其他错误。我应该如何编写函数来完成此任务?我是否不正确地解决了这个问题?


我已经查看了Lilypond docs on predefined type predicates,但无法识别任何潜在的用途。

1 个答案:

答案 0 :(得分:1)

我认为您或多或少都朝着正确的方向发展。您可以查看this LilyPond doc page,以了解如何开始编写纯Scheme功能来解决此问题和其他问题。

对于函数,如果要使用\chordFunction <c ef f af>之类的函数,则可以将ly:music?作为谓词:

\version "2.18.0"
\language "english"

jazzsyncoA = #(define-music-function (parser location my-notes) (ly:music?)
    #{
        \tuplet 3/2 {  #my-notes q8~ } q2
    #}
)

\score {
    \new Staff {
        \clef "bass"
        \key c \minor
        \new Voice = "one" {
            \jazzsyncoA <c ef f af>4
        }
    }
}

与图片中的结果相同。我在2.19.82版上对此进行了测试,但是我猜测它也将在2.18.0版上运行。希望对您有帮助!