1

语境

我是 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
% }

示例 1

荔枝示例 1

示例 2

Lylipod 示例 2

4

0 回答 0