语境
我是 lilypond 和方案的新手,对于一个乐谱,我需要多次重复一个音符(相同的音高,相同的节奏)。所以我尝试实现一个(loopnote)
函数,它接受一个整数(重复次数)和一个音符作为参数。此功能设计为在\relative
模式下工作:当给定音符具有八度音阶修饰符时,它将仅保留第一个音符,并为所有其他音符重置它,以避免失控重复八度音阶。
问题
但它没有按预期工作:
- 每次遇到第二个重复的音符时,音符八度“经常”被分解并迅速上升;
- 当我为相对模式设置一个八度音阶修饰符时
\relative c'
,情况变得更糟:八度音阶上升得更快; - 当我存储
\loopnote 16 c'
在变量中并使用它时,它比直接使用函数时“更好”(但并非在所有情况下,仍然存在问题\relative c'
)。
当我使用 时\displayMusic
,我看不出{ c' c c c }
,\loopnote 4 c'
或\myvar
(where myvar = \loopnote 4 c'
) 之间有任何区别。
我错过了什么?
编辑
当我写这个问题时,我不知道 command \repeat unfold
,它正在做我想要的......但是,这并不能解释为什么我自己的代码不起作用,以及如何修复它......
源代码和示例图像
这是 lilypond 源代码,它给了我下面的两张图片:
\version "2.19.82"
\language "english"
#(define dup (lambda (el n) (if (= n 0) '() (cons el (dup el (- n 1))))))
#(define greaterThanZero? (lambda (val) (and (integer? val) (> val 0))))
loopnote = #(define-music-function
(parser location n note)
(greaterThanZero? ly:music?)
(let (
(noteCopy (ly:music-deep-copy note))
(pitch (ly:music-property note 'pitch)))
(let (
(notename (ly:pitch-notename pitch))
(alteration (ly:pitch-alteration pitch)))
; Reset pitch octave information for every note but the first:
(set! (ly:music-property noteCopy 'pitch) (ly:make-pitch -1 notename alteration))
(make-music 'SequentialMusic 'elements (cons note (dup noteCopy (- n 1)))))))
% EXAMPLE 1:
myvar = \loopnote 4 c'
\relative c {
\myvar % Working well
\myvar % Working well
\loopnote 4 c % Problem
}
% EXAMPLE 2:
% myvar = \loopnote 4 c
% \relative c' {
% \myvar
% \myvar
% \myvar
% \loopnote 4 c
% \myvar
% \myvar
% \loopnote 4 c
% }