Передача аккордов и возврат музыки с помощью функций замещения музыки Lilypond
Я пытаюсь написать функции в Lilypond, которые принимают аккорд (или список высот) в качестве аргумента и возвращают музыку с указанным аккордом, вставленным в ритм. Более конкретно, я бы хотел, чтобы функция вызывалась следующим образом:
\chordFunction <c ef f af>
% or
\chordFunction #'(c ef f af)
и вернуть код Lilypond примерно так:
\tuplet 3/2 {<c ef f af>4 <c ef f af>8~} <c ef f af>2
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 предикаты предопределенного типа, но я не могу распознать их потенциальное использование.
0 ответов
Я думаю, что вы более или менее в правильном направлении. Вы можете заглянуть на эту страницу документации 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. Надеюсь, что это поможет!