重复相同的音符n次

时间:2019-08-16 09:58:37

标签: lilypond

上下文

我对脂膜和胶卷并不陌生,要获得一个分数,我需要重复多次单个音符(相同音高,相同节奏)。因此,我尝试实现一个(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
% }

示例1

Lylipond example 1

示例2

Lylipond example 2

0 个答案:

没有答案