]> git.donarmstrong.com Git - lilypond.git/blob - lily/staff-performer.cc
a1efbfcebcfcab1cab3427d989c542a1b8c7f07a
[lilypond.git] / lily / staff-performer.cc
1 /*
2   staff-performer.cc -- implement Staff_performer
3
4   source file of the GNU LilyPond music typesetter
5
6   (c) 1997 Jan Nieuwenhuizen <jan@digicash.com>
7  */
8
9
10 #include "staff-performer.hh"
11 #include "translator.hh"
12 #include "input-translator.hh"
13 #include "debug.hh"
14 #include "midi-def.hh"
15 #include "audio-column.hh"
16 #include "audio-item.hh"
17 #include "midi-item.hh"
18 #include "midi-stream.hh"
19 #include "string.hh"
20 #include "string-convert.hh"
21
22
23 IMPLEMENT_IS_TYPE_B1(Staff_performer,Performer_group_performer);
24 ADD_THIS_PERFORMER(Staff_performer);
25
26 Staff_performer::Staff_performer()
27 {
28     midi_track_p_ = new Midi_track;
29 }
30
31 Staff_performer::~Staff_performer()
32 {
33     delete midi_track_p_;
34 }
35
36 void
37 Staff_performer::do_creation_processing()
38 {
39 }
40
41 void
42 Staff_performer::do_removal_processing()
43 {
44     header();
45
46     Moment midi_mom = 0;
47     for ( PCursor<Audio_item*> i( audio_item_p_list_ ); i.ok(); i++ ) {
48         Audio_item* l = *i;
49         Moment mom = l->audio_column_l_->at_mom();
50         Moment delta_t = mom - midi_mom_ ;
51         midi_mom_ += delta_t;
52         Midi_item* p = l->midi_item_p();
53         p->channel_i_ = track_i_;
54         midi_track_p_->add( delta_t, p );
55         delete p;
56     }
57
58     Performer::play( midi_track_p_ );
59 }
60
61 void
62 Staff_performer::header()
63 {
64     // set track name
65     Midi_text track_name( Midi_text::TRACK_NAME, instrument_str() );
66     midi_track_p_->add( Moment( 0 ), &track_name );
67
68     // set instrument description
69     Midi_text instrument_name( Midi_text::INSTRUMENT_NAME, instrument_str() );
70     midi_track_p_->add( Moment( 0 ), &instrument_name );
71
72     // set instrument :-)
73     // lieve wendy, nu heb je mijn track_i_ / get_staff_i weggehaald...
74     // zie ook note-performer: ugh
75     // ugh, need to know channel (===track===staff) too
76     int channel_i = track_i_;
77     Midi_instrument instrument( channel_i, instrument_str() );
78     midi_track_p_->add( Moment( 0 ), &instrument );
79
80     Midi_tempo midi_tempo( get_tempo_i() );
81     midi_track_p_->add( Moment( 0 ), &midi_tempo );
82 }
83
84 String 
85 Staff_performer::instrument_str() 
86
87     return Translator::id_str_; 
88 }
89
90 void 
91 Staff_performer::play( Audio_item* p )
92 {
93     audio_item_p_list_.bottom().add( p );
94     Performer::play( p );
95 }
96
97 // huh?
98 void 
99 Staff_performer::play( Midi_item* p )
100 {
101     Performer::play( p );
102 }
103
104
105 //<ugh>
106 int
107 Staff_performer::get_track_i() const
108 {
109     return track_i_;
110 }
111
112 void
113 Staff_performer::set_track( int& track_i_r )
114 {
115     track_i_ = track_i_r++;
116 }
117 //</ugh>
118