+ if (finished_dynamic_tuples_.size () > 1)
+ {
+ Real start_volume = finished_dynamic_tuples_[0].audio_->volume_;
+ Real dv = finished_dynamic_tuples_.back ().audio_->volume_
+ - start_volume;
+ /*
+ urg.
+ Catch and fix the case of:
+
+ | |
+ x| x|
+ f cresc. -- -- -- -- -- pp
+
+ Actually, we should provide a non-displayed dynamic/volume setting,
+ to set volume to 'ff' just before the pp.
+ */
+ if (!dv || sign (dv) != finished_dir_)
+ {
+ // urg. 20%: about two volume steps
+ dv = (Real)finished_dir_ * 0.2;
+ if (!start_volume)
+ start_volume = finished_dynamic_tuples_.back ().audio_->volume_
+ - dv;
+ }
+ Moment start_mom = finished_dynamic_tuples_[0].mom_;
+ Moment dt = finished_dynamic_tuples_.back ().mom_ - start_mom;
+ for (vsize i = 0; i < finished_dynamic_tuples_.size (); i++)
+ {
+ Audio_dynamic_tuple *a = &finished_dynamic_tuples_[i];
+ Real volume = start_volume + dv * (Real) (a->mom_ - start_mom).main_part_
+ / (Real)dt.main_part_;
+ a->audio_->volume_ = volume;
+ }
+ finished_dynamic_tuples_.clear ();
+ }
+
+ if (audio_)