]> git.donarmstrong.com Git - lilypond.git/blob - lily/audio-item.cc
da4bc4ff6e37b543f6132b3e0fc87dd4504353e4
[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--2007 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, Pitch transposing)
36 {
37   pitch_ = p;
38   length_mom_ = m;
39   tied_ = 0;
40   transposing_ = transposing;
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 void
98 Audio_span_dynamic::render ()
99 {
100   if (dynamics_.size () <= 1)
101     return ;
102
103   assert (dynamics_[0]->volume_ >= 0);
104
105   while  (dynamics_.back ()->volume_ > 0
106           && dynamics_.size () > 1
107           && sign (dynamics_.back ()->volume_ - dynamics_[0]->volume_) != grow_dir_)
108     {
109       dynamics_.erase (dynamics_.end () - 1);
110     }
111
112   if (dynamics_.size () <= 1)
113     {
114       programming_error ("(de)crescendo on items with specified volume.");
115       return ;
116     }
117   
118   Real delta_v = grow_dir_ * 0.1;
119   
120   Real start_v = dynamics_[0]->volume_;
121   if (dynamics_.back ()->volume_ < 0)
122     dynamics_.back ()->volume_ = max (min (start_v + grow_dir_ * 0.25, 1.0), 0.1);
123
124   delta_v = dynamics_.back ()->volume_ - dynamics_[0]->volume_;
125
126   Moment start = dynamics_[0]->get_column ()->when ();
127
128   Real total_t = moment_to_real (dynamics_.back ()->get_column ()->when () - start);
129   
130   for (vsize i = 1; i < dynamics_.size (); i ++)
131     {
132       Moment dt_moment = dynamics_[i]->get_column ()->when ()
133         - start;
134
135       Real dt =  moment_to_real (dt_moment);
136       
137       Real v = start_v + delta_v *  (dt / total_t);
138
139       dynamics_[i]->volume_ = v;        
140     }
141 }
142
143
144
145 Audio_tempo::Audio_tempo (int per_minute_4)
146 {
147   per_minute_4_ = per_minute_4;
148 }
149
150 Audio_time_signature::Audio_time_signature (int beats, int one_beat)
151 {
152   beats_ = beats;
153   one_beat_ = one_beat;
154 }
155
156 Audio_text::Audio_text (Audio_text::Type type, string text_string)
157 {
158   text_string_ = text_string;
159   type_ = type;
160 }
161