/*
This file is part of LilyPond, the GNU music typesetter.
- Copyright (C) 2000--2014 Jan Nieuwenhuizen <janneke@gnu.org>
+ Copyright (C) 2000--2015 Jan Nieuwenhuizen <janneke@gnu.org>
LilyPond is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
void process_music ();
Real equalize_volume (Real);
- DECLARE_TRANSLATOR_LISTENER (decrescendo);
- DECLARE_TRANSLATOR_LISTENER (crescendo);
- DECLARE_TRANSLATOR_LISTENER (absolute_dynamic);
+ void listen_decrescendo (Stream_event *);
+ void listen_crescendo (Stream_event *);
+ void listen_absolute_dynamic (Stream_event *);
private:
Stream_event *script_event_;
Drul_array<Stream_event *> span_events_;
Drul_array<Direction> grow_dir_;
Real last_volume_;
- bool last_volume_initialized_;
Audio_dynamic *absolute_;
Audio_span_dynamic *span_dynamic_;
Audio_span_dynamic *finished_span_dynamic_;
Dynamic_performer::Dynamic_performer ()
{
- last_volume_ = 0.0;
- last_volume_initialized_ = false;
+ last_volume_ = -1;
script_event_ = 0;
absolute_ = 0;
span_events_[LEFT]
s = get_property ("instrumentName");
if (!scm_is_string (s))
- s = scm_from_locale_string ("piano");
+ s = scm_from_ascii_string ("piano");
SCM eq = get_property ("instrumentEqualizer");
if (ly_is_procedure (eq))
void
Dynamic_performer::process_music ()
{
- if (span_events_[STOP] || script_event_)
+ if (span_events_[START] || span_events_[STOP] || script_event_)
{
- // End of a dynamic spanner, or an explicit dynamic script event.
+ // End the previous spanner when a new one begins or at an explicit stop
+ // or absolute dynamic.
finished_span_dynamic_ = span_dynamic_;
span_dynamic_ = 0;
}
announce_element (Audio_element_info (span_dynamic_, span_events_[START]));
span_dynamic_->grow_dir_ = grow_dir_[START];
-
- if (!last_volume_initialized_ && !script_event_)
- {
- // No explicit dynamic script events have occurred yet, but there is
- // nevertheless a dynamic spanner. Initialize last_volume_ to a
- // value within the available range.
- span_events_[START]->origin ()->warning (_ ("(De)crescendo with unspecified starting volume in MIDI."));
- last_volume_ = equalize_volume (0.5);
- last_volume_initialized_ = true;
- }
}
if (script_event_
last_volume_
= absolute_->volume_ = equalize_volume (volume);
- last_volume_initialized_ = true;
}
Audio_element_info info (absolute_, script_event_);
announce_element (info);
}
- if (!last_volume_initialized_)
+ if (last_volume_ < 0)
{
absolute_ = new Audio_dynamic ();
last_volume_
= absolute_->volume_ = equalize_volume (0.71); // Backward compatible
- last_volume_initialized_ = true;
Audio_element_info info (absolute_, script_event_);
announce_element (info);
finished_span_dynamic_ = 0;
}
- if (absolute_ && absolute_->volume_ < 0)
+ if (absolute_)
{
- absolute_->volume_ = last_volume_;
- }
- else if (absolute_)
- {
- last_volume_ = absolute_->volume_;
- last_volume_initialized_ = true;
+ if (absolute_->volume_ < 0)
+ {
+ absolute_->volume_ = last_volume_;
+ }
+ else
+ {
+ last_volume_ = absolute_->volume_;
+ }
}
absolute_ = 0;
= span_events_[RIGHT] = 0;
}
-IMPLEMENT_TRANSLATOR_LISTENER (Dynamic_performer, decrescendo);
void
Dynamic_performer::listen_decrescendo (Stream_event *r)
{
grow_dir_[d] = SMALLER;
}
-IMPLEMENT_TRANSLATOR_LISTENER (Dynamic_performer, crescendo);
void
Dynamic_performer::listen_crescendo (Stream_event *r)
{
grow_dir_[d] = BIGGER;
}
-IMPLEMENT_TRANSLATOR_LISTENER (Dynamic_performer, absolute_dynamic);
void
Dynamic_performer::listen_absolute_dynamic (Stream_event *r)
{
script_event_ = r;
}
+void
+Dynamic_performer::boot ()
+{
+ ADD_LISTENER (Dynamic_performer, decrescendo);
+ ADD_LISTENER (Dynamic_performer, crescendo);
+ ADD_LISTENER (Dynamic_performer, absolute_dynamic);
+}
+
ADD_TRANSLATOR (Dynamic_performer,
/* doc */
"",