Я получил полезную информацию от Валентина Вилленаве на форуме пользователей LilyPond, который привел к следующему работоспособному решению:
LilyPond предоставляет гравер NoteNames, который автоматически печатает названия шагов, например. "c d e" как текст под примечаниями, но есть давняя ошибка, которая заставляет NoteNames возвращаться к названиям ноты голландского тона. Обходной путь Валентина состоит в том, чтобы создать ассоциативный массив и использовать его в качестве поиска в лямбда-функции, которая вызывается при печати каждого шага. Подставляя записи из массива, печатаются нужные имена тонов.
Чтобы сделать решение полностью работоспособным, мне также пришлось добавить второй блок партитуры, чтобы отделить генерацию MIDI-вывода от печати партитуры. Это необходимо для предотвращения выдачи миди-выводом гравером NoteNames.
Я протестировал это решение с помощью файла гораздо большего размера, используя полный набор имен хроматических сольфежей. Это работает очень хорошо. Единственная оставшаяся проблема заключается в том, что было бы неплохо иметь возможность настраивать свойства шрифта на выходе NoteNames, чтобы отличить сольфадж от обычной лирики. До сих пор я не смог этого сделать.
% Moveable Do as lyrics example
% define solfege pitchnames
pitchnames = #`(
(do . ,(ly:make-pitch -1 0 NATURAL))
(re . ,(ly:make-pitch -1 1 NATURAL))
(mi . ,(ly:make-pitch -1 2 NATURAL))
)
#(ly:parser-set-note-names parser pitchnames)
% Apparently, LilyPond reverts to dutch names when
% using the NoteNames context. The following
% workaround was posted by V. Villenave at
% http://lists.gnu.org/archive/html/lilypond-user/2010-10/msg00687.html
newnames =
#`(("c" . "do")
("d" . "re")
("e" . "mi"))
myNoteNames =
#(lambda (grob)
(let* (
;; bindings
(default-name (ly:grob-property grob 'text))
(new-name (assoc-get default-name newnames))
)
;; body
(ly:grob-set-property! grob 'text new-name)
(ly:text-interface::print grob)
)
)
% compose as though in C major
mynotes = \relative do' {\key do \major do2 re4( mi4) }
% transpose to desired key
melody = \transpose do mi { \mynotes }
% Produce score with solfege names as lyrics
\score {
<<
\new Voice = "myVoice" {
\melody
}
\context NoteNames \with {
\override NoteName #'stencil = #myNoteNames
} { \mynotes }
>>
}
% Use a second score block to produce midi,
% otherwise the NoteNames will produce a duplicate
% track.
\score {
\new Voice = "myVoice" {
\melody
}
%% This generates the midi file
\midi {
}
}
\version "2.12.3"
UPDATE:
Оказывается, что свойствами шрифта можно управлять с помощью функции разметки , например, путем изменения
(ly:grob-set-property! grob 'text new-name)
до
(ly:grob-set-property! grob 'text (markup #:italic #:smaller new-name))
Возможно, есть другие способы сделать то же самое, но это просто и делает то, что мне нужно. На данный момент, я считаю этот вопрос ответом. Обратите внимание, что будущая версия LilyPond может исправить ошибку NoteNames и устранить необходимость использования схемы для этой цели.