]> git.donarmstrong.com Git - lilypond.git/blob - lily/midi-output.cc
release: 0.0.44
[lilypond.git] / lily / midi-output.cc
1 /*
2   midioutput.cc -- implement Midi_output
3
4   source file of the LilyPond music typesetter
5
6   (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>, Jan Nieuwenhuizen <jan@digicash.com> 
7 */
8
9 // "" huh?
10 #include "time.h"
11 #include "main.hh"
12 #include "source.hh"
13 #include "proto.hh"
14 #include "plist.hh"
15 #include "string.hh"
16 #include "string-convert.hh"
17 #include "debug.hh"
18 #include "score.hh"
19 #include "staff.hh"
20 #include "main.hh"
21 #include "midi-stream.hh"
22 #include "midi-def.hh"
23 #include "midi-output.hh"
24 #include "midi-walker.hh"
25 #include "midi-item.hh"
26 #include "staff-column.hh"
27 #include "musical-request.hh"
28
29
30 Midi_output::Midi_output(Score* score_l, Midi_def* midi_l )
31 {
32     midi_l_ = midi_l;
33     score_l_ = score_l;
34
35     Midi_stream midi_stream(midi_l->outfile_str_, 
36         // don-t forget: extra track 0 for tempo/copyright stuff...
37         score_l_->staffs_.size() + 1, 
38         384 );
39     midi_stream_l_ = &midi_stream;
40
41     header();
42     staffs();
43 }
44
45 void
46 Midi_output::do_staff(Staff*st_l,int track_i)
47 {
48     Midi_track midi_track( track_i );
49
50     // set track name
51     Midi_text track_name( Midi_text::TRACK_NAME, "Track " + String_convert::i2dec_str( track_i, 0, '0' ) );
52     midi_track.add( Moment( 0 ), &track_name );
53
54     // set instrument :-)
55     Midi_text instrument_name( Midi_text::INSTRUMENT_NAME, "piano" );
56     midi_track.add( Moment( 0 ), &instrument_name );
57
58     // set key, help, where to get key, where to get major/minor?
59     int accidentals_i = 0;
60     int minor_i = 0;
61
62
63     Midi_key midi_key( accidentals_i, minor_i ); 
64     midi_track.add( Moment( 0 ), &midi_key );
65
66     Midi_tempo midi_tempo( midi_l_->get_tempo_i( Moment( 1, 4 ) ) );
67     midi_track.add( Moment( 0 ), &midi_tempo );
68
69     Midi_time midi_time( Midi_def::num_i_s, Midi_def::den_i_s, 18 );
70     midi_track.add( Moment( 0 ), &midi_time );
71
72     for (Midi_walker w (st_l, &midi_track); w.ok(); w++)
73         w.process_requests();
74
75     *midi_stream_l_  << midi_track;
76 }  
77
78 void
79 Midi_output::header()
80 {
81     Midi_track midi_track( 0 );
82     
83     time_t t = time( 0 );
84
85     // perhaps multiple text events?
86     String str = String( "Creator: " ) + get_version_str() + "\n";
87
88     Midi_text creator( Midi_text::TEXT, str );
89     midi_track.add( Moment( 0 ), &creator );
90
91     str = "Generated, at ";
92     str += ctime( &t );
93     str = str.left_str( str.length_i() - 1 );
94     str += ",\n";
95     Midi_text generate( Midi_text::TEXT, str );
96     midi_track.add( Moment( 0 ), &generate );
97     Source_file* sourcefile_l = source_l_g->sourcefile_l( score_l_->defined_ch_C_ );
98     if ( sourcefile_l ) {
99         str = "from musical definition: " 
100             + sourcefile_l->file_line_no_str(score_l_->defined_ch_C_);
101
102     }
103     Midi_text from( Midi_text::TEXT, str );
104     midi_track.add( Moment( 0 ), &from );
105
106     // set track name
107     Midi_text track_name( Midi_text::TRACK_NAME, "Track " + String_convert::i2dec_str( 0, 0, '0' ) );
108     midi_track.add( Moment( 0 ), &track_name );
109     *midi_stream_l_  << midi_track;
110 }
111
112 void
113 Midi_output::staffs()
114 {
115     int track_i = 1;
116     for (iter_top(score_l_->staffs_,i); i.ok(); i++)
117         do_staff(i, track_i++);
118 }
119