]> git.donarmstrong.com Git - lilypond.git/blob - lily/audio-item.cc
75dc5917b1051af9c00d5dda3a89ae2a6e36d380
[lilypond.git] / lily / audio-item.cc
1 /*
2   audio-item.cc -- implement Audio items.
3
4   source file of the GNU LilyPond music typesetter
5
6   (c) 1997--2006 Jan Nieuwenhuizen <janneke@gnu.org>
7 */
8
9 #include "audio-item.hh"
10
11 #include "midi-item.hh"
12 #include "audio-column.hh"
13
14 Audio_instrument::Audio_instrument (string instrument_string)
15 {
16   str_ = instrument_string;
17 }
18
19 void
20 Audio_item::render ()
21 {
22 }
23
24 Audio_column *
25 Audio_item::get_column () const
26 {
27   return audio_column_;
28 }
29
30 Audio_item::Audio_item ()
31 {
32   audio_column_ = 0;
33 }
34
35 Audio_note::Audio_note (Pitch p, Moment m, bool tie_event, int transposing_i)
36 {
37   pitch_ = p;
38   length_mom_ = m;
39   tied_ = 0;
40   transposing_ = transposing_i;
41   tie_event_ = tie_event;
42 }
43
44 void
45 Audio_note::tie_to (Audio_note *t)
46 {
47   tied_ = t;
48   Audio_note *first = t;
49   while (first->tied_)
50     first = first->tied_;
51   first->length_mom_ += length_mom_;
52   length_mom_ = 0;
53 }
54
55 Audio_key::Audio_key (int acc, bool major)
56 {
57   accidentals_ = acc;
58   major_ = major;
59 }
60
61 Audio_dynamic::Audio_dynamic ()
62 {
63   volume_ = -1;
64 }
65
66 Audio_span_dynamic::Audio_span_dynamic ()
67 {
68   grow_dir_ = CENTER;
69 }
70
71 void
72 Audio_span_dynamic::add_absolute (Audio_dynamic *d)
73 {
74   assert (d);
75   dynamics_.push_back (d);
76 }
77
78 Moment
79 remap_grace_duration (Moment m)
80 {
81   return Moment (m.main_part_ + Rational (9,40) * m.grace_part_,
82                  Rational (0));
83 }
84
85 Real
86 moment_to_real (Moment m)
87 {
88   return remap_grace_duration (m).main_part_.to_double ();
89 }
90
91 int
92 moment_to_ticks (Moment m)
93 {
94   return int (moment_to_real (m) * 384 * 4);
95 }
96
97
98 void
99 Audio_span_dynamic::render ()
100 {
101   if (dynamics_.size () <= 1)
102     return ;
103
104   assert (dynamics_[0]->volume_ >= 0);
105
106   while  (dynamics_.back ()->volume_ > 0
107           && dynamics_.size () > 1
108           && sign (dynamics_.back ()->volume_ - dynamics_[0]->volume_) != grow_dir_)
109     {
110       dynamics_.erase (dynamics_.end () - 1);
111     }
112
113   if (dynamics_.size () <= 1)
114     {
115       programming_error ("(de)crescendo on items with specified volume.");
116       return ;
117     }
118   
119   Real delta_v = grow_dir_ * 0.1;
120   
121   Real start_v = dynamics_[0]->volume_;
122   if (dynamics_.back ()->volume_ < 0)
123     dynamics_.back ()->volume_ = max (min (start_v + grow_dir_ * 0.25, 1.0), 0.0);
124
125   delta_v = dynamics_.back ()->volume_ - dynamics_[0]->volume_;
126
127   Moment start = dynamics_[0]->get_column ()->when ();
128
129   Real total_t = moment_to_real (dynamics_.back ()->get_column ()->when () - start);
130   
131   for (vsize i = 1; i < dynamics_.size(); i ++)
132     {
133       Moment dt_moment = dynamics_[i]->get_column ()->when ()
134         - start;
135
136       Real dt =  moment_to_real (dt_moment);
137       
138       Real v = start_v + delta_v *  (dt / total_t);
139
140       dynamics_[i]->volume_ = v;        
141     }
142 }
143
144
145
146 Audio_tempo::Audio_tempo (int per_minute_4)
147 {
148   per_minute_4_ = per_minute_4;
149 }
150
151 Audio_time_signature::Audio_time_signature (int beats, int one_beat)
152 {
153   beats_ = beats;
154   one_beat_ = one_beat;
155 }
156
157 Audio_text::Audio_text (Audio_text::Type type, string text_string)
158 {
159   text_string_ = text_string;
160   type_ = type;
161 }
162