]> git.donarmstrong.com Git - lilypond.git/blob - midi2ly/mudela-voice.cc
release: 1.2.8
[lilypond.git] / midi2ly / mudela-voice.cc
1 //
2 // mudela-voice.cc -- implement Mudela_voice
3 //
4 // copyright 1997 Jan Nieuwenhuizen <janneke@gnu.org>
5
6 #include "string-convert.hh"
7 #include "midi2ly-global.hh"
8 #include "mudela-column.hh"
9 #include "mudela-item.hh"
10 #include "mudela-staff.hh"
11 #include "mudela-stream.hh"
12 #include "mudela-voice.hh"
13 #include "mudela-score.hh"
14
15 extern Mudela_score* mudela_score_l_g;
16
17 Mudela_voice::Mudela_voice (Mudela_staff* mudela_staff_l)
18 {
19   mudela_staff_l_ = mudela_staff_l;
20   last_item_l_ =0;
21 }
22
23 void
24 Mudela_voice::add_item (Mudela_item* mudela_item_l)
25 {
26   last_item_l_  = mudela_item_l;
27   mudela_item_l_list_.append (new Cons<Mudela_item> (mudela_item_l, 0));
28 }
29
30 /**
31    analyse pitches to determine clef.
32  */
33 String
34 Mudela_voice::get_clef () const
35 {
36   Mudela_note * n =0;
37
38   for (Cons<Mudela_item> *cp = mudela_item_l_list_.head_; !n && cp; cp = cp->next_)
39     {
40       n = dynamic_cast<Mudela_note*> (cp->car_);
41     }
42   
43   if (!n)
44     return "";
45
46   const int c0_pitch = 60;
47   int p = n->pitch_i_;
48
49   if (p < 56)
50     return "\\clef \"bass\";\n";
51   else if (p > 67)
52     return "\\clef \"treble\";\n";
53   else
54     return "";
55 }
56
57 static int const FAIRLY_LONG_VOICE_i = 6;
58
59 void
60 Mudela_voice::output (Mudela_stream& mudela_stream_r)
61 {
62   mudela_stream_r << "{ ";
63   if (mudela_item_l_list_.size_i () > FAIRLY_LONG_VOICE_i)
64     mudela_stream_r << '\n';
65
66
67   mudela_stream_r << get_clef () << '\n';
68   
69   int current_bar_i = 0;
70   Moment bar_mom = mudela_staff_l_->mudela_time_signature_l_->bar_mom ();
71
72   for (Cons<Mudela_item>* i = mudela_item_l_list_.head_; i; i = i->next_)
73     {
74       Moment at_mom = i->car_->mudela_column_l_->at_mom ();
75       int bar_i = (int) (at_mom / bar_mom) + 1;
76       if (bar_i > current_bar_i) 
77         {
78           if (current_bar_i) 
79             {
80               if (at_mom == Moment (bar_i - 1) * bar_mom)
81                 mudela_stream_r << "|";
82               mudela_stream_r << "\n% ";
83               mudela_stream_r << String_convert::i2dec_str (bar_i, 0, ' ');
84               mudela_stream_r << '\n';
85             }
86           LOGOUT (NORMAL_ver) << "[" << bar_i << "]" << flush; 
87           current_bar_i = bar_i;
88         }
89
90       mudela_stream_r << *i->car_;
91       if (Mudela_key* k = dynamic_cast<Mudela_key*> (i->car_))
92         mudela_staff_l_->mudela_key_l_ = mudela_score_l_g->mudela_key_l_ = k;
93     }
94
95   if (mudela_item_l_list_.size_i () > FAIRLY_LONG_VOICE_i)
96     mudela_stream_r << '\n';
97
98   mudela_stream_r << "} ";
99 }
100
101