]> git.donarmstrong.com Git - lilypond.git/blob - mi2mu/midi-event.cc
release: 0.0.62
[lilypond.git] / mi2mu / midi-event.cc
1 //
2 // midi-event.cc -- implement Midi_event
3 //
4 // copyright 1997 Jan Nieuwenhuizen <jan@digicash.com>
5
6 #include "mi2mu.hh"
7
8 Midi_event::Midi_event()
9 {
10 }
11
12 Moment
13 Midi_event::mom()
14 {
15         return Moment( 0 );
16 }
17
18 void
19 Midi_event::output_mudela( Lily_stream& lily_stream_r, bool command_mode_bo )
20 {
21         lily_stream_r << mudela_str( command_mode_bo ) << String( " " );
22 }
23
24 Midi_key::Midi_key( int accidentals_i, int minor_i )
25 {
26         accidentals_i_ = accidentals_i;
27         minor_i_ = minor_i;
28         if ( accidentals_i >= 0 )
29                 key_i_ = ( ( accidentals_i % 7 )[ "cgdaebf" ] - 'a' - 2 ) % 7;
30         else
31                 key_i_ = ( ( -accidentals_i % 7 )[ "cfbeadg" ] - 'a' - 2 ) % 7;
32 }
33
34 String
35 Midi_key::mudela_str( bool command_mode_bo )
36 {
37         String str = "\\key\\";
38         if ( !minor_i_ ) 
39                 str += String( (char)( ( key_i_ + 2 ) % 7 + 'A'  ) );
40         else // heu, -2: should be - 1 1/2: A -> fis
41                 str += String( (char)( ( key_i_ + 2 - 2 ) % 7 + 'a'  ) );
42 //      if ( !command_mode_bo )
43 //          str =  String( '\\' ) + str;
44         str = String( "%" ) + str + "\n"; // "\key\F" not supported yet...
45         return str;
46 }
47
48 String
49 Midi_key::notename_str( int pitch_i )
50 {
51         // this may seem very smart,
52         // but it-s only an excuse not to read a notename table
53
54         // major scale: do-do
55         // minor scale: la-la ( = + 5 )
56         static int notename_i_a[ 12 ] = { 0, 0, 1, 1, 2, 3, 3, 4, 4, 5, 5, 6 };
57         int notename_i = notename_i_a[ ( minor_i_ * 5 + pitch_i ) % 12 ];
58         
59         static int accidentals_i_a[ 12 ] = { 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0 };
60         int accidental_i = accidentals_i_a[ minor_i_ * 5 + pitch_i % 12 ];
61         if ( accidental_i && ( accidentals_i_ < 0 ) ) {
62                 accidental_i = - accidental_i;
63                 notename_i = ( notename_i + 1 ) % 7;
64         }
65
66         String notename_str = (char)( ( ( notename_i + 2 ) % 7 ) + 'a' );
67         while ( accidental_i-- > 0 )
68                 notename_str += "is";
69         accidental_i++;
70         while ( accidental_i++ < 0 )
71                 if ( ( notename_str == "a" ) || ( notename_str == "e" ) )
72                         notename_str += "s";
73                 else
74                         notename_str += "es";
75         accidental_i--;
76
77         String de_octavate_str = String( '\'', ( Midi_note::c0_pitch_i_c_ + 11 - pitch_i ) / 12 );
78         String octavate_str = String( '\'', ( pitch_i - Midi_note::c0_pitch_i_c_ ) / 12 );
79         return de_octavate_str + notename_str + octavate_str;
80 }
81
82 // statics Midi_note
83 /*
84  this switch can be used to write simple plets like 
85      c4*2/3 
86  as  
87      \plet{ 2/3 } c4 \plet{ 1/1 }
88  */
89 bool const Midi_note::simple_plet_b_s = true;
90
91 Midi_note::Midi_note( String name_str, Duration dur )
92 {
93         // do i want pitch too?
94         dur_ = dur;
95         name_str_ = name_str;
96 }
97
98 String
99 Midi_note::mudela_str( bool command_mode_bo )
100 {
101 //      assert( !command_mode_bo );
102         if ( simple_plet_b_s )
103                 return name_str_ + Duration_convert::dur2_str( dur_ );
104
105         //ugh
106         String str;
107         if ( dur_.plet_b() )
108                 str += String( "\\plet{ " )
109                         + String_convert::i2dec_str( dur_.plet_.iso_i_, 0, 0 )
110                         + "/"
111                         + String_convert::i2dec_str( dur_.plet_.type_i_, 0, 0 )
112                         + " } ";
113
114         str += name_str_;
115
116         Duration dur = dur_;
117         dur.set_plet( 1,1 );
118         str += Duration_convert::dur2_str( dur );
119
120         if ( dur_.plet_b() )
121                 str += String( " \\plet{ 1/1 }" );
122                 
123         return str;
124 }
125
126 Moment
127 Midi_note::mom()
128 {
129         return Duration_convert::dur2_mom( dur_ );
130 }
131
132 Midi_tempo::Midi_tempo( int useconds_per_4_i )
133 {
134         useconds_per_4_i_ = useconds_per_4_i;
135         seconds_per_1_f_ = (Real)useconds_per_4_i_ * 4 / 1e6;
136 }
137
138 String
139 Midi_tempo::mudela_str( bool command_mode_bo )
140 {
141 //      assert( command_mode_bo );
142         if ( !command_mode_bo )
143                 return "";
144         String str = "\\tempo 4:";
145         str += String( get_tempo_i( Moment( 1, 4 ) ) );
146         return str;
147 }
148
149 int 
150 Midi_tempo::useconds_per_4_i()
151 {
152         return useconds_per_4_i_;
153 }
154
155 int
156 Midi_tempo::get_tempo_i( Moment moment )
157 {
158         return Moment( 60 ) / moment / Moment( seconds_per_1_f_ );
159 }
160
161 Midi_text::Midi_text( Midi_text::Type type, String text_str )
162 {
163         type_ = type;
164         text_str_ = text_str;
165 }
166
167 String
168 Midi_text::mudela_str( bool command_mode_bo )
169 {
170         (void)command_mode_bo;
171         if ( !text_str_.length_i() 
172                 || ( text_str_.length_i() != (int)strlen( text_str_.ch_C() ) ) )
173                 return "";
174
175         return "% " + text_str_ + "\n\t";
176 }
177
178 Midi_time::Midi_time( int num_i, int den_i, int clocks_4_i, int count_32_i )
179         : sync_dur_( 8 )
180 {
181         sync_f_ = 1.0;
182         if ( count_32_i != 8 )
183                 warning( String( "#32 in quarter: " ) + String( count_32_i ));
184         num_i_ = num_i;
185         den_i_ = den_i;
186         clocks_1_i_ = clocks_4_i * 4; 
187 }
188
189 Moment
190 Midi_time::bar_mom()
191 {
192         return Moment( num_i_ ) * Duration_convert::dur2_mom( Duration( 1 << den_i_ ) );
193 }
194
195 int
196 Midi_time::clocks_1_i()
197 {
198         return clocks_1_i_;
199 }
200
201 int
202 Midi_time::den_i()
203 {
204         return den_i_;
205 }
206
207 int
208 Midi_time::num_i()
209 {
210         return num_i_;
211 }
212
213 String
214 Midi_time::mudela_str( bool command_mode_bo )
215 {
216         String str = "\\meter{ "
217                 + String( num_i_ ) + "/" + String( 1 << den_i_ ) 
218                 + " }";
219 //      if ( !command_mode_bo )
220 //          str =  String( '\\' ) + str;
221         return str;
222 }
223