+ audio_ = new Audio_dynamic (0);
+ Audio_element_info info (audio_, span_events_[START]
+ ? span_events_[START]
+ : span_events_[STOP]);
+ announce_element (info);
+ Audio_dynamic_tuple a = { audio_, now_mom () };
+ dynamic_tuples_.push (a);
+ }
+
+ if (span_events_[STOP])
+ {
+ if (!span_start_event_)
+ {
+ span_events_[STOP]->origin ()->warning (_ ("can't find start of (de)crescendo"));
+ span_events_[STOP] = 0;
+ }
+ else
+ {
+ finished_dir_ = dir_;
+ finished_dynamic_tuples_ = dynamic_tuples_;
+ }
+ dynamic_tuples_.clear ();
+ span_start_event_ = 0;
+ }
+
+ if (span_events_[START])
+ {
+ dir_ = (span_events_[START]->is_mus_type ("crescendo-event"))
+ ? RIGHT : LEFT;
+ span_start_event_ = span_events_[START];
+
+ dynamic_tuples_.clear ();
+ Audio_dynamic_tuple a = { audio_, now_mom () };
+ dynamic_tuples_.push (a);
+ }
+
+ if (span_events_[STOP])
+ {
+ finished_dynamic_tuples_.top ().audio_->volume_ = last_volume_;
+ }
+
+ if (span_events_[START])
+ {
+ dynamic_tuples_[0].audio_->volume_ = last_volume_;
+ }
+
+ span_events_[START] = 0;
+ span_events_[STOP] = 0;
+}
+
+void
+Span_dynamic_performer::stop_translation_timestep ()
+{
+ if (finished_dynamic_tuples_.size () > 1)
+ {
+ Real start_volume = finished_dynamic_tuples_[0].audio_->volume_;
+ Real dv = finished_dynamic_tuples_.top ().audio_->volume_