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


person Mushroom Man    schedule 26.08.2018    source источник


Ответы (1)


Я думаю, вы более или менее в правильном направлении. Вы можете посмотреть эту страницу документа 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. Надеюсь, что это поможет!

person Randy Josleyn    schedule 20.01.2019