Я хотел бы создать функцию, которая автоматизировала бы некоторые изменения темпа в моей партитуре (она была бы скрыта в партитуре чем-то вроде , действительно, \override Score.MetronomeMark #'transparent = ##t
цель состоит в том, чтобы добавить немного выразительности в вывод MIDI).
Мне удается добавить изменение темпа в партитуру (с помощью #(make-music 'TempoChangeEvent ...)
), но это не влияет на вывод MIDI, как \tempo
должно было бы. Но это именно то, что мне нужно, хотя.
Я пытался изменить свойство контекста tempoWholesPerMinute
, но он вообще ничего не делает.
\version "2.18.2"
\language "english"
mytempo = #(define-music-function (music) (ly:music?)
#{
#(make-music 'TempoChangeEvent
'metronome-count 180
'tempo-unit (ly:make-duration 2))
\applyContext #(lambda (context)
(ly:context-set-property! context
'tempoWholesPerMinute
(ly:make-moment 180 3)))
#music
#})
\score {
\new Staff \relative c' {
\mytempo c
d e f g
}
\layout {}
\midi {}
}
Как я могу изменить темп MIDI с помощью пользовательской функции?
Свойство tempoWholesPerMinute
интерпретируется тем Tempo_performer
, что живет в Score
контексте, поэтому изменения в вашем текущем контексте не видны исполнителю. Итак, вам нужно
(ly:context-set-property (ly:context-find context 'Score) ...
или альтернативно
\context Score \applyContext ...
В общем, если вы знаете, какая конструкция LilyPond производит то, что вам нужно, и вы хотите выразить это в Scheme без удобного простого написания , проще всего #{ ... #}
просто поставить \displayMusic
перед ней ее форму LilyPond, а затем прочитать то, что появляется в выводе консоли.
Здесь \tempo 4 = 60
будут производить
(make-music
'SequentialMusic
'elements
(list (make-music
'TempoChangeEvent
'metronome-count
60
'tempo-unit
(ly:make-duration 2)
'text
'())
(make-music
'ContextSpeccedMusic
'context-type
'Score
'element
(make-music
'PropertySet
'value
(ly:make-moment 15)
'symbol
'tempoWholesPerMinute))))
что в основном (во второй половине) соответствует
\set Score.tempoWholesPerMinute = 15
который реализован LilyPond как случай
\context Score ...
йоленойер
\displayMusic
с\tempo
:) Сейчас работает, добавив(make-music 'ContextSpeccedMusic ...)