2 This file is part of LilyPond, the GNU music typesetter.
4 Copyright (C) 1997--2011 Jan Nieuwenhuizen <janneke@gnu.org>
6 LilyPond is free software: you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation, either version 3 of the License, or
9 (at your option) any later version.
11 LilyPond is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with LilyPond. If not, see <http://www.gnu.org/licenses/>.
20 #include "audio-item.hh"
22 #include "midi-item.hh"
23 #include "audio-column.hh"
25 Audio_instrument::Audio_instrument (string instrument_string
)
27 str_
= instrument_string
;
36 Audio_item::get_column () const
41 Audio_item::Audio_item ()
46 Audio_note::Audio_note (Pitch p
, Moment m
, bool tie_event
, Pitch transposing
)
51 transposing_
= transposing
;
52 tie_event_
= tie_event
;
56 Audio_note::tie_to (Audio_note
*t
, Moment skip
)
59 Audio_note
*first
= t
;
62 // Add the skip to the tied note and the length of the appended note
63 // to the full duration of the tie...
64 first
->length_mom_
+= skip
+ length_mom_
;
68 Audio_key::Audio_key (int acc
, bool major
)
74 Audio_dynamic::Audio_dynamic ()
79 Audio_span_dynamic::Audio_span_dynamic ()
85 Audio_span_dynamic::add_absolute (Audio_dynamic
*d
)
88 dynamics_
.push_back (d
);
92 remap_grace_duration (Moment m
)
94 return Moment (m
.main_part_
+ Rational (9,40) * m
.grace_part_
,
99 moment_to_real (Moment m
)
101 return remap_grace_duration (m
).main_part_
.to_double ();
105 moment_to_ticks (Moment m
)
107 return int (moment_to_real (m
) * 384 * 4);
111 Audio_span_dynamic::render ()
113 if (dynamics_
.size () <= 1)
116 assert (dynamics_
[0]->volume_
>= 0);
118 while (dynamics_
.back ()->volume_
> 0
119 && dynamics_
.size () > 1
120 && sign (dynamics_
.back ()->volume_
- dynamics_
[0]->volume_
) != grow_dir_
)
122 dynamics_
.erase (dynamics_
.end () - 1);
125 if (dynamics_
.size () <= 1)
127 programming_error ("Impossible or ambiguous (de)crescendo in MIDI.");
131 Real delta_v
= grow_dir_
* 0.1;
133 Real start_v
= dynamics_
[0]->volume_
;
134 if (dynamics_
.back ()->volume_
< 0)
135 dynamics_
.back ()->volume_
= max (min (start_v
+ grow_dir_
* 0.25, 1.0), 0.1);
137 delta_v
= dynamics_
.back ()->volume_
- dynamics_
[0]->volume_
;
139 Moment start
= dynamics_
[0]->get_column ()->when ();
141 Real total_t
= moment_to_real (dynamics_
.back ()->get_column ()->when () - start
);
143 for (vsize i
= 1; i
< dynamics_
.size (); i
++)
145 Moment dt_moment
= dynamics_
[i
]->get_column ()->when ()
148 Real dt
= moment_to_real (dt_moment
);
150 Real v
= start_v
+ delta_v
* (dt
/ total_t
);
152 dynamics_
[i
]->volume_
= v
;
158 Audio_tempo::Audio_tempo (int per_minute_4
)
160 per_minute_4_
= per_minute_4
;
163 Audio_time_signature::Audio_time_signature (int beats
, int one_beat
)
166 one_beat_
= one_beat
;
169 Audio_text::Audio_text (Audio_text::Type type
, string text_string
)
171 text_string_
= text_string
;