[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: MIDI dynamics parsing error

From: Heikki Tauriainen
Subject: Re: MIDI dynamics parsing error
Date: Wed, 21 May 2014 00:22:23 +0300

On Tue, 2014-05-20 at 06:41 -0700, Knute Snortum wrote:
> (Note: the above code still emits a warning: Programming error:
> impossible or ambiguous (de) crescendo)

That's true - sorry, I was really commenting only on the "unspecified
starting volume" warning.

> One of the things I really liked about LilyPond was the ability to
> compile sheet music and MIDI from the same source.

That's exactly the same thought that I had when I started learning to
use LilyPond - the idea of producing multiple different kinds of output
for different purposes from the same source feels very attractive.

> It seems to me that this behavior is getting away from that value.  I
> would think that in piano and choral music if you create a temporary
> voice, not only do you want the original dynamic to carry over into
> the temporary, you want any dynamic mark to carry over back into the
> original after the temporary is over.

I've often wondered the same thing - the default behavior of having a
separate dynamic performer per every Voice context probably works well
in cases where a Staff never contains more than a single Voice, but
especially with piano music, where it's convenient to use temporary
polyphony with new Voice contexts to achieve the intended layout, the
default behavior of Voices can easily give unsatisfactory (or even
surprising, if one doesn't know what's going on) results for MIDI unless
extra care is taken to work around this behavior.

> If I understand you correctly, the only way to set a dynamic change
> while temporary voices are active is to set the mark on one voice, set
> and omit it on the other(s), and set and omit it on the original voice
> once the temporary voices are done.  This seems unnecessarily complex
> for a situation that I would think happens many times.

This is indeed a cumbersome solution, but at least it'll likely do the

An alternative might be to try to remove the dynamic performer from all
Voice contexts, and add one to the Staff containing the voices instead
(this example still uses tags to reset the MIDI velocity level from \sf
to \mf to avoid the warnings):

\version "2.18.2"
\language "english"

upper = \relative c'''' \new Voice \with { \remove "Dynamic_performer" }
  | gf16-. \f ef-. df-. cf-. bf ( \sf df cf af )
    gf-. \sf ef-. df-. cf-. bf ( \sf df cf af )
    \new Voice \with { \remove "Dynamic_performer" } { bf4 -\tag #'midi
\mf -\< a16 ( \sf gf' f
ef ) bf4 -\tag #'midi \mf \< a16 ( \sf gf' f ef ) }
    \new Voice \with { \remove "Dynamic_performer" } { <af, f>16 q q q
a4 <af f>16 q q q a4 }

\score {
  \new Staff = "up" {
    \clef treble
    \keepWithTag #'layout \upper
  \layout {

\score {
  \new Staff = "up" \with { \consists "Dynamic_performer" } {
    \keepWithTag #'midi \upper
  \midi {
    \tempo 4 = 120

However, I'm not entirely sure how reliably this is guaranteed to work
(if at all) since I believe that at least some of the MIDI-related
performers are targeted to work correctly only within a particular type
of context and therefore cannot really be moved entirely freely between
different contexts.  With this particular example, however, the end
result sounds to me as if the dynamic changes would get applied to all
Voices in the parallel music expression.

Heikki Tauriainen

reply via email to

[Prev in Thread] Current Thread [Next in Thread]