Передача аккордов и возврат музыки с помощью функций замещения музыки 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. Надеюсь, что это поможет!

Другие вопросы по тегам