gpt4 book ai didi

scope - 在 LilyPond 中定义函数 inside\score

转载 作者:太空宇宙 更新时间:2023-11-03 18:34:56 25 4
gpt4 key购买 nike

我编写了一本大歌书,为此我希望有许多函数的本地定义,最终将在 \include d 文件中,但这不会这里的区别。为此,我需要在 \score{ ... } 范围内定义函数。然而,LilyPond 不断抛出错误。

非工作示例:

\version "2.17.26"

\book {

\header {
title = "This is a book"
}

\score {
xyz = { a' b' c'' }
abc = #(define-music-function
( parser location musicnotes )
( ly:music? )
#{
c' $musicnotes e'
#}
)
{ \abc { d' } f' \xyz }
\header {
piece = "First piece"
opus = "op. 1024"
}
}

\score {
xyz = { a' a' a' }
abc = #(define-music-function
( parser location musicnotes )
( ly:music? )
#{
e' $musicnotes c'
#}
)
{ \abc { d' } f' \xyz }
\header {
piece = "Second piece"
opus = "op. 1025"
}
}

}

抛出错误:

test.ly:10:17: error: unrecognized string, not in text script or \lyricmode   
xyz = { a' b' c'' }

然而,下面的工作,我必须给函数唯一的名称,这是不受欢迎的。

\version "2.17.26"

xyz = { a' b' c'' }
abc = #(define-music-function
( parser location musicnotes )
( ly:music? )
#{
c' $musicnotes e'
#}
)

xxyz = { a' a' a' }
aabc = #(define-music-function
( parser location musicnotes )
( ly:music? )
#{
e' $musicnotes c'
#}
)

\book {

\header {
title = "This is a book"
}

\score {
{ \abc { d' } f' \xyz }
\header {
piece = "First piece"
opus = "op. 1024"
}
}

\score {
{ \aabc { d' } f' \xxyz }
\header {
piece = "Second piece"
opus = "op. 1025"
}
}

}

最佳答案

不幸的是,无法将作业粘贴到乐谱中。您只能将作业放在以下位置:

  • 顶层,
  • \display\header\midi block 中

LilyPond 语法使这一点非常清楚,即使手册的其余部分对此有点回避。 (查看 http://lilypond.org/doc/v2.17/Documentation/contributor/lilypond-grammar ,并查找使用 assignment 规则的位置)。

假设你的分配不适合上面列出的 block (在这个例子中肯定是这种情况),并且假设你不想做一些奇特的事情,比如去定义你自己的 Scheme 模块并弄清楚如何在你的 LilyPond 文件中使用它们,你有两个选择:

  1. 定义xyzabc,然后定义将进入第一个乐谱的音乐。然后重新定义 xyzabc,然后再定义下一个乐谱的音乐。这是有效的,因为赋值会覆盖之前的任何内容,并且因为 LilyPond 定义通常按顺序处理。但是,如果您希望您的某些定义在两个乐谱中都使用并且相同,您可能会感到困惑。
  2. 接受你的方法,但我会选择一个前缀或后缀,使定义的分数更清楚。

第一个选项看起来像这样:

\version "2.18.0"
xyz = { a' b' c'' }
abc = #(define-music-function (parser location musicnotes)
(ly:music?)
#{ c' $musicnotes e' #})
smus_a = { \abc { d' } f' \xyz }

xyz = { a' a' a' }
abc = #(define-music-function (parser location musicnotes)
(ly:music?)
#{ e' $musicnotes c' #})
smus_b = { \abc { d' } f' \xyz }

\book {
\header {
title = "A Book!"
}
\score {
\smus_a
\header { piece = "First piece" }
}
\score {
\smus_b
\header { piece = "Second piece" }
}
}

如果将音乐定义部分重构为单独的 LilyPond 源文件,这也适用。

关于scope - 在 LilyPond 中定义函数 inside\score,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20858042/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com