如何在百合池中缩写"具有相同音符的音符高八度,括号"?



目前我编写的百合池代码如下所示:

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
}

正如对我之前的一个问题的有用回答中所建议的那样,我尝试使用音乐功能,但我无法让它工作。 我能得到的最接近的是

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
}

好的,这是我为您创建的函数,它将允许您重复单个音高。唯一的问题是它不会使用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)的影响。

当然,有一种方法可以为此编写更好的代码,但我无法用任何relativetranspose命令来做到这一点。


这里有一些尝试来帮助你使用括号中的八度音阶(与上面的功能相同,但有一些小的改动):

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
}

这里仍然有一些问题:此函数仅在参数是没有{ }的单个注释时才会用括号括起来。这在上面的代码中得到了很好的注释。


我希望这会以某种方式对您有所帮助。如果我在这里遇到八度转调问题的解决方案,我将更新这个答案。

我刚刚从LilyPond的开发者之一David Kastrup那里得到了这个答案:


发生"八度转调"是因为基本上\转置c c与\absolute 相同(因为LilyPond不适用于\相对于转调音乐)。

\

绝对不是必需的 \重复展开: \重复展开知道如何处理相对音乐。

版本 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

在那里,我们确实进入了方案编程。 即使在 2.14 中,相应的 defmacro-public 也可能工作,尽管 #{ #} 可能无法正常工作。

有了这个定义,你的双重定义将变成:

双 = #(定义音乐函数 (解析器位置说明) (ly:音乐? (相对(注)注 #{ $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 操作,然后将结果粘贴到音乐表达式中。

根据您问题中的代码和另一个回复中引用的David Kastrup的答案,我构建了以下代码,将音符转换为具有相同音符的和弦,高一个八度,而不是括号:

#(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' { … } .

要用括号括起来添加的注释,请将octNote中对note2的最后一个引用替换为(parenthesize note2) - 我只是更喜欢非括号版本供我自己使用。(在这种情况下,您可能应该将函数重命名为 octPNoteoctP,以避免混淆。我短暂地尝试将octPNote编写为调用octNote并将结果后处理为括号中的第二个音符的函数,但没有成功。

你几乎肯定还需要扩展copy-articulation?谓词——领带和费马特只是我遇到的两种表达方式。(它默认不复制未知的发音,因此如果谓词不完整,您将在复制的音符上看到它缺少发音。

相关内容

  • 没有找到相关文章

最新更新