我对脂膜和胶卷并不陌生,要获得一个分数,我需要重复多次单个音符(相同音高,相同节奏)。因此,我尝试实现一个(loopnote)
函数,该函数需要一个整数(重复次数)和一个音符作为参数。此功能旨在在\relative
模式下工作:当给定的音符具有八度音阶修饰符时,它将仅保留给第一个音符,并为所有其他音符重置该音符,以避免失控。重复八度。
但是它不能按预期工作:
\relative c'
,情况变得更糟:八度音阶上升得更快; \loopnote 16 c'
存储在一个变量中并使用它时,它比直接使用该函数的效果更好(但并非在所有情况下\relative c'
都存在问题)。 使用\displayMusic
时,{ c' c c c }
,\loopnote 4 c'
或\myvar
(其中myvar = \loopnote 4 c'
)之间看不到任何区别。
我想念什么?
当我写这个问题时,我并不知道命令\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
% }