Передача аккордов и возврат музыки с помощью функций замещения музыки Lilypond - PullRequest
0 голосов
/ 26 августа 2018

Я пытаюсь написать функции в Lilypond, которые принимают аккорд (или список высот) в качестве аргумента и возвращают музыку с указанным аккордом, вставленным в ритм.Более конкретно, я бы хотел, чтобы функция вызывалась следующим образом:

\chordFunction <c ef f af>
% or
\chordFunction #'(c ef f af)

и возвращала код Лилипонда следующим образом:

\tuplet 3/2 {<c ef f af>4 <c ef f af>8~} <c ef f af>2

pretty picture of desired output once engraved
Я пытался

jazzsyncoA = 
#(define-music-function
  (parser location chord)
  (symbol-list-or-music?)
  #{
    \tuplet 3/2 {$<chord>4 $<chord>8~} $<chord>2
  #}
)

, но это выдает

error: GUILE signaled an error for the expression beginning here
    \tuplet 3/2 {$
                  <chord>4 $<chord>8~} $<chord>2

вместе с другими ошибками при попытке вызова.Как мне написать функции для достижения этой цели?Я неправильно подхожу к проблеме?


Я смотрел в документах Lilypond по предикатам предопределенного типа , но я не могу распознать какое-либо потенциальное использование.

1 Ответ

0 голосов
/ 20 января 2019

Я думаю, вы более или менее в правильном направлении.Вы можете посмотреть эту страницу документации LilyPond , чтобы увидеть, как вы можете начать писать чистую функцию Scheme для решения этой и других проблем.

Что касается вашей функции, если вы хотите использовать своюфункционировать как \chordFunction <c ef f af>, тогда вы можете ly:music? в качестве предиката:

\version "2.18.0"
\language "english"

jazzsyncoA = #(define-music-function (parser location my-notes) (ly:music?)
    #{
        \tuplet 3/2 {  #my-notes q8~ } q2
    #}
)

\score {
    \new Staff {
        \clef "bass"
        \key c \minor
        \new Voice = "one" {
            \jazzsyncoA <c ef f af>4
        }
    }
}

Это дает тот же результат, что и на вашей картинке.Я проверил это на версии 2.19.82, но я предполагаю, что это будет работать и на 2.18.0.Надеюсь, что это поможет!

...