]> git.donarmstrong.com Git - lilypond.git/blob - lily/score-performer.cc
patch::: 0.0.75.jcn4: midi op
[lilypond.git] / lily / score-performer.cc
1 /*
2   score-performer.cc -- implement Score_performer
3
4   (c) 1996, 1997 Jan Nieuwenhuizen <jan@digicash.com>
5  */
6
7 #include <time.h>
8 #include "score-performer.hh"
9 #include "input-translator.hh"
10 #include "midi-def.hh"
11 #include "midi-item.hh"
12 #include "midi-stream.hh"
13 #include "string-convert.hh"
14 #include "debug.hh"
15 #include "main.hh"
16 #include "score.hh"
17 #include "source-file.hh"
18 #include "source.hh"
19
20 IMPLEMENT_IS_TYPE_B1(Score_performer,Performer_group_performer);
21 IMPLEMENT_STATIC_NAME(Score_performer);
22 ADD_THIS_PERFORMER(Score_performer);
23
24 Score_performer::Score_performer()
25 {
26     midi_stream_p_ = 0;
27     midi_l_ = 0;
28 }
29
30 Score_performer::~Score_performer()
31 {
32     delete midi_stream_p_;
33 }
34
35 Translator* 
36 Score_performer::ancestor_l( int l ) 
37
38     return Global_translator::ancestor_l( l );
39 }
40
41 int 
42 Score_performer::depth_i() const 
43
44     return Global_translator::depth_i();
45 }
46
47 void
48 Score_performer::finish()
49 {
50     *mlog << "MIDI output to " << midi_l_->outfile_str_ << " ..." << endl;    
51     *mlog << "tracks: ";
52     header();
53     Performer_group_performer::midi_output( midi_stream_p_ );
54     *mlog << endl;
55 }
56
57 Moment
58 Score_performer::get_mom() const
59 {
60     return now_mom_;
61 }
62
63 void
64 Score_performer::header()
65 {
66     int track_i = 0;
67     Midi_track midi_track( track_i );
68     
69     time_t t = time( 0 );
70
71     // perhaps multiple text events?
72     String str = String( "Creator: " ) + get_version_str() + "\n";
73
74     Midi_text creator( Midi_text::TEXT, str );
75     midi_track.add( Moment( 0 ), &creator );
76
77     str = "Generated, at ";
78     str += ctime( &t );
79     str = str.left_str( str.length_i() - 1 );
80     str += ",\n";
81     Midi_text generate( Midi_text::TEXT, str );
82     midi_track.add( Moment( 0 ), &generate );
83
84     str = "from musical definition: ";
85 #if 0    
86     Source_file* sourcefile_l = source_l_g->sourcefile_l( score_l_->defined_ch_C_ );
87     if ( sourcefile_l )
88         str += sourcefile_l->name_str();
89 #elif 1
90     str += score_l_->location_str();
91 #else
92     str += score_l_->
93 #endif
94     Midi_text from( Midi_text::TEXT, str );
95     midi_track.add( Moment( 0 ), &from );
96
97     // set track name
98     Midi_text track_name( Midi_text::TRACK_NAME, "Track " + String_convert::i2dec_str( 0, 0, '0' ) );
99     midi_track.add( Moment( 0 ), &track_name );
100
101     // ugh, to please lily when reparsing mi2mu output.
102     // lily currently barfs when no meter present.
103     /* are you sure? init is to 4/4 HWN */
104     Midi_time midi_time( 4, 4, 18 );
105     midi_track.add( Moment( 0.0 ), &midi_time );
106
107     *mlog << "[" << track_i << "]";
108     *midi_stream_p_  << midi_track;
109 }
110
111 void 
112 Score_performer::prepare( Moment m )
113 {
114     now_mom_ = m;
115 }
116
117 void 
118 Score_performer::process()
119 {
120     process_requests();
121     prev_mom_ = now_mom_;
122 }
123
124 void
125 Score_performer::set_score( Score* score_l )
126 {
127     /*
128      why's there no start() when there's a finish()?
129      let's misuse this for start()
130      */
131     Global_translator::set_score( score_l );
132     midi_l_ = score_l->midi_p_;
133 }
134
135 void
136 Score_performer::start()
137 {
138     int track_i = 1;
139     Performer_group_performer::set_track( midi_l_, track_i );
140
141     if ( midi_l_->outfile_str_ == "" )
142         midi_l_->outfile_str_ = default_out_fn + ".midi";
143     
144     midi_stream_p_ = new Midi_stream( midi_l_->outfile_str_, track_i, 384 );
145 }
146