目前我编写的lilypond代码如下:
\version "2.14.2"
P = #parenthesize
\relative c, {
\clef bass
<c \P c'> <e \P e'> <g \P g'>2 <c, \P c'>4 <d \P d'> <e \P e'>2
}
我反复指的是'这个音符,连同相同音符高一个八度,括号'。
我想要一种缩写的方法,这样我就可以这样写:
\version "2.14.2"
poct = ...
\relative c, {
\clef bass
\poct c \poct e \poct g2 \poct c,4 \poct d \poct e2
}
根据a helpful answer to an earlier question of mine的建议,我尝试使用a music function,但我无法让它发挥作用。我能得到的最接近的是
poct = #(define-music-function
(parser location note)
(ly:music?)
#{
<< $note \transpose c c \parenthesize $note >>
#})
但是这会使用<<
.. >>
代替<
.. >
,这不会呈现我想要的方式(以及警告),而且我有不知道为什么\transpose c c
实际上转换了任何东西。
最后,切实相关,在尝试音乐功能时,我发现甚至不可能创建一个模仿\repeat unfold 2
的音乐功能;以下是第三个和第四个c
之间的八度音阶:
\version "2.14.2"
double = #(define-music-function
(parser location note)
(ly:music?)
#{
$note $note
#})
\relative c, {
\clef bass
\double c \double e \double g2 \double c,4 \double d \double e2
}
答案 0 :(得分:2)
好的,所以这是我为你创建的一个功能,它可以让你重复单个音高。唯一的问题是它不会使用\relative
表示法。这是因为,在相对符号中,以下音符序列c' c' c'
显然比前一个音符高一个八度。不幸的是,我仍然找不到一种方法来获得\function #3 c'
这样会输出c' c c
的函数。也就是说,这是我的功能和一些例子:
\version "2.17.28"
times = #(define-music-function
(parser location N note)
(integer? ly:music?)
(cond
((>= N 2)
#{ \repeat unfold $N { \absolute $note } #}
)
((= N 1)
#{ \absolute $note #}
)
)
)
{
a4 \times #3 b4
R1
\times #4 { c'8 d' }
R1
\times #1 { c''1 }
}
所以语法只是\times #"number of repetition" { ...music... }
。如果只重复一个音符,则可以省略{
和}
:\times #"number of repetition" "single note"
。
您可以在\relative
段的中间使用此功能,但是您应该输入该功能的音高作为绝对音高。看看:
\version "2.17.28"
times = #(define-music-function
(parser location N note)
(integer? ly:music?)
(cond
((>= N 2)
#{ \repeat unfold $N { \absolute $note } #}
)
((= N 1)
#{ \absolute $note #}
)
)
)
\relative c'' {
c4 d \times #4 e'' f g
}
请注意,上面的所有音符都在同一个八度音阶中。音符f
的八度音位置也不受此函数的影响,它受函数前面的音符影响,即d
。
可以肯定的是,有一种方法可以为此编写更好的代码,但我无法使用\relative
和\transpose
命令执行此操作。
以下是一些尝试用你的括号八度音程(上面的功能相同,但有一些小的改动)来帮助你:
\version "2.17.28"
timesP = #(define-music-function
(parser location N note)
(integer? ly:music?)
(cond
((>= N 2)
#{
<<
\repeat unfold $N { \absolute $note }
\transpose c c' \repeat unfold $N { \absolute \parenthesize $note }
>>
#}
)
((= N 1)
#{
<<
\absolute $note
{ \transpose c c' \parenthesize $note }
>>
#}
)
)
)
{
a4 \timesP #3 b4
\timesP #8 c'16
\timesP #2 g4
\timesP #4 { c'8 d' } % no parenthesis here because there are two notes as arguments...
\timesP #1 { c''1 } % no parenthesis here because of the { }
}
\relative c'' {
c4 d \timesP #4 e'' f g
}
此处仍有一些捕获:当参数是没有{ }
的单个注释时,此函数将仅括号。以上代码对此进行了很好的评论。
我希望这会以某种方式帮助你。如果我在这里遇到八度换位问题的解决方案,我会更新这个答案。
答案 1 :(得分:1)
我刚从LilyPond的开发人员之一David Kastrup那里得到了这个答案:
“octave transposition”的发生是因为\ transpose c c与\ _绝对相同(因为LilyPond不适用\相对于转置音乐)。
\ absolute与\ repeat展开无关:\ repeat展开知道如何处理相对音乐。
版本2.14.2非常古老。无论如何,LilyPond跟踪器中当前存在问题http://code.google.com/p/lilypond/issues/detail?id=3673,相应的代码可以在https://codereview.appspot.com/30890043/diff/40001/scm/music-functions.scm
找到我们确实进入了Scheme编程。相应的defmacro-public甚至可能在2.14中工作,但#{#}可能无法正常工作。
根据该定义,您的双重定义将成为:
double =#(define-music-function (解析器位置说明) (LY:音乐?) (make-relative(note)note #{ $ note $ note #}))
然后将以绝对和相对模式工作。如果2.14#{#}与make-relative无关,则写作(make-sequential-music(list(ly:music-deep-copy note)(ly:music-deep-copy note)))应该作为方案更换。
一旦你意识到它只是一个简单的代码替换,原始问题变得更容易理解,所以\ relative {\ double c'}使用不同的八度音程成为\ relative {c'c'}。 make-relative宏仅对单个音符进行\ relative操作,然后将结果粘贴到音乐表达式中。
答案 2 :(得分:0)
根据您问题中的代码以及另一封答复中引用的大卫·卡斯特鲁普(David Kastrup)的答案,我构建了以下代码,将音符变成和弦,且音符高了八度,而不用括号括起来: / p>
#(define (octavate-pitch pitch octaves)
(ly:make-pitch
(+ (ly:pitch-octave pitch) octaves)
(ly:pitch-notename pitch)
(ly:pitch-alteration pitch)))
#(define (articulation-is-of-type? art type)
(string=? (ly:music-property art 'articulation-type) type))
#(define (copy-articulation? art)
(cond ((music-is-of-type? art 'tie-event)
#t)
((and (music-is-of-type? art 'articulation-event)
(articulation-is-of-type? art "fermata"))
#f)
; TODO add more cases
(else
#f)))
#(define (octNote note)
(if (null? (ly:music-property note 'pitch))
note
(make-relative (note) note
(let ((note2 (ly:music-deep-copy note))
(pitch (ly:music-property note 'pitch)))
(set! (ly:music-property note2 'pitch)
(octavate-pitch pitch 1))
(set! (ly:music-property note2 'articulations)
(filter copy-articulation? (ly:music-property note2 'articulations)))
(make-event-chord (list note note2))))))
oct = #(define-music-function
(parser location music)
(ly:music?)
(music-map octNote music))
它可以应用于单个音符或完整的音乐表达:
\relative c' \oct {
c d e f |
g2 g |
}
它也以相反的顺序\oct \relative c' { … }
起作用。
要用括号括起来的注释,请用note2
替换octNote
中对(parenthesize note2)
的{{1}}的最后引用–我只喜欢非括号版本供自己使用。 (在这种情况下,您可能应该将函数重命名为octPNote
和octP
,以避免造成混淆。我短暂地尝试将octPNote
编写为调用octNote
的函数,处理结果以将第二个音符括起来,但没有成功。)
您几乎肯定还会需要扩展copy-articulation?
谓词-关系和同伴关系只是我遇到的两种表达方式。 (默认情况下,它不会复制未知的发音,因此,如果谓词不完整,您会在复制的音符上看到它是缺少的发音。)