Как изменить темп MIDI с помощью схемы?

Я хотел бы создать функцию, которая автоматизировала бы некоторые изменения темпа в моей партитуре (она была бы скрыта в партитуре чем-то вроде , действительно, \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 с помощью пользовательской функции?

Ответы (1)

Свойство 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 ...)