2.4 变量、元数据、绝对音高

194 阅读3分钟

文章开头第一句加入:本文已参与「新人创作礼」活动,一 起开启掘金创作之路。

2.4.1 (定义变量) Organizing pieces with variables

与可视化打谱软件相比LilyPond更像一种脚本编程语言。LilyPond具备了定义、引用变量的特性。通过使用变量可以是使我们的乐谱具有更强的可读性,同时使用变量可以避免对于重复的音乐片段进行反复编写。

我们可以 变量名 = { 音乐片段 } 的格式来定义变量 使用 \变量名来引用变量。

violin = \new Staff {
  \relative {
    a'4 b c b
  }
}

cello = \new Staff {
  \relative {
    \clef "bass"
    e2 d
  }
}

在上面一段代码中,我们定义了violincello 两个变量而当我们编译上面一段代码的时候,并没有输出任何乐谱

这是因为变量没有被引用,下面我们修改代码

violin = \new Staff {
  \relative {
    a'4 b c b
  }
}

cello = \new Staff {
  \relative {
    \clef "bass"
    e2 d
  }
}
%开始引用变量
{
  <<
    \violin
    \cello
  >>
}

我们得到了输出的乐谱

现在我们要使用变量输入下面一段乐谱

我们会发现,被标注的区域,在两个小节中,反复出现了8次,因此我们可以通过定义变量来完成乐谱

tripletA = \relative {%定义三连音(图片中标注的片段)
  \tuplet 3/2 { c'8 e g } 
}
barA = { %定义第一小节,引用变量tripletA
\tripletA \tripletA \tripletA \tripletA 
}

{%定义乐谱,引用小节
  \barA \barA 
}

当然变量还有更多的用处例如:

myWidth = 60      % 定义一个变量,来储存智障宽度
myName = "Wendy"  % 定义一个变量,来储存上标
aFivePaper = \paper { #(set-paper-size "a5") }%定义纸张类型
\paper {
  \aFivePaper
  line-width = \myWidth
}
{
  c4^\myName
}

2.4.2 设置标题 (Adding titles)

title : 乐谱标题,composer:作曲家 ,opus:作品编号等信息,需要编写在 \header{...} 中,通常 \header 模块被写在 \version 的下一行


\version "2.22.2"

\header {
  title = "我的乐谱"
  composer = "xxx"
  opus = "Op. 9"
}

\relative{
  c'' d e f
}

更多乐谱头信息请参考官方手册: Creating titles headers and footers

2.4.3 使用固定音高 (Absolute note names)

在之前的案例中,我们一直使用 \relative 模式来撰写乐谱,当我们不再写入\relative命令后,音符就变成了绝对音高模式,即: c'指定为中央C(middle C)以此类推 d' 就被指定为比 c'高两个半音的d'

{
  \clef "bass"
  c'4 b g, g, |
  g,4 f, f c' |
}

在使用固定音高模式撰写高音谱时,我们需要为几乎每个音写入 ' 这样书写很不美观,而且容易使人感到混乱。

{
  \key a \major
  \time 6/8
  cis''8. d''16 cis''8 e''4 e''8 |
  b'8. cis''16 b'8 d''4 d''8 |
}

针对上述情况可们可以使用关键词 \fixed 来定义 c 的音高

\fixed c'' {
  \key a \major
  \time 6/8
  cis8. d16 cis8 e4 e8 |
  b,8. cis16 b,8 d4 d8 |
}

在这个示例中,使用 \relative 模式下也不需要书写太多的 '因为其音高的浮动范围不会超过上下3跟谱线。然而在很长的旋律中,或者音高浮动剧烈的旋律中使用\relative模式,一个音符音高的错误会影响到后续旋律。同时会让debug变得很困难。

\relative {
  \key a \major
  \time 6/8
  cis''8. d16 cis8 e4 e8 |
  b8. cis16 b8 d4 d8 |
}

我为了解决上述问题,我们可以使用 \relative { \relative{} } 即,在 \relative{} 中嵌套\relative{}这样我们可以减少音符间的相互影响。

\relative { c'4 \relative { f'' g } c }

同样我们也可以使用 \fixed 来定义旋律也能达到相同的目的。

\relative {
  c'4 \fixed c { f'' g'' } c |
  c4 \fixed c'' { f g } c
}